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
deckz 52 różnych liczb całkowitych reprezentujących karty. Po uruchomieniudeckzawiera dokładnie jedną kartę w nieznanej kolejności. - Funkcja,
int rand(min, max)która zwraca losową liczbę całkowitą między liczbami całkowitymiminimaxwłą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 pozycjachxiyzamieniają się miejscami.
Gdy:
- Wywołania programu
shuffle()(alboshuffle(deck)albodeck.shuffle()albo jednak implementacja lubi działać),
Następnie:
deckpowinien zawierać dokładnie jedną z każdej karty w idealnie losowej kolejności.
The Catch:
Nie możesz zadeklarować żadnych zmiennych. Dzwoń swapi randile chcesz, ale nie możesz zadeklarować własnych zmiennych. Obejmuje to forliczniki 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ć,
swapaby 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. deckmoż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
shufflefunkcji 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
swapirandnarzę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.
decksam.
swap, pod warunkiem, że spełnia ona swój podstawowy cel. Jednym z powodów, dla których stworzyłem swapdany 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.