Kompres urutan perbedaan-2 maksimal


18

Keluarkan urutan biner ini dengan panjang 1160:

-++-+--++-++-+--+--++-+--+--++-+--++-++-+-++--++-+---+-++-+--+--++++--+--++-+--++-++----++-++-+-++--++-+-+---++-+--++-++-+--++-+--+---+-++-+--++-++-+--+--++-++-+--++-+--+++-+-+----+++-+--+--+++---++-++-+--+--+++--+-+-+--+-+++-++-+--+--++-+--++-++-+--+--++--+++---+++-+---++-+--++--+-+--+-+++-+--++-++-+--++-+--+--++-+--++--+-++-+-+--+-+-++-+--++-+--+--++-+-+-++-+-+-++---+-+--++++--+---++-+-++-+--++-+--+--++-+--++++--+---+-++++--+--++-++-+--++-+--+--++-+--++-++-+--++-+--+--++-++-+----+++-+--++--+++---+-++-+--+-++---+-++-++-+--+--++--++++-+--+--+--++++--+--+++---++-++-+--++--+-+--+--++-++-+--+--+-+++-++-+--+--++--+-++-++-+--+--+--++-++-+--+++---++-+--++-++---+++---++-++----+++--+-++-+--+--++-+--++-++-+-++--++--++----+++-++--++----++-+++--++---+++----+-+-++-++-++-+-+----+++--++-+--++-++-+--+--+--++-+--++-++-+--++--+-+--+-+-+-++++---+-+-++--+--+-+-+-++-+-+++--+-+--+--+-+++--+-+++---++-+--+--++-++--++---++-+-++--++-+---+-++-+--+-++--++-+--++-+--+-+++-+--++--+-+-+++--+-+--++-++-+--+--+-++---+-++-+-++--++-+--+++-+----++--+-++-+-++--++-+--++-+-++--++-+---+-++-+--+++----+-+-++--++-+--++-++-++-+--+--+--++++---++---+-+-++-+-+++--+-++--+-+--+-+-++---+++-++

Urutannya

Urutan terbatas ini terstruktur dengan ketat dengan cara yang saya harap memberikan metode unik untuk kompresi. Itu muncul dari masalah perbedaan Erd, yang ditampilkan dalam tantangan sebelumnya .

Memperlakukan istilah sebagai +1 dan -1, ini adalah urutan perbedaan panjang maksimal 2, yang berarti bahwa:

Untuk setiap ukuran langkah positif d, jika Anda mengambil distilah setiap th (dimulai dengan distilah th), jumlah running dari urutan yang dihasilkan tetap antara -2 dan 2 inklusif.

Jika Anda berpikir masing-masing +berarti satu langkah ke kanan dan -satu langkah ke kiri, ini berarti bahwa berjalan dari setiap dinstruksi tidak pernah berjalan lebih dari 2 langkah dari posisi awal.

Misalnya, untuk d=3, mengambil setiap suku ke-3 memberikan urutan +-++--+--+-..., yang jumlah penjumlahannya [1,0,1,2,1,0,1,0,-1,0,1,...], yang tidak pernah mencapai -3 atau 3.

-++-+--++-++-+--+--++-+--+--++-+--+...
  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
  +  -  +  +  -  -  +  -  -  +  -
   1  0  1  2  1  0  1  0 -1  0  -1  ...

Urutan ini ditemukan pada tahun 2014 melalui pencarian komputer. Lihat makalah ini , di mana urutan direproduksi dalam Lampiran B. Pencarian membuktikan bahwa 1160 adalah panjang maksimum urutan ketidaksesuaian-2, meskipun ada lebih dari satu urutan panjang itu. Masalah perbedaan Erd, yang dibuktikan pada 2015 , mengatakan bahwa urutan seperti itu harus memiliki panjang yang terbatas untuk setiap perbedaan maksimum cdi tempat 2.

Persyaratan waktu

Kode Anda akan selesai dalam 5 detik . Ini untuk membatasi kekerasan.

Format output

Anda dapat menggunakan dua karakter atau nilai tetap berbeda untuk +dan -dalam format daftar-suka atau seperti-string. Format harus berupa format di mana nilai bit 1160 dapat langsung dibaca, tidak misalnya dikodekan sebagai angka melalui representasi binernya atau string melalui nilai karakter. Untuk output string, sebuah trailing newline diperbolehkan.

Papan peringkat


substring paling umum dengan panjang 1-16 jika ada yang ingin tahu
ASCII-hanya

Saya merasa sangat sulit untuk mengalahkan kompresi ...
Buah Esolanging

Jawaban:


3

Jelly , 149 byte

