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), zNnieujemnymi iMdodatnimi.Nmoż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ą
Mlinie, 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 Ni 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 = 6wyniki dwóch egzekucjach programu może być
VVVVVV
@@@@@@
@@ @@@
@ @@
@
lub
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Podobnie N = 5, M = 7moż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.