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