Code Golf: Wymieszaj orzechy, aby żaden z nich nie dotykał


16

Wejście:

Dane wejściowe to losowa tablica orzechów (w twoim języku), możliwe orzechy poniżej. Twój program musi mieć sposób reprezentowania każdego rodzaju nakrętki, na przykład kodu liczby całkowitej. Program musi być w stanie obsłużyć dowolną tablicę rozmiarów dowolnej konfiguracji nakrętek.

Możliwe orzechy:

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

Wynik:

Wyjściem musi być tablica posortowana w taki sposób, aby nie było sąsiadujących nakrętek tego samego rodzaju. Jeśli jest to niemożliwe, wyjściem powinna być pusta tablica.

Przykładowe dane wejściowe (uproszczone):

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

Przykładowe dane wyjściowe:

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

Rozwiązania nie mogą po prostu przetasować tablicy, dopóki nie stanie się ona przypadkowa. Zastosowany rodzaj musi być deterministyczny

Mieszane orzechy?  Widzę dotykające się dwa migdały!


4
„Twój program musi mieć sposób reprezentowania każdego rodzaju nakrętki, na przykład kodu liczby całkowitej”, dlaczego tak jest? - „nie może po prostu przetasować tablicy, dopóki nie stanie się ona wyjątkowa przez przypadek. Zastosowany rodzaj musi być deterministyczny”, tasowanie może być nadal deterministyczne. Czy chcesz po prostu ograniczyć złożoność czasową programu?
przestał obracać przeciwnie do zegara

1
Muszę się zgodzić z @leftaroundabout, że zakazanie określonego algorytmu jest głupie bez bardzo dobrego powodu. Jedną z najbardziej satysfakcjonujących rzeczy w takich grach kodowych jest właśnie różnorodność metod, które się stosuje.
dmckee --- były moderator kociak

@dmckee, myślę, że wymóg deterministyczności algorytmu jest uzasadniony - jeśli RNG jest wadliwy lub dane wejściowe dość długie, niedeterministyczne rozwiązanie może się nie powieść.
stoisko

@boothby. Meh Jestem fizykiem cząstek. Monte Carlo jest samo w sobie ważnym narzędziem. Co więcej, jeśli wybiorę stały PRNG i stały materiał siewny, jest to deterministyczne.
dmckee --- były moderator kociak

1
Myślę, że znalazłem przykład, który ma kilka rozwiązań, ale może spowodować, że niektóre odpowiedzi nie znajdą żadnego z nich. Czy mogę to dodać? (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) może również powodować ich awarię.
Brad Gilbert b2gills,

Odpowiedzi:


8

GolfScript, 42 41 37 38 znaków

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

Kod oczekuje danych wejściowych STDIN i wypisuje wyniki do STDOUT, np .:

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

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

Skrypt stał się dłuższy niż oczekiwano, ale przypuszczam, że jest miejsce na ulepszenia.

Edycja: Przypadek listy z jednym przedmiotem kosztuje mnie 1 znak (najlepsze porównanie, jakie mogłem wymyślić, jest takie samo jak Peter).


1
Nie usiadłem jeszcze, aby to wdrożyć, ale $.,)2//zipdokładnie to miałem na myśli. Moja interpretacja specyfikacji była taka, że ​​może on pobierać dane wejściowe ze stosu i pozostawić je na stosie, więc może powinniśmy naciskać na wyjaśnienia.
Peter Taylor

@PeterTaylor, spoko. Pracuje dla mnie.
stoisko

To zawiesza się podczas wprowadzania danych ["walnut"]w sekcji porównania pierwszych dwóch.
Peter Taylor

@PeterTaylor Masz rację. Będę musiał popracować nad tą narożną skrzynką.
Howard

6

GolfScript, 32 znaki

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

Taki sam format wejściowy i wyjściowy jak rozwiązanie Howarda.


Miałem ten sam pomysł w części sortowania, ale jeszcze go nie kodowałem :-) Dobra robota!
Howard

6

Brachylog v2, 10 bajtów

p.¬{s₂=}∨Ė

Wypróbuj online!

Rozwiązanie siłowe. (Jest to funkcja dozwolona, ​​ponieważ wyzwanie nie mówi „pełny program”.) Jest to również głównie bezpośrednie tłumaczenie specyfikacji (jedyną prawdziwą subtelnością jest to, że udało mi się tak ułożyć rzeczy, aby wszystkie ukryte ograniczenia dotarły dokładnie do odpowiednie miejsca, a tym samym nie potrzeba żadnych dodatkowych znaków, aby je ujednoznacznić).

Zauważ, że jest to ogólny algorytm służący do przestawiania dowolnego rodzaju listy, tak aby nie zawierał dwóch dotykających elementów; może obsługiwać reprezentacje łańcuchowe elementów, a także może również obsługiwać kody całkowite. Tak więc nie ma znaczenia, w jaki sposób „Twój program musi mieć sposób reprezentowania każdego rodzaju nakrętki, na przykład kodu liczby całkowitej”. wymóg z pytania jest interpretowany.

Wyjaśnienie

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 znaków

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

Tak naprawdę nie w tej samej lidze, co Golfscript. Podejrzewam, że są pewne korzyści, ale 14 znaków potrzebnych tylko do wpisania listy do programu [;.1' ',1!:1[1jest dużym utrudnieniem.

Zasadniczo program pobiera listę, grupuje podobne elementy razem, sortuje według liczby elementów w każdej grupie malejącej i naprzemiennie wyświetla wyniki między pierwszą i drugą połową listy. Reszta, jeśli kod pozbywa się obcych elementów i decyduje, czy lista jest poprawnym wyjściem (wypisuje nieskończoność, _jeśli nie jest).

Przykład:

macadamia walnut walnut pistachio walnut

grupa (</.]):

macadamia walnut walnut walnut pistachio

sortuj (\:#&.>):

walnut walnut walnut macadamia pistachio

ravel ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut


0

Stax , 10 bajtów

│éÿ∞å[zàL⌂

Uruchom i debuguj

Oto ten sam program rozpakowany, nieposortowany i skomentowany.

|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

Uruchom ten

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.