“×GOẈ*m¬¿3d{ẋạ⁻@Ɓ]ZĊỵINBƬḊṿẊ*N¹Ẹ÷ƲẋɼoṬḳ£®⁾ƙŒọ¡[P1&ạ€ẊʠNỌXḢṖėÐß⁹Ụṗ¬⁹E#ụḷḌṁżżR=Ɗѳıɲ-ṭỌṾɲẎĿỴ⁶€ḋtɦÐ\ỵƒ⁾ƒụṫṡĊKpƭẏkaṪ,Ẋȧ⁻ḅMɓ%YḷsƲƭl¤æĊbṬ9D6ẎƘẓ^Œ⁷Ɲḷḷ€ḟ1g’B

Ada beberapa pola, misalnya hanya 81 dari 256 panjang 8 string biner yang hadir jika seseorang memotong urutan menjadi delapan, tetapi saya belum (setidaknya belum) melihat cara untuk memanfaatkan untuk mengurangi jumlah byte dari basis lurus ke depan ini 250 kompresi dikonversi ke daftar biner.

Cobalah online! (footer memformat daftar biner ke string untuk perbandingan langsung yang lebih mudah).


3

Python 2 , 269 259 256 247 245 243 byte

r=[1]
c=int('bmqnh8j8rdo4mirjos6uxbfthu8t39pjy6up43axryzwbwcu5d528nsakitjwqbo6dnnozy0oybhk6jduaoc53lqkzdb04opj5t50a24w9he5y7qbgd2',36)
while c:t=sum(sum(r[::-k])/3for k in range(1,264)if len(r)%k<1);r[-1:]=cmp(0,t)or c%2*2-1,1;c>>=t==0
print r

Cobalah online!


3

JavaScript (ES6), 263 253 252 byte

Saya mencoba menggunakan data payload sesedikit mungkin. Sayangnya - tetapi tidak mengherankan - ini membutuhkan kode dekompresi yang cukup banyak.

Kerusakan:

  • data payload: 75 byte, disandikan sebagai string Base64 100 karakter
  • kode: 163 153 152 byte

Di bawah ini adalah versi yang diformat tanpa data. Kode mentah ada di cuplikan demo.

f = (a = Array(264).fill(n = p = 0)) =>
  n++ < 1160 ?
    '+/-'[
      p += !a.some((v, i) =>
        n % i | v * v - 4 ?
          0
        :
          r = v / 2,
        r = atob`...`.charCodeAt(p / 8) >> p % 8 & 1 || -1
      ),
      r + 1
    ] +
    f(a.map((v, i) => n % i ? v : v - r))
  :
    ''

Bagaimana?

Kami melacak jumlah yang berjalan a [i] dari setiap istilah ke- i . Setiap kali satu jumlah ini mengenai batas bawah -2 , kita tahu bahwa istilah berikutnya harus + . Logika yang sama berlaku untuk batas atas. Ini membantu hingga i = 264 dan tidak menyimpan byte tambahan di luar itu.

Ini memberi kita 599 istilah yang tidak bisa ditebak. Kami menyimpannya sebagai ⌈599 / 8⌉ = 75 byte, disandikan dalam string Base64 100-karakter.

Demo


3

Jelly , 110 109 107 byte

;1mS€:3o/Nȯ®Ṫṭḷ
“ĖṄẋ{Xṛ-İIṗ®6⁼Ḟ2a⁻!Ċẉȥ+¡Ƒ¥mvrẓsṘ×⁴ç&$nỴỤ)M7?ẊẎḅ=ṠƈTṙḌȥụẋXḌ⁵Ḣ⁺ḲL÷æTƥĿv€%ḟ¢®!Ė’BḤ’©ṛ⁽¡ɠÆD€Nç/

Ini membutuhkan waktu terlalu lama pada TIO, tetapi selesai dalam waktu kurang dari 3 detik di komputer desktop saya.

Cobalah online!


3

Jelly , 135 133 130 129 105 104 byte

42“I=İėZP*ðEḄẈṆ'mBƝėŻƝ6®Ṇɼḥ[bȦėṡV£(6ṘɱX)Ṅẹ6~K7°ȤÄỴ¥ƝÇ5prḳġŻ£ƭṗṄFṾḃ{©@ɼ’ḃÄċL
L+Ø.ÆDm@NÇ¡§§No¥/Ṡo-ṭ
Ç⁽¡ɠ¡Ḋ

Berdasarkan elemen sebelumnya dari urutan, algoritme membuat tebakan cerdas tentang elemen berikutnya. Ini berfungsi untuk semua kecuali 99 elemen, yang indeksnya di-hardcode sehingga elemen yang sesuai dapat ditukar.

Cobalah online!


2

MATL , 224 byte

862:o'$Te]BQHoHxkw!-CEjv(j=zGp.8_C{\?wkH{t&%W.:ja#7=+>"/,=0wDJ+"2BREtgh9_2I%1>+99T3kPrknzlJ}&8kUR(S!pX]C]05u{"6MHA7"gg(M6\5Vp.k.18Y(c~m&wroTrN)sf" |>\,Lg80C:nUez|l;<h~m(%]4xx6?`=qGtZ):d"*"@~1M.T}jJ)Bl7>Ns >9$8R1MlkG'F3:qZaY"

Ouput adalah bentuk 1 0 0 1 0 ..., di mana 1sesuai dengan '-'dan 0sesuai dengan '+'.

Cobalah online!

Penjelasan

Urutan telah dikodekan run-length. Semua 720 berjalan memiliki panjang 1, 2, 3 atau 4, dengan 3 atau 4 kurang umum. Jadi masing-masing 3 telah diganti dengan 2, 0, 1 (lari 2, lalu lari 0 dari simbol lainnya, lalu lari 1 lagi) dan sama masing-masing 4 telah diganti dengan 2, 0, 2. Ini memberikan array ternary dengan panjang 862.

Array ini dikonversi ke pengkodean base-94, dan merupakan string panjang yang ditunjukkan dalam kode ( '$Te...kG'). Pengkodean basis 94 menggunakan semua 95 karakter ASCII yang dapat dicetak kecuali untuk kutipan tunggal (yang harus diloloskan).

Kode mengkonversi string itu dari basis 94 ke basis 3, dan menggunakan hasilnya untuk menjalankan-panjang mendekode simbol [1 0 1 0 ... 0](array panjang 862).


2

Jelly , 95 byte

“qạʂṅs⁽fØʋZ%BÞġı½.m0&u⁺TsƝȧAuỴż⁶3uÞ$+ȷ@4Ṣ’BḤC©µmLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭø⁽¡ɠ¡Ḋ

Titik tengah antara dua pendekatan saya sebelumnya.

Kode mencoba untuk menebak 842 elemen dari urutan dan hardcode 318 yang tersisa. 19 dari tebakan itu salah dan harus dikembalikan melalui daftar indeks yang di-hardcode.

Cobalah online!

Bagaimana itu bekerja

“qạʂṅs⁽fØʋZ%BÞġı½.m0&u⁺TsƝȧAuỴż⁶3uÞ$+ȷ@4Ṣ’

380009100940380065412452185545474826295694594854898450166594167299196720639075810827320738450934©

BḤC©

BC1±1

µmLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭ

0

mLÆD$§SṠȯ®ṪNLḟ“⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤ɗ}¡ṭ  Monadic chain. Arument: A (array)

 LÆÐ$                                       Compute all divisors of the length of A.
