Код гольфу: Змішайте горіхи так, щоб жоден з них не торкався


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, я вважаю, що вимога алгоритму бути детермінованим є розумною - якщо RNG несправний або вхід досить тривалий, недетерміноване рішення може не виконати.
кабінка

@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, круто. Працює для мене.
кабінка

Це виходить з ладу при введенні ["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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.