Superpermutations


26

Giriş

Yeni teknoloji başlangıcı Dejavu'dan bazı gizli planlar çalmakla görevli bir suçlusunuz. Arka duvardan gizlice giriyorsun, ama açmak için bir pim gerektiren bir kapı bul. Kilidin yapısını kabul edersiniz ve 0'dan 4'e kadar olan tüm sayıları kullanarak 5 basamaklı bir pim aldığını bilirsiniz. Girilen her basamaktan sonra kilit girilen son 5 haneyi kontrol eder ve kod doğruysa açılır. Bu kilidi ve hızlıca geçmelisin.

Özetle Süperpermülasyonlar

Bir permütasyon, belirli bir rakam dizisinin tüm olası kombinasyonlarıdır. örneğin, 0, 1, 2 rakamlarının tüm izinleri:

012, 021, 102, 120, 201 ve 210.

Tüm bu permütasyonları bir araya getirirsek, süper bir hesap alırız:

012021102120201210

bu superpermutation, 0, 1, 2'nin tüm permütasyonlarını içerir, ancak bundan daha kısa bir tane yapmak mümkündür. Burada biraz atlayacağım, ancak bu rakamların en kısa süper sayımı:

012010210

Niyetimiz ve amaçlarımız için, bu, esas olarak, bu rakamların tüm olası permütasyonlarını, yani bir süper hesaplamayı içeren en kısa rakam dizisidir.

Görev

Görevin yukarıda gösterilen süperpermutasyon örneğinden biraz daha zordur, çünkü endişelenmen gereken iki rakam daha var. - Süperpermutasyonları okumadıysanız veya yukarıdaki örneğim biraz belirsizse, konuyla ilgili Patrick Honner tarafından bu harika makaleyi okumanızı şiddetle tavsiye ederim (bu zorluk onun makalesinden oldukça etkilenmiştir, bu yüzden ona övgüde bulunulmuştur): https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/ . Amacınız, 0 ila 4 rakamlarının süperpermutasyonunu oluşturan mümkün olan en kısa programı yazmaktır.

puanlama

Programınız herhangi bir giriş yapmaz ve 0 - 4 arasındaki rakamların bir süper hesaplamasını oluşturur. Bu elde edilen süper hesap, konsola yazdırılmalı veya kullanıcıya, seçtiğiniz dilde belirtilen ölçüde görünmelidir. Bu mümkün olan en kısa permütasyon olmak zorunda değildir, sadece geçerli bir süpermutasyon olması gerekir. Bu nedenle, amaç en kısa programı en kısa süper hesaplamayla yazmaktır, dolayısıyla puanınızı şu şekilde hesaplamanız gerekir:

dosya boyutu (bayt) * oluşturulan süper hesaplamanın uzunluğu (hane)

örneğin, 40 baytlık bir programım varsa ve süper hesaplamam 153 basamak uzunluğundaysa, puanım:

40 * 153 = 6120

Her zaman olduğu gibi, amaç bu puanı mümkün olduğunca düşük elde etmektir.

şablon

Cevabınızı şu şekilde göndermelisiniz:

Dil | Gol

çalışma ortamındaki koda bağlantı (mümkünse)

code snippet

kod açıklaması, vb.

kesinliklerin

Bu, bu sitedeki ilk sorularımdan biri. Öyleyse lütfen bir şeyleri özlüyorum ya da zorluğumun bir kısmı belirsiz mi bana söyle. Teşekkürler ve iyi eğlenceler golf!


En düşük puan hakkında bir fikir edinmek için en kısa süper hesaplamanın uzunluğunu biliyor muyuz?
Şubat’ta

1
@Fatalize 153 en kısa
TFeld

1
@Fatalize bakınız A180632 .
Arnauld

1
İlk bakışta, bu sadece bir Bruijn dizisi ister; Ancak, puanlama kriteri bu zorluğu ilginç kılmaktadır. Aferin!
Outgolfer Erik

3
@EriktheOutgolfer It adlı sadece bir puanlama farkı: Bir superpermutation bir süre, bazı uzunluktaki tüm permütasyon içerir de Bruijn dizisi bazı uzunlukta tüm dizeleri içerir.
Anders Kaseorg

Yanıtlar:


6

05AB1E , skor = 1673 (7 bayt · 239)