m                                           For each divisor d, generate the subarray
                                            of each d-th element.
     §                                      Take the sum of each subarray.
      S                                     Take the sum of the sums.
       Ṡ                                    Take the sign of the sum.
        ȯ®                                  If the result is 0, replace it with the
                                            array in the register.
          Ṫ                                 Tail; pop and yield the last element,
                                            modifying the register for a zero sum.
                                            This is a no-op for a non-zero sum.
              “⁶ .£µ+£gÐ9Ц.ñ×µ¥¤®‘ÄḤ¤      Yield all indices of incorrect guesses.
           NLḟ                        ɗ¡    If the length of A doesn't appear among
                                            the indices, negate the result.
                                        ṭ   Append the result to A.
ø⁽¡ɠ¡Ḋ

0⁽¡ɠ11600


Sepertinya pengkodean aritmatika akan lebih sederhana daripada mengubah beberapa entri secara manual; Sudahkah Anda mencobanya atau apakah Jelly tidak cocok untuk itu?
lirtosiast

Hanya ada 19 entri yang harus diubah, yang dikodekan dalam 23 byte. Saya pikir decoder aritmatika akan lebih lama dari itu, setidaknya dengan data yang terkait.
Dennis

1

Arang , 150 byte

”a∧∨~℅¹÷Oμ6fCC⁼∕⁵^;Ÿ‘«·T:∕D_=v§AHŒ,—<Pr¢E!◨±L^|.τ"NO“šþŽ∧<n`bÞE÷β$+Z⟦5⁶⁻.λ‹ζd⧴X>w,⊞?‹⟧⌈⪪-h÷³N“K⁺L¿>ρ@P⟲↘3νηKx÷?>™Ž¿•:8V¦£œεG↧x℅7¶	NRü"m”⟦)&¶bE“Yv”

