Celem tej układanki jest wzięcie talii 52 kart i przetasowanie jej tak, aby każda karta znajdowała się w losowej pozycji.
Dany:
- Tablica złożona
deck
z 52 różnych liczb całkowitych reprezentujących karty. Po uruchomieniudeck
zawiera dokładnie jedną kartę w nieznanej kolejności. - Funkcja,
int rand(min, max)
która zwraca losową liczbę całkowitą między liczbami całkowitymimin
imax
włącznie. Możesz założyć, że ta funkcja jest naprawdę losowa. - Funkcja,
void swap(x, y)
która zamienia dwie karty w talii. Jeśli zadzwoniszswap(x, y)
, karty na pozycjachx
iy
zamieniają się miejscami.
Gdy:
- Wywołania programu
shuffle()
(alboshuffle(deck)
albodeck.shuffle()
albo jednak implementacja lubi działać),
Następnie:
deck
powinien zawierać dokładnie jedną z każdej karty w idealnie losowej kolejności.
The Catch:
Nie możesz zadeklarować żadnych zmiennych. Dzwoń swap
i rand
ile chcesz, ale nie możesz zadeklarować własnych zmiennych. Obejmuje to for
liczniki pętli - nawet niejawne, takie jak w foreach
.
Wyjaśnienia:
- Możesz zmienić drobne szczegóły w celu dopasowania do wybranego języka. Na przykład możesz napisać,
swap
aby zamienić dwie liczby całkowite przez odniesienie. Zmiany powinny polegać na ułatwieniu pracy z Twoim językiem, a nie na ułatwieniu układanki. deck
może być zmienną globalną lub możesz przyjąć ją jako parametr.- Możesz zrobić wszystko, co chcesz
deck
, ale nie możesz zmienić jego długości. - Twoje karty mogą mieć numery 0-51, 1-52 lub cokolwiek innego.
- Możesz napisać to w dowolnym języku, ale bez oszustwa dzięki wbudowanej
shuffle
funkcji języka . - Tak, możesz napisać tę samą linię 52 razy. Nikt nie będzie pod wrażeniem.
- Czas wykonania nie ma znaczenia, ale prawdziwa przypadkowość ma znaczenie.
- To nie jest tak naprawdę kod golfowy, ale możesz zminimalizować / zaciemnić kod.
Edycja: Kod Boilerplate i wizualizator
Jeśli korzystasz z .NET lub JavaScript, oto kod testowy, który może Ci się przydać:
JavaScript:
- Szybki i brudny wizualizator JavaScript ze źródłem CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Wersja do uruchomienia (wystarczy wkleić w swojej
shuffle()
funkcji): http://jsfiddle.net/4zxjmy42/
DO#:
- Wizualizator ASP.NET z C # codebehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub za pomocą tylko
swap
irand
narzędziowych metod: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Ten kod sortuje i tasuje talię kilka tysięcy razy i wykonuje podstawowe testy poprawności poczytalności: Dla każdego losowania sprawdza, czy w talii są dokładnie 52 karty bez powtórzeń. Następnie wizualizator wykreśla częstotliwość każdej karty kończącej się w każdym miejscu w talii, wyświetlając mapę cieplną w skali szarości.
Wyjście wizualizatora powinno wyglądać jak śnieg bez widocznego wzoru. Oczywiście nie może udowodnić prawdziwej przypadkowości, ale jest to szybki i łatwy sposób sprawdzenia na miejscu. Polecam użycie tego lub czegoś podobnego, ponieważ pewne błędy w algorytmie tasowania prowadzą do bardzo rozpoznawalnych wzorców na wyjściu. Oto przykład danych wyjściowych z dwóch implementacji, jednej ze wspólną wadą:
Błędna wersja częściowo tasuje talię, więc może wyglądać dobrze, jeśli sprawdzisz tablicę ręcznie. Wizualizator ułatwia zauważenie wzoru.
deck
sam.
swap
, pod warunkiem, że spełnia ona swój podstawowy cel. Jednym z powodów, dla których stworzyłem swap
dany artykuł, było to, że ludzie mogli traktować go jako „magię” i skoncentrować się na głównym problemie, nie martwiąc się o to, że działa w wybranym przez siebie języku. Możesz to zrobić lub napisać własne swap
, to zależy od Ciebie.