Еще одна проблема, связанная с нашим внутренним игрой в гольф ... на этот раз во время каникул в прошлом году.
ПРОБЛЕМА
Энди, Барб, Карл, Диди, Эрл и Фрэн покупают друг другу подарки. Нарисуйте имена для обмена подарками.
- Каждый человек покупает один подарок и получает один подарок.
- Никто не покупает их собственный подарок.
- Многократный запуск решения должен давать разные результаты (пара даритель-получатель не должна быть предсказуемой или идентичной от прогона к прогону).
ВХОД
Никто.
ВЫХОД
Отформатирован как в этом примере:
Энди покупает для Барб
Барб покупает для Карл
Карл покупает для Диди
Диди покупает для Эрл
Эрл покупает для Фран
Фран покупает для Энди
Ответы:
J, 57
например
источник
с99 - 252 символа
Незначительное улучшение благодаря использованию циклического характера перестановки. Эта версия всегда строит стратегию покупки в форме петли, поэтому она менее случайна, чем предыдущая (271 символьная) версия, но я считаю, что она все еще соответствует спецификации.
Требуется платформа, которая работает
/dev/random
. Я должен быть в состоянии отбросить около 8, пропуская\0
s в большой строке, но мой libc, похоже, не имеет дело со%4s
спецификаторами печати, как написано на странице руководства.Перестановка плохая, но при таком подходе мне не нужно проверять условия «Foo покупает для Foo» .
Удобочитаемый:
источник
Windows PowerShell, 83
История:
$i
будет воссоздан каждый раз.$_
в строку, чтобы сохранить+
.источник
Хаскелл,
241189 знаковПолностью случайный вывод (который все еще удовлетворяет спецификации).
Это генерирует все перестановки в списке имен, выбирает одно случайным образом (я думаю, что это самый короткий способ в Хаскелле перетасовать список - если у кого-то есть что-то меньшее, я был бы признателен), а затем каждый человек затем покупает подарок для следующего человека в списке.
источник
permutations$words"Andy Barb Carl Didi Earl Fran"
и некоторые другие уловки, которые я попробовал в своей улучшенной версии. Я забыл, чтоpermutations
это не входит в 98List
, поэтому вы должны использовать длинное имя. Посмотри на это.r=tail.cycle
. и чем это встроить.main=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 символовтесты
"AndyBarbCarlDidiEarlFran"4/
, обновил и получил 7 символов меньше;9rand
это более случайный, чем мой6rand*
источник
"AndyBarbCarlDidiEarlFran"4/
6rand*
-0=rand
или, возможно;9rand
, предпочтительнее. Ибо петля{.n+\' buys for '}%(
короче ..6rand*
потому что думал, что он одинаково рандомизирует массив из 6 элементов (я думаю, что я ошибался, поскольку;9rand
выглядит действительно случайным, чем мой)Japt -R, 41 байт
-2 байта благодаря @Oliver!
Попробуй!
Это подход, который я выбрал на высоком уровне:
У меня есть небольшая история с этой проблемой, так как я создал программу «секретный Санта» для моей работы много лет назад. В итоге мы попросили нескольких соискателей проработать это :)
источник
ã
не возвращает пару, которая связывает первый с последним элементом. Я работаю над тем, чтобы заставить это работать, но подумал, что дам вам знать. Спасибо еще раз, хотя! ethproductions.github.io/japt/..."q"
в.ö("q")
сделайПитон - 118 символов
Питон - 120 символов
источник
R - 85 символов
источник
Питон - 154 символа
источник
map
вызываетstr.__eq__
каждую пару соответствующих значений в L и M, и цикл продолжается до тех пор, пока ни одно из них не станет истинным.D: 233 персонажа
Более разборчиво:
источник
Питон (175)
источник
Схема, 173
Дает одно из двух решений.
источник
C #,
210183 символовКучи по шаблону :(
Это решение не является абсолютно случайным - всегда есть один или несколько «циклов» людей, например, A-> C-> E-> A, и смещения всегда одинаковы в циклах. Однако невозможно предсказать вывод конкретного прогона, если у вас нет части этого вывода.
источник
var n="Andy Barb Carl Didi Earl Fran".Split()
? Сохраняет 16 байтов. Вы можете опустить аргументMain()
, который сохраняет еще 9 байтов. И вы можете объединить объявлениеc
иi
:int c,i=...;for(c=0;...
что сохраняет еще два.Рубин - 89 символов
Выход:
источник
map
вместоeach
.MathGolf , 41 байт
Попробуйте онлайн!
объяснение
Это не гарантирует создание каждого случая с равной вероятностью, но это дает разные результаты при каждом прогоне. Один байт можно было бы удалить, если бы у меня был оператор случайного порядка, но это на другой день.
источник