Cobalah online!

Memanfaatkan kompresi string bawaan Charcoal. Penggunaan .untuk -dan !untuk +.


1

CJam, 153 byte

"Ke²ÉLº[
O%2¹d²Ý,Éeñlr[´KeÙ.Y­K-iZ[*Të
ÊYl°Ý
ËeËd¼Y%³l69,ÖÉmÙ¤¶ÉcN9<il²S3ÄÏ#8õ$¯d¶Ë%Õ¦Õ(Öѣɦ]-2ËEd¶)/4¦YLºXõ2É-°çR5©Ä"256b2b

Penggunaan 1untuk -, dan 0untuk +.

Berisi yang tidak diinginkan. Cobalah online!

Ini sangat sederhana. Mengubah urutan panjang dari basis 256 ke basis 2.


1

Python 3 , 236 232 byte

Terima kasih kepada Mego karena telah menghemat 4 byte

#coding:437
print(bin(int.from_bytes('ûKe▓╔L║[\rûO%2╣d▓▌,û╔eè±lr[\x1a┤KeÆ┘Ä.Y¡\x16K-ûiZû[*Tδ\r╩Yl░▌\rÆ╦eÆ╦d╝YÄû¥%│\x0bl69,╓╔m\x12┘ñ╢╔cûN9<il▓S3─╧#8⌡$»\x19d╢╦%Ü╒\x0eª╒(╓╤úû╔£ª]-2╦EÜìd╢¥)û/4ªYL║X⌡2╔-░τRì5⌐─'.encode('437'),'big'))[2:])

Cobalah online!

Menggunakan pengkodean CP-437. Terima kasih pada Dennis karena menunjukkan kesalahan.


437adalah alias untuk cp437, sehingga Anda dapat mencukur 4 byte dengan menyingkirkan cpbit kedua kali mereka terjadi.
Mego

0

Python 2 , 364 250 byte

Terima kasih kepada Jonathan Allan karena telah menghemat 114 byte.

print bin(int('28x0lphxjx8ze4uuhtdzo0oebr25amtmuxm62cbit0ibdwjm2sf50clh2ejq0a73ndseo5tove8uqca6nf66bo4abbkg867woh2b435at0o3pddvqmsqp29b6as5bd4eo28xgwkkj607gp66icba1q4n9fc13dltp45j340mpzbc56wsrbb3oejnczsbzfgh82xdi8aku8m4wlmwuxkgy4yaew7pu4p1g',36))[2:]

Cobalah online!


0

C # , 385 byte


Data

  • Masukan tidak ada
  • Keluaran String Hasil pura-pura.

Golf

()=>{var s="i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";var o="";foreach(var c in s)foreach(var b in Convert.ToString(c,2).PadLeft(8,'0'))o+=(char)(43+(49-(int)b)*2);return o;};

Tidak disatukan

() => {
    var s = "i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";
    var o = "";

    foreach( var c in s )
        foreach( var b in Convert.ToString( c, 2 ).PadLeft( 8, '0' ) )
            o += (char) ( 43 + ( 49 - (int) b ) * 2 );

    return o;
};

Kode lengkap

using System;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
        Func<String> f = () => {
            var s = "i´\u009aM6³E¤òi°ÚÍF\u009bM\"Ói6\u009au\u000e\u0093\u008d¤åK´\u009am&qѦRé´Òi\u0096¥i¤Õ«\u0014ò5¦\u0093O\"òm4\u009am4\u009bC¦qibÚLô\u0093ÉÆÓ)6\u0092í&[I6\u009ci±ÆÃ\u0096\u0093M¬Ì;0ÜÇ\nÛPæ\u009bI4Úe*ñY*×).\\i6cY¢ÒÍ4ºer\u009bIbÖiÐËY¦³E§\nÍ6ÒO\u0018­rÊV;";
            var o = "";

            foreach( var c in s )
                foreach( var b in Convert.ToString( c, 2 ).PadLeft( 8, '0' ) )
                    o += (char) ( 43 + ( 49 - (int) b ) * 2 );

            return o;
        };

        Console.WriteLine( $" Input: <none>\nOutput: {f()}\n" );

        Console.ReadLine();
      }
   }
}

Rilis

  • v1.0 - 385 bytes- Solusi awal.

Catatan

  • Tidak ada

0

05AB1E , 149 byte

