Цель этой головоломки состоит в том, чтобы взять колоду из 52 карт и перемешать ее, чтобы каждая карта находилась в случайном положении.
Данный:
- Массив
deck
из 52 различных целых чисел, представляющих карты. При запускеdeck
содержит ровно по одной каждой карточке в каком-то неизвестном порядке. - Функция,
int rand(min, max)
которая возвращает случайное целое число между целыми числамиmin
иmax
включительно. Вы можете предположить, что эта функция действительно случайна. - Функция,
void swap(x, y)
которая меняет две карты в колоде. Если вы позвонитеswap(x, y)
, карты на местахx
иy
поменяются местами.
Когда:
- Программа вызывает
shuffle()
(или,shuffle(deck)
или какdeck.shuffle()
вам нравится запускать вашу реализацию),
Потом:
deck
должен содержать ровно одну каждую карту в совершенно случайном порядке.
Поймать:
Вы не можете объявить какие-либо переменные. Вызовите swap
и rand
сколько угодно, но вы не можете объявить свои собственные переменные. Это включает в себя for
счетчики циклов - даже неявные, как в foreach
.
Разъяснения:
- Вы можете изменить мелкие детали в соответствии с выбранным вами языком. Например, вы можете написать
swap
для переключения двух целых чисел по ссылке. Изменения должны быть сделаны, чтобы это работало с вашим языком, а не чтобы облегчить задачу. deck
может быть глобальной переменной, или вы можете принять ее в качестве параметра.- Вы можете делать с содержимым все, что хотите
deck
, но не можете изменять его длину. - Ваши карты могут быть пронумерованы 0-51, 1-52 или как угодно.
- Вы можете написать это на любом языке, но без обмана с помощью встроенной
shuffle
функции вашего языка . - Да, вы можете написать одну и ту же строку 52 раза. Никто не будет впечатлен.
- Время выполнения не имеет значения, но истинная случайность имеет значение.
- Это на самом деле не гольф-код, но вы можете минимизировать / запутать ваш код.
Редактировать: код Boilerplate и визуализатор
Если вы использовали .NET или JavaScript, вот несколько тестовых кодов, которые вам могут пригодиться:
JavaScript:
- Быстрый и грязный визуализатор JavaScript с источником CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Запускаемая версия (просто вставьте в свою
shuffle()
функцию): http://jsfiddle.net/4zxjmy42/
C #:
- Визуализатор ASP.NET с кодом C #: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Заглушка с только
swap
иrand
полезными методами: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Этот код сортирует и перетасовывает колоду несколько тысяч раз и выполняет некоторое базовое тестирование работоспособности: для каждого перемешивания он проверяет, что в колоде находится ровно 52 карты без повторов. Затем визуализатор отображает частоту каждой карты в каждом месте колоды, отображая тепловую карту в оттенках серого.
Вывод визуализатора должен выглядеть как снег без видимого рисунка. Очевидно, что это не может доказать истинную случайность, но это быстрый и простой способ выборочной проверки. Я рекомендую использовать его или что-то подобное, потому что определенные ошибки в алгоритме тасования приводят к очень узнаваемым паттернам в выходных данных. Вот пример вывода из двух реализаций, одна с общим недостатком:
Неправильная версия частично перетасовывает колоду, поэтому может хорошо выглядеть, если вы изучили массив вручную. Визуализатор позволяет легче заметить шаблон.
deck
себя.
swap
вам нравится, при условии, что она выполняет свое основное назначение. Одна из причин, по которой я сделал что- swap
то, было то, что люди могли относиться к нему как к «магии» и сосредоточиться на главной проблеме, не беспокоясь о том, чтобы она работала на выбранном ими языке. Вы можете сделать это или написать свой swap
, это зависит от вас.