Superpermutasi

26

pengantar

Anda seorang kriminal yang ditugaskan mencuri beberapa rencana rahasia dari startup teknologi baru Dejavu. Anda menyelinap masuk melalui dinding belakang, tetapi menemukan pintu yang membutuhkan pin untuk membukanya. Anda mengenali merek kunci dan tahu bahwa diperlukan pin 5 digit menggunakan semua angka dari 0 hingga 4. Setelah setiap digit dimasukkan, kunci memeriksa 5 digit terakhir yang dimasukkan dan terbuka jika kodenya benar. Anda harus melewati kunci ini, dan cepat.

Singkatnya Superpermutations

Permutasi adalah semua kombinasi yang mungkin dari satu set digit tertentu. misalnya, semua permutasi dari angka 0, 1, 2 adalah:

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

Jika kami menggabungkan semua permutasi ini bersama-sama, kami mendapatkan superpermutasi:

012021102120201210

superpermutasi ini berisi semua permutasi 0, 1, 2, tetapi dimungkinkan untuk membuatnya lebih pendek dari ini. Saya akan melewatkan sedikit di sini, tetapi superpermutasi terpendek dari angka-angka ini adalah:

012010210

Untuk maksud dan tujuan kami, ini pada dasarnya adalah string terpendek dari digit yang berisi semua kemungkinan permutasi dari digit tersebut, yaitu superpermutasi.

Tugas

Tugas Anda sedikit lebih sulit daripada contoh superpermutasi seperti yang ditunjukkan di atas, karena Anda memiliki dua digit lebih untuk dikhawatirkan. - Jika Anda belum membaca tentang superpermutasi, atau contoh saya di atas agak tidak jelas, saya sangat menyarankan Anda membaca artikel hebat ini oleh Patrick Honner pada subjek (tantangan ini sangat terinspirasi oleh artikelnya, jadi kudos kepadanya): https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/ . Tujuan Anda adalah menulis program sesingkat mungkin yang menghasilkan superpermutasi angka 0 hingga 4.

Mencetak gol

Program Anda tidak mengambil input apa pun, dan menghasilkan superpermutasi digit dari 0 hingga 4. Superpermutasi yang dihasilkan ini harus dicetak ke konsol atau ditampilkan secara jelas kepada pengguna sejauh yang disediakan oleh bahasa pilihan Anda. Ini tidak harus permutasi terpendek yang mungkin, hanya saja harus superpermutasi yang valid. Karena itu, tujuannya adalah untuk menulis program terpendek dengan superpermutasi terpendek, jadi Anda harus menghitung skor Anda seperti:

ukuran file (byte) * dihasilkan panjang superpermutasi (digit)

misalnya, jika saya memiliki program 40 byte, dan superpermutasi saya adalah 153 digit, skor saya akan:

40 * 153 = 6120

seperti biasa, tujuannya adalah untuk mendapatkan skor ini serendah mungkin.

Templat

Inilah cara Anda memposting jawaban Anda:

Bahasa | Skor

tautan ke kode di lingkungan kerja (jika mungkin)

code snippet

penjelasan kode, dll.

Finalitas

Ini adalah salah satu pertanyaan pertama saya di situs ini. Jadi tolong beri tahu saya jika saya kehilangan sesuatu atau sebagian dari tantangan saya tidak jelas. Terima kasih, dan bersenang-senang bermain golf!

Isaac C
sumber
Bisakah kita tahu panjang superperputasi terpendek untuk mendapatkan gambaran skor terendah?
Fatalkan
1
@Falalize 153 adalah yang terpendek
TFeld
1
@Formatisasi Lihat A180632 .
Arnauld
1
Sekilas, sepertinya ini hanya meminta urutan de Bruijn; Namun, kriteria penilaian membuat tantangan ini menarik. Sudah selesai dilakukan dengan baik!
Erik the Outgolfer
3
@EriktheOutgolfer Ini bukan hanya perbedaan skor: superpermutasi mencakup semua permutasi dengan panjang tertentu, sementara urutan de Bruijn mencakup semua string dengan panjang tertentu.
Anders Kaseorg

Jawaban:

6

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

