Comprimi una sequenza discrepanza-2 massima


18

Emetti questa sequenza binaria di lunghezza 1160:

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

La sequenza

Questa sequenza finita è strettamente strutturata in un modo che spero presti metodi unici per la compressione. Deriva dal problema della discrepanza di Erdő, che era stato presentato in una precedente sfida .

Considerando i termini come +1 e -1, questa è una sequenza di discrepanza di lunghezza massima 2, il che significa che:

Per ogni dimensione di gradino positiva d, se prendi ogni dtermine (a partire dal dtermine), la somma corrente della sequenza risultante rimane compresa tra -2 e 2 inclusi.

Se pensate che ciascuno +significhi un passo a destra e -un passo a sinistra, ciò significa che il cammino di ogni distruzione non si sposta mai più di 2 passi dalla posizione iniziale.

Ad esempio, d=3prendere ogni terzo termine fornisce la sequenza +-++--+--+-..., le cui somme correnti sono [1,0,1,2,1,0,1,0,-1,0,1,...], che non raggiungono mai -3 o 3.

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

Questa sequenza è stata trovata nel 2014 tramite una ricerca al computer. Vedi questo documento , in cui la sequenza è riprodotta nell'Appendice B. La ricerca dimostra che 1160 è la lunghezza massima di una sequenza discrepanza-2, sebbene vi sia più di una sequenza di quella lunghezza. Il problema della discrepanza di Erdő, dimostrato nel 2015 , afferma che una tale sequenza deve avere una lunghezza finita per qualsiasi discrepanza massima cal posto di 2.

Tempo richiesto

Il codice dovrebbe terminare entro 5 secondi . Questo per limitare la forza bruta.

Formato di output

È possibile utilizzare due caratteri o valori distinti fissi per +e -in qualsiasi formato simile a elenco o stringa. Il formato dovrebbe essere quello in cui i valori di 1160 bit possono essere letti direttamente, non ad esempio codificati come numeri tramite la sua rappresentazione binaria o come stringa tramite valori di caratteri. Per l'output di stringa, è consentita una nuova riga finale.

Classifica


sottostringhe più comuni di lunghezza 1-16 se qualcuno vuole sapere
solo ASCII

Sento che sarà molto difficile battere la compressione ...
Esolanging Fruit

Risposte:


3

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

C'è qualche modello, ad esempio solo 81 delle 8 stringhe binarie di lunghezza 256 sono presenti se si taglia la sequenza in otto, ma non ho (almeno ancora) notato alcun modo per utilizzarne uno per ridurre il conteggio dei byte da questa base diretta 250 compressione convertita in un elenco binario.

Provalo online! (il piè di pagina formatta l'elenco binario in una stringa per facilitare il confronto diretto).


3

Pitone 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

Provalo online!


3

JavaScript (ES6), 263 253 252 byte

Ho cercato di utilizzare il minor numero possibile di dati sul payload. Purtroppo - ma non a sorpresa - questo richiede un sacco di codice di decompressione.

Abbattersi:

  • dati del payload: 75 byte, codificati come una stringa Base64 di 100 caratteri
  • codice: 163 153 152 byte

Di seguito è una versione formattata senza i dati. Il codice non elaborato si trova nello snippet 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))
  :
    ''

Come?

Teniamo traccia delle somme correnti un [i] di ogni i -esimo termine. Ogni volta che una di queste somme raggiunge il limite inferiore -2 , sappiamo che il termine successivo deve essere un + . La stessa logica si applica al limite superiore. Questo è utile fino a i = 264 e non salva alcun byte aggiuntivo oltre a quello.

Questo ci lascia con 599 termini che non possono essere indovinati. Li memorizziamo come ⌈599 / 8⌉ = 75 byte, codificati in una stringa Base64 di 100 caratteri.

dimostrazione


3

Gelatina , 110 109 107 byte

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

Questo richiede troppo tempo su TIO, ma termina in meno di 3 secondi sul mio computer desktop.

Provalo online!


3

Gelatina , 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-ṭ
Ç⁽¡ɠ¡Ḋ

Basato sugli elementi precedenti della sequenza, l'algoritmo fa un'ipotesi istruita su quale potrebbe essere l'elemento successivo. Funziona con tutti gli elementi tranne 99, i cui indici sono codificati in modo tale che gli elementi corrispondenti possano essere scambiati.

Provalo 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"

L'uscita è della forma 1 0 0 1 0 ..., dove 1corrisponde '-'e 0corrisponde a '+'.

Provalo online!

Spiegazione

La sequenza è stata codificata per la durata. Tutte le 720 corse hanno lunghezze 1, 2, 3 o 4, con 3 o 4 meno comuni. Quindi ogni 3 è stato sostituito da 2, 0, 1 (una corsa di 2, quindi una corsa di 0 dell'altro simbolo, quindi una corsa di 1 di nuovo) e allo stesso modo ogni 4 è stato sostituito da 2, 0, 2. Questo fornisce una matrice ternaria di lunghezza 862.

Questo array viene convertito in codifica base-94 ed è la stringa lunga mostrata nel codice ( '$Te...kG'). La codifica Base 94 utilizza tutti i 95 caratteri ASCII stampabili ad eccezione della virgoletta singola (che dovrebbe essere salvata).

Il codice converte quella stringa dalla base 94 alla base 3 e utilizza il risultato per decodificare la lunghezza dei simboli [1 0 1 0 ... 0](array di lunghezza 862).


2

Gelatina , 95 byte

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

Un punto centrale tra i miei due precedenti approcci.

Il codice tenta di indovinare 842 elementi della sequenza e codifica i rimanenti 318. 19 delle ipotesi sono errate e devono essere ripristinate tramite un elenco di indici codificati.

Provalo online!

Come funziona

“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


Sembra che la codifica aritmetica sarebbe più semplice della modifica manuale di alcune voci; l'hai provato o Jelly non è adatta a questo?
lirtosiast

Ci sono solo 19 voci che devono essere modificate, che sono codificate in 23 byte. Penso che un decodificatore aritmetico sarebbe più lungo di quello, almeno con i dati associati.
Dennis,

1

Carbone , 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”

Provalo online!

Utilizza la compressione delle stringhe incorporata di Charcoal. Utilizza .per -e !per +.


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

Utilizza 1per -e 0per +.

Contiene non stampabili. Provalo online!

Questo è abbastanza semplice Converte una lunga sequenza dalla base 256 alla base 2.


1

Python 3 , 236 232 byte

Grazie a Mego per aver salvato 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:])

Provalo online!

Utilizza la codifica CP-437. Grazie a Dennis per aver segnalato un errore.


437è un alias per cp437, quindi puoi radere via 4 byte eliminando i cpbit entrambe le volte che si verificano.
Mego,

0

Python 2 , 364 250 byte

Grazie a Jonathan Allan per aver salvato 114 byte.

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

Provalo online!


0

C # , 385 byte


Dati

  • Inserire nessuno
  • Uscita String Il risultato preteso.

golfed

()=>{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;};

Ungolfed

() => {
    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;
};

Codice completo

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

Uscite

  • v1.0 - 385 bytes- Soluzione iniziale.

Appunti

  • Nessuna

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

Super noioso. Solo un numero compresso. Utilizza 1per -e 0per +.

Provalo online!


0

PHP, 276 byte

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

Provalo online!


0

Rubino , 245 byte

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

Uscita 0 per + e 1 per -.

Provalo 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.'

La soluzione ovvia e noiosa: basta inserire tutti i bit in una stringa binaria, 8 bit per byte. Usa 0 per - e 1 per +. Proverò a giocare ancora a golf.


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
-++-+-

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.