Завдання цієї головоломки - взяти колоду з 52 карт і перемістити її так, щоб кожна картка опинилася у випадковому положенні.
Подано:
- Масив
deck
із 52 різних цілих чисел, що представляють карти. Коли ви почнете,deck
містить точно одну з кожної картки в якомусь невідомому порядку. - Функція,
int rand(min, max)
яка повертає випадкове ціле число між intsmin
таmax
inclusive. Можна припустити, що ця функція справді випадкова. - Функція,
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 рази. Ніхто не буде вражений.
- Час виконання не має значення, але справжня випадковість має значення.
- Це насправді не гольф коду, але сміливо мінімізуйте / притуплюйте код.
Редагувати: код та візуалізатор
Якщо ви використовували .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
, це залежить від вас.