žBœ∊{3ý

Cobalah online!

Bagaimana itu bekerja

ž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 , skor = 1944 (9 byte · 216)

s+R+4d.p4

Cobalah online!

Bagaimana itu bekerja

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate
Anders Kaseorg
sumber
1
vy3yJmenghemat satu byte
Emigna
1
Dalam kode Pyth, m+d-> +Rmenyimpan satu byte.
isaacg
8
Bukankah lebih baik memposting ini sebagai dua jawaban yang terpisah, karena pendekatan dan bahasa pemrograman keduanya berbeda?
Kevin Cruijssen
@KevinCruijssen Meh, mereka berdua variasi pada tema menggabungkan permutasi 4 elemen dengan elemen yang tersisa; jawaban 05AB1E saya sebenarnya memiliki banyak kesamaan dengan jawaban Pyth saya seperti halnya dengan versi yang berbeda dari dirinya sendiri. Jadi saya tidak ingin meminta upvotes dua kali lebih banyak hanya untuk beralih bahasa.
Anders Kaseorg
3

Brachylog , skor = 2907 (19 byte × 153)

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

Terlalu lambat untuk melihat apa-apa, tetapi jika Anda mengubah 4oleh 2Anda dapat mengujinya: Cobalah secara online!

Ini menemukan superpermutasi terpendek seperti:

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
                  ∧
Fatalisasi
sumber
2

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

Dengan sistem penilaian ini, ada sedikit ruang untuk sesuatu antara 'hardcode the optimal supermutation' dan 'hanya menggunakan built-in singkat untuk menggabungkan semua permutasi' , setidaknya di non-esolang.

Bagaimanapun, ini adalah upaya.

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

Cobalah online!

Ini menghasilkan string 325 byte:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210
Arnauld
sumber
Anda memiliki poin yang valid, saya akan mengatakan saya agak khawatir tentang sistem penilaian. Di masa depan, saya akan mencoba menjadi lebih perhatian dan memberi skor dengan cara yang memungkinkan berbagai metode. : D
Isaac C
Jika Anda dapat mengembalikan string kurang dari 23 byte boilerplate, skor hardcoding lebih baik daripada solusi ini ( 26975/153-153>23)
Sanchises
@Sanchises Kami membutuhkan 5 byte boilerplate untuk sebuah string, atau 4 untuk BigInt .
Arnauld
@Sanchises Kami dapat sedikit mengompresi string: Coba online! (atau kurang jika Anda tidak menghitung nakhiran default yang console.logdihasilkan)
Neil
2

Python 2 , Skor: 24.327 15.147 12.852 12.628 (154 * 82 byte)

S=str(int('OH97GKT83A0GJRVO309F4SGSRWD0S2T292S1JBPVKJ6CRUY8O',36))
print S+S[::-1]

Cobalah online!


Juga:

Python 2 , 12628 (154 * 82 byte)

S=oct(int('FS02C3XQJX14OTVMGM70CGCPWU41MNJZ0CO37ZMU0A0Y',36))[:-1]
print S+S[::-1]

Cobalah online!

TFeld
sumber
2

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

3ÝœJε4yJ}J

Port of @AndersKaseorg 's Pyth menjawab , jadi pastikan untuk membesarkan hatinya!

Cobalah online.

Penjelasan:

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)
Kevin Cruijssen
sumber
2

Oktaf , 27 x 442 = 11934

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

Cobalah online!

Jadi, ternyata, secara naif menghasilkan semua permutasi dan kemudian memotong ke substring terpendek yang masih superpermutasi yang valid lebih pendek daripada menghasilkan superpermutasi terpendek. Sayangnya, kali ini nilainya bukan palindrome.

Oktaf , 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

Cobalah online!

Entri diperbarui untuk beberapa hal

  • a++ tidak diterapkan untuk nomor simbolis.
  • contains()tidak diterapkan dalam Oktaf. Diganti dengan any(regexp()).
  • Di tautan online, saya secara manual memasukkan asuperpermutasi sepanjang 153-panjang. Ini memungkinkan solusi diverifikasi.
Sanchises
sumber
2

CJam (6 * 240 = 1440)

5e!72>

Demo online , validasi (menampilkan indeks di mana setiap permutasi 0..4dapat ditemukan; perlu meratakan output karena program asli memberikan output yang sesuai untuk stdout tetapi apa yang ditempatkan di stack tidak langsung dapat digunakan).

Pendekatan yang dicuri dari Sanchises , meskipun urutan permutasi CJam berbeda, memberikan substring yang berbeda.


CJam (22 * 207 = 4554)

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

Demo online , validasi .

Pembedahan

Ini menggunakan konstruksi rekursif sederhana.

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
}/
Peter Taylor
sumber
1

Arang , 29 byte, panjang keluaran 153, skor 4437

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Seperti @TFeld, saya hanya mencetak setengah dari superpermutasi dan mencerminkannya. Saya menghitung superpermutasi menggunakan kode berikut:

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);

Ini diterjemahkan ke program 45-byte di Charcoal sehingga akan mencetak 6885.

Neil
sumber
1

MATL , 16 x 442 = 7072

4Y25:Y@!)K442&:)

Cobalah online!

Port MATL jawaban Octave saya. -442 terima kasih kepada Luis Mendo

Sanchises
sumber
1

Japt -P, 2376 (11 x 216)

4o ¬á Ë+4+D

Cobalah!

-1 byte terima kasih kepada @ Shaggy!

Port of Anders Kaseorg's Pyth menjawab .

dana
sumber
1
Ada jalan pintas untuk q<space>;)
Shaggy
0

Perl 6 , 7191 (153 * 47 byte)

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

Cobalah online!

Menemukan nomor pertama yang berisi semua permutasi dari angka 0 hingga 4. Ini akan membutuhkan waktu lama untuk dieksekusi, tetapi Anda dapat mengujinya dengan dua permutasi pertama 0dan0,1

Jo King
sumber
0

Bahasa Wolfram (Mathematica) , 153 * 95 byte, 14535

Nest[Flatten[Join[#,{Max@#+1},#]&/@Partition[#,Max@#+1,1]]//.{b__,a__,a__,c__}:>{b,a,c}&,{0},4]

Cobalah online!

J42161217
sumber
9936
ASCII-only
9504?
ASCII
8424?
ASCII
Bagus! Saya hanya ingin memposting 153-solusi. Anda dapat memposting jawaban baru jika Anda suka
J42161217
Oh, juga ... penjelasan tolong: P
ASCII-hanya