•19GÈRÕŸ
pт6½÷Ü;вVåΔĀÈ₄¤Ü³Aʒм5[¦PŠÅøœ^‚₆賦ìóV“LÛ'ßq;αÎΩªî»(2∍©däf×5 V5Ú”gÜ/\^(Ã∊Ƶ!3šÍ3°(§A΄ǝ₂È₅ç£6óàÖCsa*zƒÚ¥Î\ªD¹,n∊ðˆ.ëçPαǝƒ.É∍¯ü₂³Λ‘g∍Θþ“‚œΔи‹•b

Sangat membosankan. Hanya nomor terkompresi. Penggunaan 1untuk -dan 0untuk +.

Cobalah online!


0

PHP, 276 Bytes

<?=gzinflate(base64_decode("dVJRFgMgCDoQj/tfb2+boqj9VJohQgQI8rv+D1yHuIIytGLsYh6vwAlYIMS62mVCiWMm56vfHiGOuTwjiMHQEC7OVlkNzzK0LZFTN8l0gavGdX4wOfJDsZpXZS0csig0l13wEsoRlvKzhYHMv+F9MnxaCXHWrC2Kx4UqQ8o4qmgNcsjbzA5lZG7LE6LdNMlt2sRKFpNhk/sL59N6DSMKp4No7vP2QcP0c2XWb6nPblqYfJBfHw=="));

Cobalah online!


0

Ruby , 245 byte

puts"%b"%"28x0lphxjx8ze4uuhtdzo0oebr25amtmuxm62cbit0ibdwjm2sf50clh2ejq0a73ndseo5tove8uqca6nf66bo4abbkg867woh2b435at0o3pddvqmsqp29b6as5bd4eo28xgwkkj607gp66icba1q4n9fc13dltp45j340mpzbc56wsrbb3oejnczsbzfgh82xdi8aku8m4wlmwuxkgy4yaew7pu4p1g".to_i(36)

Output 0 untuk + dan 1 untuk -.

Cobalah online!


0

Perl, 164 byte

print unpack'b*','-Y²lÍ¢%O
[³bÙ²DËlY®pɱ%§Ò-Y¶deJ-Ki¥%«Õ(O¬eÉòDO¶,Y¶,ÙÂeF[2/ÉcËlI·dÚl9cÃiɲ53Ü;ãPÛ
gÙ,[¦TTët:lÆEK³,]¦NÙFkÓeÍ¢åP³lKòµNSjÜ'

Hexdump:

00000000: 7072 696e 7420 756e 7061 636b 2762 2a27  print unpack'b*'
00000010: 2c27 962d 59b2 6ccd a225 4f96 0d5b b362  ,'.-Y.l..%O..[.b
00000020: d9b2 44cb 966c 59ae 70c9 b125 a7d2 2d59  ..D..lY.p..%..-Y
00000030: b664 8e8b 654a 972d 4b96 69a5 9625 abd5  .d..eJ.-K.i..%..
00000040: 284f ac65 c9f2 444f b62c 59b6 2cd9 c265  (O.e..DO.,Y.,..e
00000050: 8e96 465b 322f c993 63cb 946c 49b7 64da  ..F[2/..c..lI.d.
00000060: 926c 3996 8d63 c369 c9b2 3533 dc0c 3be3  .l9..c.i..53..;.
00000070: 50db 0a67 d992 2c5b a654 8f9a 54eb 9474  P..g..,[.T..T..t
00000080: 3a96 6cc6 9a45 4bb3 2c5d a64e d992 466b  :.l..EK.,].N..Fk
00000090: 960b d39a 65cd a2e5 50b3 6c4b f218 b54e  ....e...P.lK...N
000000a0: 536a dc27                                Sj.'

Solusi yang jelas dan membosankan: cukup masukkan semua bit ke dalam string biner, 8 bit per byte. Menggunakan 0 untuk - dan 1 untuk +. Saya akan mencoba bermain golf ini lagi.


0

Retina , 333 byte


ADG-RMCGHQFDLEM+-FAG-CADGPAKBBLHBCH-EGHJBORGEH-HB-FJOBPRCA+JAG-A+A+NJHQLIB-R+Q-OQPRAGP-HBEH-CGNCDGEH+BCCHQH-PDJCEGOGECDGCPK-FNH-EDLHCRIEELHDELEKE-HLJDDA+LHFGCFADJJBK+-JDCJBI+JCOOLGEDELMCGNAGKBEJKJEGCNCIF+BLECMMCAKLJDFDGCH+-E-JIQDJJNHD¶
R
GF
Q
+C
P
EA
O
CK
N
D-
M
I-A
L
--
K
D+
J
CB
I
A++
H
E+
G
AB
F
-AD
E
C+
D
B+
C
-B
B
-+
A
-++-+-

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.