Code Golf: Somunları karıştırın, böylece aynı türden hiçbiri dokunmaz


16

Giriş:

Giriş, rastgele bir fındık dizisidir (kendi dilinizde), olası fındıklar bunu takip eder. Programınızın, tamsayı kodu gibi her türlü somunu temsil etmenin bir yolu olmalıdır. Program, herhangi bir somun konfigürasyonunun herhangi bir boyut dizisini işleyebilmelidir.

Olası Somunlar:

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

Çıktı:

Çıktı, aynı türden bitişik somunlar olmayacak şekilde sıralanan dizi olmalıdır. Bu mümkün değilse, çıktı boş bir dizi olmalıdır.

Örnek Giriş (basitleştirilmiş):

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

Örnek Çıktı:

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

Çözümler diziyi tesadüfen benzersiz hale gelene kadar karıştırmayabilir. Kullanılan sıralama deterministik olmalıdır

Karışık Kuruyemiş mi?  İki badem dokunuyor görüyorum!


4
"Programınızın tamsayı kodu gibi her türlü somunu temsil etmenin bir yolu olmalı" neden bu? - "diziyi tesadüfen benzersiz hale gelene kadar karıştırmayabilir. Kullanılan sıralama belirli bir belirleyici olmalıdır" bir karışıklık yine de belirleyici olabilir. Sadece programın zaman karmaşıklığına bir sınır koymak mı istiyorsunuz?
saat yönünün tersine çevirmeyi bıraktı

1
@Leftaroundabout ile anlaşmak zorundayım, belirli bir algoritmanın çok iyi bir neden olmadan aptal olduğunu yasaklıyor. Bunun gibi kod oyunları hakkında en faydalı şeylerden biri de tam olarak kullanılan çeşitli yöntemler.
dmckee --- eski moderatör kedi yavrusu

@dmckee, algoritmanın deterministik olması gerekliliğinin makul olduğunu düşünüyorum - RNG arızalıysa veya giriş oldukça uzunsa, belirsiz bir çözüm sonlanamayabilir.
boothby

@boothby. Meh. Ben bir parçacık fizikçisiyim. Monte Carlo, kendi başına önemli bir araçtır. Dahası, sabit bir PRNG ve sabit bir tohum seçersem , deterministiktir.
dmckee --- eski moderatör kedi yavrusu

1
Birkaç çözümü olan bir örnek bulduğumu düşünüyorum, ancak bazı cevapların herhangi birini bulamamasına neden olabilir. Ekleyebilir miyim? (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) de başarısız olmalarına neden olabilir.
Brad Gilbert b2gills

Yanıtlar:


8

GolfScript, 42 41 37 38 karakter

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

Kod STDIN üzerindeki girişi bekler ve sonucu STDOUT'a yazdırır, örneğin:

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

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

Senaryo beklenenden daha uzun oldu ama sanırım iyileştirme için yer var.

Düzenleme: Tek bir öğe ile bir liste durumunda bana 1 karakter maliyeti (en iyi karşılaştırma ile Peter aynıdır).


1
Bunu uygulamak için henüz oturmamıştım, ama $.,)2//ziptam olarak aklımda olan şeydi. Spesifikasyon hakkındaki yorumum, yığına girdi alabilmesi ve yığına bırakabilmesiydi, bu yüzden belki de açıklama için itmeliyiz.
Peter Taylor

@PeterTaylor, havalı. Benim için çalışıyor.
boothby

Bu ["walnut"], ilk iki karşılaştırması bölümündeki girdide çöküyor .
Peter Taylor

@PeterTaylor Haklısın. Bu köşe davasında çalışmam gerekecek.
Howard

6

GolfScript, 32 karakter

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

Howard'ın çözümü ile aynı giriş ve çıkış formatı.


Ben sıralama bölümünde aynı fikri vardı ama henüz kod vermedi :-) İyi iş!
Howard

6

Brachylog v2, 10 bayt

p.¬{s₂=}∨Ė

Çevrimiçi deneyin!

Kaba kuvvet çözümü. (Bu, izin verilen bir işlevdir, çünkü meydan okuma "tam program" demez.) Aynı zamanda çoğunlukla spesifik bir doğrudan çeviridir (tek gerçek incelik, şeyleri düzenlemeyi başarabilmemdi, böylece tüm örtülü kısıtlamalar tam olarak doğru yerlerde, bu nedenle onları netleştirmek için ekstra karakterlere ihtiyaç duymaz).

Bunun, iki dokunma öğesine sahip olmaması için herhangi bir listeyi yeniden düzenlemek için genel bir algoritma olduğunu unutmayın; öğelerin dize temsillerini ve tamsayı kodlarını da işleyebilir. Bu yüzden, "Programınızın tamsayı kodu gibi her türlü somunu temsil etmenin bir yolu olması gerekir." sorudan gelen gereksinim yorumlanır.

açıklama

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 karakter

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

Bu Golfscript ile aynı ligde değil. Yapılacak kazançlar olduğundan şüpheleniyorum, ancak listeyi programa almak için gereken 14 karakter [;.1' ',1!:1[1büyük bir handikap.

Temel olarak program listeyi alır, benzer öğeleri birlikte gruplandırır, azalan her gruptaki öğe sayısına göre sıralar ve çıktıyı listenin ilk yarısı ile ikinci yarısı arasında değiştirir. Geri kalan kod yabancı öğelerden kurtulur ve listenin geçerli çıktı olup olmadığına karar verirse (sonsuz _değilse çıkış ).

Misal:

macadamia walnut walnut pistachio walnut

grup (</.]):

macadamia walnut walnut walnut pistachio

sırala (\:#&.>):

walnut walnut walnut macadamia pistachio

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

walnut macadamia walnut pistachio walnut


0

Stax , 10 bayt

│éÿ∞å[zàL⌂

Çalıştır ve hata ayıkla

İşte aynı program, paketten çıkarılmış, çözülmemiş ve yorumlanmıştır.

|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

Bunu çalıştır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.