Zasada szuflady mówi, że
Jeśli N przedmiotów zostanie umieszczonych w skrzynkach M , gdzie N > M , to co najmniej jedno pudełko musi zawierać więcej niż jeden przedmiot.
Dla wielu ta zasada ma szczególny status w porównaniu do innych wypowiedzi matematycznych. Jak napisał EW Dijkstra ,
Otacza go jakaś tajemnica. Dowody używania tego są często uważane za coś wyjątkowego, coś szczególnie genialnego.
Wyzwanie
Celem tego wyzwania jest zilustrowanie zasady szuflady przy użyciu reprezentacji artystycznych ASCII. Konkretnie:
- Weź jako dane wejściowe
N
(liczbę przedmiotów) iM
(liczbę pól), zN
nieujemnymi iM
dodatnimi.N
może być mniejszy niżM
(nawet jeśli zasada nie ma zastosowania w takim przypadku). - Losowo wybierz jedno z możliwych przypisań przedmiotów do skrzynek. Każde zadanie powinno mieć niezerowe prawdopodobieństwo wybrania.
Utwórz reprezentację artystyczną zadania ASCII w następujący sposób:
- Istnieją
M
linie, każda odpowiadająca pudełku. - Każda linia zaczyna się od znaku spacji, na przykład
|
. - Po tym znaku znajduje się inny znak niebiałej spacji, taki jak
#
powtórzony tyle razy, ile jest elementów w tym polu.
- Istnieją
Rozważmy na przykład N = 8
, M = 5
. Jeśli wybrany assigment elementów do pudełka jest 4
, 1
, 0
, 3
, 0
, reprezentacja jest
|####
|#
|
|###
|
Może to dać inny przebieg (skutkujący innym przypisaniem) tego samego programu
|#
|##
|#
|#
|###
Istnieje pewna elastyczność w zakresie reprezentacji; patrz poniżej.
Szczegółowe zasady
Kod powinien teoretycznie działać na żadnej wartości z N
i M
. W praktyce może być ograniczony wielkością pamięci lub ograniczeniami typu danych.
Ponieważ obserwacja wyniku nie jest wystarczająca do ustalenia, czy wszystkie przypisania mają niezerowe prawdopodobieństwo , każde przesłanie powinno wyjaśnić, w jaki sposób kod to osiąga, jeśli nie jest to oczywiste.
Dozwolone są następujące warianty reprezentacji :
- Można wybrać dowolną parę różnych, niebiałych znaków. Muszą być spójne we wszystkich wykonaniach programu.
- Dopuszczalne są obroty o 90 stopni. Ponownie wybór musi być spójny.
- Dozwolone są końcowe lub wiodące białe znaki.
Jako przykład z innego formatu reprezentacji, dla N = 15
, M = 6
wyniki dwóch egzekucjach programu może być
VVVVVV
@@@@@@
@@ @@@
@ @@
@
lub
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Podobnie N = 5
, M = 7
może dawać, stosując kolejną wersję reprezentacji
*
* * * *
UUUUUUU
lub
*** **
UUUUUUU
lub
*
* *
* *
UUUUUUU
Zwróć uwagę, że zasada nie ma zastosowania w tym przypadku, ponieważ N
< M
.
Główne zasady
Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
Dane wejściowe można przyjmować dowolnymi rozsądnymi środkami ; i w dowolnym formacie, takim jak tablica dwóch liczb lub dwóch różnych ciągów.
Środki wyjściowe i format są również elastyczne. Na przykład wynikiem może być lista ciągów lub ciąg znaków z nowymi liniami; zwrócone jako argument wyjściowy funkcji lub wyświetlone w STDOUT. W tym drugim przypadku nie trzeba martwić się o zawijanie linii spowodowane ograniczoną szerokością wyświetlacza.
Najkrótszy kod w bajtach wygrywa.