最大不一致2シーケンスを圧縮する


18

長さ1160のこのバイナリシーケンスを出力します。

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

シーケンス

この有限なシーケンスは、圧縮のためのユニークな方法に役立つことを願って、しっかりと構造化されています。これは、以前の課題で取り上げられたエルドの矛盾の問題から生じます。

用語を+1および-1として扱うと、これは矛盾2の最大長のシーケンスであり、次のことを意味します。

すべての正のステップサイズでd、すべてのd'th項(th項から始まる)を取る場合d、結果のシーケンスの実行中の合計は-2から2までの範囲に残ります。

それぞれ+が右-へのステップを意味し、左へのステップを意味すると考える場合、これは、すべてのd命令のウォークが開始位置から2ステップ以上移動しないことを意味します。

たとえば、の場合、d=33項ごとに取得する+-++--+--+-...と、実行中の合計が[1,0,1,2,1,0,1,0,-1,0,1,...]-3または3にならないシーケンスが得られます。

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

このシーケンスは、コンピューター検索によって2014年に発見されました。シーケンスが付録Bに再現されているこのペーパーを参照してください。1160が不一致2シーケンスの最大長であることが証明されていますが、その長さのシーケンスは複数あります。2015年証明されたエルドの不一致の問題は、そのようなシーケンスcは2の代わりに最大の不一致のために有限の長さを持たなければならないと述べています。

所要時間

コードは5秒以内に終了するはずです。これは、総当たり攻撃を制限するためです。

出力フォーマット

あなたは、のために任意の2つの固定の異なる文字や値を使用することができます+し、-任意のリスト状または紐状の形式で。形式は、たとえばバイナリ表現を介して数値としてエンコードされたり、文字値を介して文字列としてエンコードされたりするのではなく、1160ビット値を直接読み取ることができる形式でなければなりません。文字列出力の場合、末尾の改行が許可されます。

リーダーボード


最も一般的な部分文字列の長さ1-16の誰もが知りたい場合
ASCIIのみ

...圧縮を打ち負かすことは非常に難しいだろうような気がします
Esolangingフルーツ

回答:


3

ゼリー、149 バイト

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

いくつかのパターンがあります。たとえば、シーケンスを8に切り分けると256の長さ8のバイナリ文字列のうち81だけが存在しますが、この単純なベースからバイトカウントを減らすために使用する方法に(少なくともまだ)気づいていません250圧縮がバイナリリストに変換されました。

オンラインでお試しください!(フッターは、直接比較しやすいようにバイナリリストを文字列にフォーマットします)。



3

JavaScriptの(ES6)、263の 253 252バイト

可能な限り少ないペイロードデータを使用しようとしました。残念ながら、驚くことではありませんが、これには非常に多くの解凍コードが必要です。

壊す:

  • ペイロードデータ:75バイト、100文字のBase64文字列としてエンコード
  • コード:163の 153 152バイト

以下は、データなしのフォーマットされたバージョンです。生コードはデモスニペットにあります。

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))
  :
    ''

どうやって?

すべてのi番目の項の累積合計a [i]を追跡します。これらの合計が下限-2に達するたびに、次の項がa +でなければならないことがわかります。同じロジックが上限に適用されます。これはi = 264まで役立ち、それ以上の余分なバイトを保存しません。

これにより、推測できない599の用語が残ります。それらを100文字のBase64文字列にエンコードされた⌈599/8⌉= 75バイトとして保存します。

デモ


3

ゼリー110個の 109 107バイト

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

TIOではこれに時間がかかりすぎますが、デスクトップコンピューターでは3秒未満で終了します。

オンラインでお試しください!


3

ゼリー135の 133 130 129 105 104バイト

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

シーケンスの以前の要素に基づいて、アルゴリズムは次の要素が何であるかを経験に基づいて推測します。これは、対応する要素を交換できるようにインデックスがハードコード化されている99個を除くすべての要素に対して機能します。

オンラインでお試しください!


2

MATL、224バイト

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"

出力の形式は1 0 0 1 0 ...、に1対応し'-'、に0対応し'+'ます。

オンラインでお試しください!

説明

シーケンスはランレングスエンコードされています。720のすべての実行の長さは1、2、3、または4で、3または4はそれほど一般的ではありません。したがって、各3は2、0、1に置き換えられ(2の実行、次に他のシンボルの0の実行、次に1の実行)、同様に各4は2、0、2に置き換えられます。長さ862の3項配列を返します。

この配列はベース94エンコードに変換され、コード('$Te...kG')に示されている長い文字列です。Base 94エンコードでは、単一引用符(エスケープする必要があります)を除き、95個の印刷可能なASCII文字すべてを使用します。

コードはその文字列をベース94からベース3に変換し、その結果を使用してシンボル[1 0 1 0 ... 0](長さ862の配列)をランレングスデコードします。


2

ゼリー、95バイト

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

以前の2つのアプローチの中間点。

コードは、シーケンスの842個の要素を推測し、残りの318個をハードコードします。19個の推測は正しくないため、ハードコーディングされたインデックスのリストを使用して元に戻す必要があります。

オンラインでお試しください!

使い方

“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


算術エンコーディングは、一部のエントリを手動で変更するよりも簡単だと思われます。あなたはそれを試してみましたか、それともゼリーはそれに適していませんか?
リルトシアスト

変更する必要があるエントリは19個のみで、23バイトでエンコードされています。算術デコーダは、少なくとも関連データがあれば、それよりも長くなると思います。
デニス

1

、150バイト

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

オンラインでお試しください!

Charcoalの組み込み文字列圧縮を使用します。用途.-!のため+


1

CJam、153バイト

"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

、およびを使用1します。-0+

印刷できないものが含まれています。オンラインでお試しください!

これは非常に簡単です。長いシーケンスをベース256からベース2に変換します。


1

Pythonの3236の 232バイト

4バイトを節約してくれたMegoに感謝

#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:])

オンラインでお試しください!

CP-437エンコードを使用します。エラーを指摘してくれたデニスに感謝します。


437はのエイリアスであるためcp437cp発生するたびにビットを削除することで4バイトを削ることができます。
メゴ


0

C#、385バイト


データ

  • 入力なし
  • 出力 Stringふりをした結果。

ゴルフ

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

非ゴルフ

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

完全なコード

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

リリース

  • v1.0の - 385 bytes-初期ソリューション。

ノート

  • なし

0

05AB1E、149バイト

•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

とてもつまらない。ただ圧縮された数字。用途1-0のために+

オンラインでお試しください!



0

ルビー、245バイト

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

+の場合は0、-の場合は1を出力します。

オンラインでお試しください!


0

Perl、164バイト

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

明らかな、退屈な解決策:すべてのビットを1バイトあたり8ビットのバイナリ文字列に入れるだけです。-に0、+に1を使用します。これをもう少しゴルフしてみます。


0

網膜、333バイト


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

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.