Код Гольф: смешайте орехи, чтобы ни один из них не соприкасался

16

Входные данные:

Ввод - это рандомизированный массив орехов (на вашем языке), возможные орехи следуют. Ваша программа должна иметь способ представления каждого вида орехов, таких как целочисленный код. Программа должна быть в состоянии обрабатывать любой размер массива любой конфигурации орехов.

Возможные орехи:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

Выход:

Выходными данными должен быть массив, отсортированный таким образом, чтобы не было смежных гаек одного и того же вида. Если это невозможно, на выходе должен быть пустой массив.

Пример ввода (упрощенно):

["walnut", "walnut", "pistachio"]

Пример вывода:

["walnut", "pistachio", "walnut"]

Решения могут не просто перемешать массив, пока он не станет уникальным случайно. Используемый сорт должен быть детерминированным

Смесь орехов?  Я вижу два миндаля трогательно!

Томас Диньян
источник
4
«Ваша программа должна иметь способ представления каждого вида орехов, таких как целочисленный код», почему это так? - «может не просто перетасовать массив, пока он случайно не станет уникальным. Используемый тип сортировки должен быть детерминированным», перестановка все еще может быть детерминированной. Вы просто хотите ограничить время программы?
перестал поворачиваться против часовой стрелки с
1
Я должен согласиться с @leftaroundabout о запрете конкретного алгоритма глупо без очень веской причины. Одна из самых полезных вещей в таких играх с кодом - это именно то, что нужно применять.
dmckee
@ dmckee, я думаю, что требование, чтобы алгоритм был детерминированным, является разумным - если ГСЧ неисправен или вход довольно длинный, недетерминированное решение может не завершиться.
Boothby
@boothby. Мех. Я физик элементарных частиц. Монте-Карло сам по себе является важным инструментом. Более того, если я выберу фиксированный PRNG и фиксированное начальное число, это будет детерминированным.
dmckee
1
Я думаю, что нашел пример, который имеет несколько решений, но может привести к тому, что некоторые ответы не смогут найти какое-либо из них. Могу ли я добавить это? (5,4,4,3,3,2) perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2) может привести к их отказу также.
Брэд Гилберт b2gills

Ответы:

8

GolfScript, 42 41 37 38 символов

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

Код ожидает ввода в STDIN и выводит результат в STDOUT, например:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

Сценарий стал длиннее, чем ожидалось, но я полагаю, что есть возможности для улучшения.

Редактировать: случай списка с одним элементом стоит мне 1 символ (лучшее сравнение, которое я могу придумать, такое же, как у Питера).

Говард
источник
1
Я еще не успел реализовать это, но $.,)2//zipименно это я и имел в виду. Моя интерпретация спецификации заключалась в том, что он может принимать входные данные в стеке и оставлять их в стеке, поэтому, возможно, нам следует потребовать разъяснений.
Питер Тейлор
@PeterTaylor, круто. Работает для меня.
Boothby
Это дает сбой при вводе данных ["walnut"]в разделе «сравните первые два».
Питер Тейлор
@PeterTaylor Ты прав. Мне придется поработать над этим угловым делом.
Говард
6

GolfScript, 32 символа

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

Тот же формат ввода и вывода, что и у решения Говарда.

Питер Тейлор
источник
У меня была та же идея в части сортировки, но я еще не кодировал ее :-) Хорошая работа!
Говард
6

Brachylog v2, 10 байт

p.¬{s₂=}∨Ė

Попробуйте онлайн!

Решение для грубой силы. (Это функция, разрешенная, потому что задача не говорит «полная программа».) Это также в основном прямой перевод спецификации (единственная реальная тонкость в том, что мне удалось организовать вещи так, чтобы все неявные ограничения поступали именно в правильные места, таким образом, не нужно никаких дополнительных символов для их устранения неоднозначности).

Обратите внимание, что это общий алгоритм для перестройки любого вида списка, чтобы он не имел двух трогательных элементов; он может обрабатывать строковые представления элементов, а также может обрабатывать целочисленные коды. Так что на самом деле не имеет значения, как «Ваша программа должна иметь способ представления каждого вида орехов, таких как целочисленный код». Требование из вопроса интерпретируется.

объяснение

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list
ais523
источник
1

J, 80 знаков

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

Не совсем в той же лиге, что и Golfscript на этом. Я подозреваю, что можно получить выгоды, но 14 символов, необходимых только для того, чтобы получить список в программе, [;.1' ',1!:1[1являются серьезным препятствием.

По сути, программа берет список, группирует похожие элементы, сортирует по количеству элементов в каждой группе по убыванию и чередует выходные данные между первой половиной и второй половиной списка. Остальное, если код избавляется от посторонних элементов и решает, является ли список допустимым выводом (вывод бесконечности)._ если это не так).

Пример:

macadamia walnut walnut pistachio walnut

группа (</.]):

macadamia walnut walnut walnut pistachio

сортировать (\:#&.>):

walnut walnut walnut macadamia pistachio

Равель ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut
Gareth
источник
0

Желе , 14 байт

Ġz0UẎḟ0ịµẋ⁻ƝẠ$

Попробуйте онлайн!

Последние 6 байтов могут быть удалены, если мы можем иметь неопределенное поведение для неверных входных данных.

Эрик Outgolfer
источник
0

Stax , 10 байт

│éÿ∞å[zàL⌂

Запустите и отладьте его

Вот та же самая программа, распакованная, разархивированная и прокомментированная.

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

Запустите этот

рекурсивный
источник