žBœ∊{3ý

Çevrimiçi deneyin!

Nasıl çalışır

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth , puan = 1944 (9 bayt · 216)

s+R+4d.p4

Çevrimiçi deneyin!

Nasıl çalışır

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJbir bayt kaydeder
Emigna

1
Pyth kodunda m+d-> +Rbir bayt kaydeder.
isaacg

8
Yaklaşımlar ve programlama dilleri farklı olduğundan, bunu iki ayrı cevap olarak göndermek daha iyi olmaz mıydı?
Kevin Cruijssen

@KevinCruijssen Meh, her ikisi de 4 elementin kalan elementi ile birleştirme permütasyonu temasında varyasyondur; Benim 05AB1E cevabım aslında Pyth cevabımın kendisinin farklı versiyonlarında olduğu kadar çok ortak yönü var. Bu yüzden sadece dilleri değiştirmek için iki kat fazla oy sormak istemedim.
Anders Kaseorg

3

Brachylog , skor = 2907 (19 bayt × 153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

Şey görmek, ancak değiştirme durumunda Çok yavaş 4göre 2: Test etmeniz çevrimiçi deneyin!

Bu, en kısa süper hesaplamayı şöyle bulur:

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript (ES6), 26975 (325 * 83 bayt)

Bu puanlama sistemi ile, 'en iyi şekilde hesaplanamayanlar'da,' en iyi süpermutasyonun hardcode'u ' ile ' tüm permütasyonları birleştirmek için kısa bir dahili kullanın ' arasında bir şey için az yer var.

İşte yine de bir girişim.

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

Çevrimiçi deneyin!

325 baytlık bir dizge oluşturur:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

Geçerli bir puanınız var, puanlama sistemi için biraz endişelendim diyeceğim. Gelecekte, çok çeşitli yöntemlere izin verecek şekilde daha düşünceli ve puan almaya çalışacağım. : D
Isaac C

Bir dizgiyi 23 bayttan daha kısa bir 26975/153-153>23
boyuta döndürürseniz, kodlama

@Sanchises Bir string için 5 bayt, BigInt için ise 4 taneye ihtiyacımız var .
Arnauld

@Sanchises Dizeyi biraz sıkıştırabiliriz: Çevrimiçi deneyin! (veya çıktı olan varsayılan nsoneki saymazsanız daha az console.log)
Neil


2

05AB1E , skor: 5355 2160 (216 * 10 bayt )

3ÝœJε4yJ}J

Limanı @AndersKaseorg 'ın Pyth cevap , bu yüzden onu upvote emin olun!

Çevrimiçi deneyin.

Açıklama:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

Octave , 27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

Çevrimiçi deneyin!

Yani, ortaya çıkıyor, saf bir şekilde hepsini üretiyor permütasyonları ve daha sonra hala geçerli bir süperpermutasyon olan en kısa alt dize keserek, en kısa süperpermutasyondan daha kısa olduğu ortaya çıktı. Ne yazık ki, bu kez skor bir palindrom değil.

Octave , 97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

Çevrimiçi deneyin!

Giriş birkaç şey için güncellendi

  • a++ sembolik sayılar için uygulanmaz.
  • contains()Octave'da uygulanmadı. İle değiştirildi any(regexp()).
  • Çevrimiçi bağlantıda, a153 uzunluktaki süper hesaplamaya çok yakın bir şekilde elle girdim . Bu, çözümün doğrulanmasını sağlar.

2

CJam (6 * 240 = 1440)

5e!72>

Online demo , validasyon (her permütasyonun alındığı indeksi gösterir.0..4 ; orjinal program stdout'a uygun çıktılar sağladığı halde yığına yerleştirilenler doğrudan kullanılamaz olduğu için çıktıyı düzleştirmesi gerekir).

Sanchises'ten çalınan yaklaşım , CJam'ın permütasyon düzeni farklı olmasına rağmen, farklı bir alt materyal veriyor.


CJam (22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

Çevrimiçi demo , doğrulama .

teşrih

Bu basit bir özyinelemeli yapı kullanır.

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

Kömür , 29 bayt, çıktı uzunluğu 153, skor 4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama: @TFeld gibi ben de bir süper hesaplamanın yarısını basıyorum ve yansıtıyorum. Süper hesaplamayı aşağıdaki kodu kullanarak hesapladım:

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

Bu, Kömür'deki 45 baytlık bir program anlamına gelir, böylece 6885'e ulaşabilirdi.




0

Perl 6 , 7191 (153 * 47 bayt)

say first *.comb(permutations(5).all.join),0..*

Çevrimiçi deneyin!

Tüm basamakları permütasyon içeren ilk sayı 0 4'e Bu alacaktır bulur uzun çalışmasına zaman, ancak ilk iki permütasyon ile test edebilirsiniz 0ve0,1


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.