強盗:隠されたOEISサブストリング


23

これは警官と強盗の挑戦です。これが強盗のスレッドです。警官のスレッドはここにあります

警官はOEISから任意のシーケンスを選択し、そのシーケンスの最初の整数を出力するプログラムpを作成します。彼らはまた、いくつかの文字列を検索しますsp どこかに挿入する場合、このプログラムはシーケンスの2番目の整数を出力する必要があります。s + spの同じ場所に挿入する場合、このプログラムはシーケンスの3番目の整数を出力する必要があります。同じ場所にあるs + s + sは4番目を印刷し、以下同様に続きます。以下に例を示します。

Python 3、シーケンスA000027

print(1)

隠し文字列は2バイトです。

文字列は+1、プログラムprint(1+1)がA000027の2番目の整数を印刷するため、プログラムがprint(1+1+1)3番目の整数を印刷するためなどです。

警官は、シーケンス、元のプログラムp、および非表示の文字列sの長さを明らかにする必要があります。強盗は、その長さまでの文字列と、それを挿入してシーケンスを作成する場所を見つけることにより、提出物を解読します。文字列は、有効なクラックであるために意図したソリューションと一致する必要はなく、挿入される場所も一致する必要はありません。

警官の回答の1つをクラックした場合は、解決策(非表示の文字列と場所が公開されている)と回答へのリンクを投稿してください。次に、ここであなたのクラックへのリンクで警官の答えにコメントしてください。

ルール

  • ソリューションは、シーケンス内の任意の数、または少なくともメモリ制限、整数/スタックオーバーフローなどが原因で失敗する合理的な制限まで動作する必要があります。

  • 勝者の強盗は、最も多くの提出物をクラックするユーザーであり、タイブレーカーはその数のクラックに最初に到達します。

  • 勝利した警官は、割れていない最短の文字列警官です。Tiebreakerは最短のpです。ひびのない提出物がない場合、解決策を持っていた警官が最も長い間勝ちました。

  • 安全であると宣言するには、ソリューションを1週間クラックせずに、隠し文字列(および挿入する場所)を公開する必要があります。

  • sはネストできません。エンドツーエンドで連結する必要があります。たとえば、sがいた10、各反復は行くだろう10, 1010, 101010, 10101010...ではなく、10, 1100, 111000, 11110000...

  • すべての暗号化ソリューション(たとえば、部分文字列のハッシュのチェック)は禁止されています。

  • sにASCII以外の文字が含まれている場合は、使用するエンコードも指定する必要があります。

回答:


13

Python 2xnor によるシーケンスA138147

元の:

print 10

割れた:

print "1%s0"%10
      ^^^^^^^

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


3
わかった!それが私が考えていた解決策です。%左アソシエイトを考えると、それが機能するのは面白いと思います。
xnor

うん、ただしフォーマット文字列は文字列で、 "1%s0"% "1%s0"は "11%s00"であり、これは今でも望んでいたことを実行します。
ホッブズ

10

Brain-FlakニトロドンによるA000984

({({}<>({}))<>}<>){({}<>)<>}<>

これはわずか30バイトで、Nitrodonが何を念頭に置いていたかはわかりません。

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

説明

私は多くのことを試してみましたが、ここでうまくいきました。A000984の用語は、パスカルの三角形の中心要素です。

中心的な要素

今、私はそれらの上に対角線を追加することでそれらを得ることができることを理解しました:

例えば:

1+3+6+10=20

中央合計

そして、Nitrodonのプログラムの最終アクションはすべてをまとめることなので、これらは良い候補のように見えました(多くのことを試してみましたが、これはうまくいきました)。

したがって、1つの部分和を取り、次の和を生成するプログラムが必要です。幸いなことに、これらの1つから次の1つを取得するための非常にきちんとした方法があります。各行は、次の行のデルタです。つまりn行目の目用語との差であるn目とn1次の行の第用語。

次の行の式

1つの問題は、必要な行を計算するのに十分な最後の行がないことです。行がある場合、各行は最後よりも1つ長いため、このメソッドでは次の行の最後のメンバーを取得できません。ただし、ここには別のトリックがあります。各行の最後のメンバーは、その行の以前のすべてのメンバーと同じです。

1+3+6=10

最後のメンバー式

そして、もしあなたがBrain-Flakに精通しているなら、それは本当に簡単にできることとしてあなたに突き出るはずです。

次にコードについて:

開始するには、次の行の計算を行います。新しいメンバーはそれぞれ、隣接する2つの古いメンバーの合計です。それは次の方法で実行できます。

{({}<>({}))<>}<>

これは基本的に要素を移動し、その上に既にあったものを(削除せずに)追加します。ただし、これはすべてを逆にするので、次に行を取得するときには、元に戻す必要があります。

{({}<>({}))<>}<>{({}<>)<>}<>

次に、行の最後のメンバーを計算する必要があります。前に言ったように、これはとても簡単です。行のすべての要素をループしているので、その合計を取得してプッシュできます。2番目のループの前にプッシュするので、最後になります。

({({}<>({}))<>}<>){({}<>)<>}<>

以上です。


1
私が念頭に置いていたものよりもさらに良い。ただし、説明の1つの修正:ある対角線から次の対角線に移動するには、2つの古い数値を加算するのではなく、古い数値を新しい数値に加算します(古い対角線の累積和を計算します)。
ニトロドン

@Nitrodon説明が修正されました。自分のコードを読んでいた場合、それが間違っていることがわかりました。
小麦ウィザード

6

Brain-Flak、A000290Sriotchilism O'Zaicによる

元の:

((()))({}<>)

割れた:

((()))({}([])[]<>)
         ^^^^^^

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

代わりに:

((())([])[])({}<>)
     ^^^^^^

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


それが私の隠し文字列です!しかし、それは私がそれを置いていた場所ではありません。頑張ってください!
ウィートウィザード

1
@ SriotchilismO'Zaicそれからこれはオリジナルでなければなりません。
jimmy23013

6

MATLLuis MendoによるシーケンスA005206

元の:

voOdoO

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

割れた:

voOdoOdNq17L/k
      ^^^^^^^^

私はMATLの専門家ではありませんが、私が理解していることから、オリジナルvoOdoOは2つの空の配列と[0]スタック上の配列を作成します。これ[0]は、シーケンスの最初の要素として角括弧なしで印刷されるものです。その後、クラック/ソリューションは次のことを行います。

  • dスタックから要素を取り出し、(それが数値またはサイズ1の配列であると仮定して)空の配列に変換します。これらの空の配列は出力されませんが、スタックサイズに影響します
  • Nqスタックのサイズをカウントし、1を減算します。これは、n+1関数を評価するときの用語です(2から始まりd、スタックに目に見えないものが追加されるため、反復ごとに1ずつ増加するため)
  • 17L これは定数です Phi = (1+sqrt(5))/2
  • /kこれはfloor((n+1)/Phi)、シーケンスの要素を計算する式の1つです。この式はa(n) = floor(sigma*(n+1)) where sigma = (sqrt(5)-1)/2、アイデンティティを使用する場合を除き、OEISにリストされています(sqrt(5)-1)/2 = 1/Phi

私はMATLの専門家ではありません、あなたは1人になったと思います-:)参考のために、私の隠された文字列は\N17L/k&&コードの中央と最後の2つの異なる使用に注意してください)が、あなたの解決策はよりシンプルでよりエレガント
ルイス・メンド

5

Python 3- A__

print(100+-1)

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

ビール100本、追加-1して次の数字を取得する99など


7秒で私を打ちます。:)また、ルールではその長さまでの文字列を見つけることができるので、-1代わりに行うことができます。これをより明確にします。
DJMcMayhem

@DJMcMayhem投稿した後に読んだことがありますが、そのような簡単なクラックに追加の制限を加える方が楽しいです:-)
ジュゼッペ

5

、シーケンスA000045によって、A__

元の:

0.

割れた:

01":&+.
 ^^^^^

チャレンジは長さが6以下のサブストリングを見つけることでしたが、見つかったストリングの長さは5であることに注意してください。

樽の仕様を調べるにはあまりにも怠惰ている人のためのコマンドの定義: 0および1スタックにそれぞれの番号をプッシュします。 "スタックの上部をスタックの下部に移動します(ロール)。 &空の場合はスタックトップをレジスタにポップし、そうでない場合はレジスタをスタックに空にします。 +上位2つのスタック値を追加します。

イニシャル1"は、スタックの一番下に1を挿入するだけです。この1のリストは、最初の反復でのみ役割を果たします。最初の反復では、スタックが1 0単にではなくとして開始されると想定できます0。実際、プログラム10:&+.:&+一部が繰り返されるが、それは下部の1つのの成長のリストを持っていないことを除いて、上記の溶液とまったく同じ動作をします。

以来、&繰り返し部分に一度だけ使用されると動作を交互にしている、の挙動は1":&+繰り返しのパリティに依存します。

さて、このプログラムは実際には、最初から0、1で始まるフィボナッチ数列を出力しません。実際には、2番目、つまり0から1、0フィボナッチ数列を出力します(これにより、同じ数列が得られます)。これを知ると、プログラムは簡単に分析できます。

  • 最初、3番目、...の繰り返しで、状態は[a, b]として始まり、として終わりますa+b (&=b)
  • 2番目、4番目、...の反復では、状態は[b] (&=a)として始まり、として終わります[b, b+a]

これにより、必要に応じてシーケンスが実際に計算されます。


1
いいですね、今、私のような樽を使っている人がいます。
A̲̲

@A__元の6文字の文字列は何でしたか?:)
tomsmeding

実際には、文字列に非常に似ています。唯一の違いは:、文字列の先頭にコマンドを追加したことです。
A̲̲

これはあなたが見つけることができる最短の挿入された文字列ですか?
A̲̲

2
ああ。私はこれを見つけましたが、チャレンジが4バイト以下のときに戻ってきました。
Khuldraeseth na'Barya



4

Pyret、シーケンスA083420MLavrentyevによる

fold({(b,e):(2 * b) + 1},1,[list: 0,0,])
                                  ^^^^

ここで実行できますが、コードにリンクする方法がわかりません。コピーして貼り付ける必要があります。

提供される関数は、2番目の引数を無視します。最初に2つを追加し、1つを追加します。これにより、2^n - 1ここで必要なシーケンスが生成されます。必要なのは、折り畳まれたリストの長さを変更して、その操作を実行する回数を伝えることだけです。幸いなことに、Pyretは末尾のコンマについて文句を言いません。


4

Python 3、シーケンス NieDzejkobによる A268575

元の:

from itertools import product
S,F,D=lambda*x:tuple(map(sum,zip(*x))),lambda f,s:(v for x in s for v in f(x)),lambda s:{(c-48>>4,c&15)for c in map(ord,s)}
W=D("6@AQUVW")
print(len(W))

クラック(100バイト):

from itertools import product
S,F,D=lambda*x:tuple(map(sum,zip(*x))),lambda f,s:(v for x in s for v in f(x)),lambda s:{(c-48>>4,c&15)for c in map(ord,s)}
W=D("6@AQUVW");A=-1,1,0;*X,=F(lambda a:(S(a,x)for x in product(A,A)),W);W={p for p in X if 2<X.count(p)<4+({p}<W)}
print(len(W))

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

私が収集できるものから、元のコードは定義をセットアップして、非表示の文字列を可能な限り短縮し、初期のGame of Lifeパターンを定義しています。隠された文字列は、ConwayのGame of Lifeの反復を102バイトで記述することに相当します。

このクラックの目的のためにS、引数内の要素(反復可能)を合計しF、リストのすべての要素に反復可能を返す関数を適用し、すべての結果を一緒に粉砕する関数です。

  • ;A=-1,1,0;上記のステートメントを終了し、タプル(-1,1,0)をAで省略します。これはproduct(A,A)、指定されたセルおよびセル自体に関連するすべての隣接セルを提供するために使用されます。
  • *X,=F(lambda a:(S(a,x)for x in product(A,A)),W);各セルに隣接セルの相対位置を追加し、それらを一緒にリストに粉砕することにより、セルのXすべての隣接セルWとセルW自体を保持する新しいリストを作成します。
  • W={p for p in X if 2<X.count(p)<4+({p}<W)}このリストXを調べて、の各セルがX次の反復でセルのセットに属するかどうかを決定します。これはこのゲームオブライフゴルフからほとんど逐語的に取られました。

私はNieDzejkobの答え(102バイトの隠された文字列!)に非常に驚かされたので、StackExchangeに参加してクラックしようとしましたが、新しいアカウントは他の人の投稿にコメントできないため、ルールを完全に遵守できません(私のせいです)
リレソル

CGCCへようこそ!警官の回答についてコメントしました。頑張ってください!
ジョーキング

ありがとう!私はこれらのようなコードの挑戦を実際に試したことはありませんが、これを行うのは大変でした。
リレソル

よくやった!時間を見つけたら、意図した文字列を明らかにします。
NieDzejkob

3

Khuldraeseth na'BaryaによるHaskell、A014675

元のコード

main=print$uncurry(!!)([2],0)

サブストリングあり

main=print$uncurry(!!)                                   ([2],0)
                      $(\(a,n)->(a>>= \e->2:[1|e>1],n+1))

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


それでできます!flip take[1,2]その内側のラムダの代わりに持っていました。それ以外は同一。
Khuldraeseth na'Barya

1
Khuldraesethna'Barya @:(`take`[2,1])でも、1バイト短いです
nimi

その刺し傷。たぶん、私はこれに気づいたら、これを少しでも安全に持っていたかもしれません。(`take`)コンパイルエラーに遭遇したので、私もそう思いました(`take`[2,1])。:(
Khuldraeseth na'Barya



2

Python 3 - agtoever

from sympy import isprime, primerange
from itertools import count
r=1
r+=1
while isprime(r-2)or r&1<1and r>3:r+=1
print(r)

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


2
Goldbachの推測について尋ねた理由は、このようなソリューションは、シリーズに2以外の偶数のエントリがある場合、正しくないということです。推測を推測できない場合、これは機能すると思いますが、同じ基本を使用しますアイデア(これをクラックとしてお気軽に、私はただ独創的になりたいです)。
FryAmTheEggman

いい解決策。私よりも短い。明日(CET)に投稿します。現在、手元にコードがありません。私のソリューションはジェネレーター式を使用し、Gb推測に依存していませんが、それでもこれはよくゴルフされた(そして私の意見では予選)答えのままです。
合計

1
@FryAmTheEggmanええ、OEISの「公式」セクションでは、推測に依存することについて言及していませんでした...証拠付きbrb;)
NieDzejkob

2

MATLLuis MendoによるシーケンスA000796

元の:

'pi'td1_&:_1)Y$J)

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

割れた:

'pi'td1_&:|SQ_1)Y$J)
          ^^^

元の作者は、こっそり[-7:-1]と配列を作成し、取得するためにその最初の要素を抽出して否定しました7。次に、それを使用して、丸められたpiの7桁目(3)を取得し、それをpiの最初の桁として提示しました。を追加する|SQと、元の配列がすべて正になり、並べ替えられ、すべてに1が追加されます。この手段そのすべての代わりに、インデックス取得した後、7それがインデックスを取得し-2、一つのアプリケーションの後に-3二つのアプリケーションの後に、というように。これ-Y$、数字を丸めないように関数に指示するため重要です。


私の正確な隠し文字列!よくやった!
ルイスメンドー

2

Forth(gforth)A000042NieDzejkobによる

.( 1)1 .
^^^^^

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

些細な1バイトは、単純にリテラルを拡張しています。問題は、19桁目で64ビットがオーバーフローすることです。簡単な修正方法は、1桁の数字を繰り返し印刷することです。ええ、しかしそれはそれほど簡単ではありません。タックしますが1 .最後にすると実際に必要な追加の数字が印刷されますが、スペースで区切られます。それはうまくいきません。

さて、ウィキペディアによると、「.((ドット括弧)は、括弧で区切られた文字列を解析して表示する即時の単語です。」幸いなことに、その表示には他の奇妙な文字はないので.(、単一の1を印刷するのに使用すれば十分です。そしてそれは。クローズパレンの後にスペースは必要ありません。したがって、これらの5つの文字(オープ​​ンパレンの後にスペースがあります)は、私たちの心のコンテンツに繰り返すことができます。実証するために、64ビット整数を数回オーバーフローさせた例をTIOに含めました。魔法のように機能します。


よくやった!それはまさに私の文字列です。
NieDzejkob

2

Unefunge-98(PyFunge)、シーケンスA000108NieDzejkobによる

1# 2g1+:2p4*6-*2g/.@
 ^^^^^^^^^^^^^^^^^

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

6回繰り返した

許可された19の2バイトを許可します!空白のように見えるものは、実際には0x01のヘッダーの開始文字です。

説明:

この挑戦は、おそらくa(n)から生成するa(n-1)ことnです。OEISは、次のa(n) = (2n)!/(n!(n+1)!)ように簡単に変換できる明示的な式を提供しますa(n) = a(n-1) * (4n-6) / nます。これをFungeに実装します。

私は間のコードを挿入しなければならない1.。それはすでに行われたパズルの半分です。残っているのは、挿入するコードです。Fungeはスタック操作ツールに特に欠けているため、スタックの底は立ち入り禁止です。両方を追跡する必要がnありますa(n)スタックを成長なし。そして、Fungeスペースを使用するよりもこれを行う方が良いでしょうか?

その0x01文字は私のカウンターnです。私a(n)のスタックは、ビットが実行を終了した後もスタック上にある必要があるため、保持します。

1# 2g1+:2p4*6-*2g/.@
1                       Push 1. This is a(0).
 #                        Skip the next instruction. Without this, I believe the instruction pointer will reverse direction upon encountering 0x01.
   2g                     Push the third character in the source, which starts out as 1.
     1+                   Increment it...
       :                  ...copy it...
        2p                ...and put it back. One copy remains atop the stack.
          4*6-            Multiply by four. Subtract six.
              *           Multiply by a(n), leaving the result alone on the stack.
               2g         Push n again...
                 /        ...and divide our intermediate result by it. Ta-da!
                          At this point, the stack is the same as at the start of the indented block, except the one item has been advanced one place in the sequence.
                          The source of the program has changed; the third character holds the number of times this indented block has run.
                  .@    Print and terminate.


2

V、A000290DJMcMayhem

é*Ä2é*Ø.
  ^^^^

1から平方を求めます。

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

ベースは、バッファ全体に改行以外の文字の数をé*挿入*してØ.カウントします。挿入Äにより、先頭行が独自の行に複製され、その行にが2é*挿入され**ます。挿入を連結すると、一番上に最大の連続した奇数が生成されます。最終的Ø.には、最初のn個の奇数を合計するため、n番目の平方が得られます。


ああ、奇数を合計すると、私はそれについて考えませんでした。うまくやった:)私はフレーズスクエアナンバーを文字通りもっと取りましたÄÎé*<CR>
DJMcMayhem

@DJMcMayhem私も最初は同じように思っていましたが、何かをめちゃくちゃにしたり、6バイト落としたりしたので、奇数を合計することによるbrainflak wikiの平方数構築に触発されたこの別のアプローチを試してみました。
Kritixi Lithos

2

AsciiDots、シーケンスA019523によってアリオン

\ +++ /
// \ / \

一度!

二回!

十回!

コード/言語がどのように機能するかを理解しようとしたときに、既存のコードの最初の2行がフィボナッチ数列を無限に出力するすべての作業を行うことを学びました。ドットがにヒットする&とコードが終了するため、残りの行にさらに遅延を追加して、適切な数のエントリを出力できるようにするだけで済みました。

試行錯誤を繰り返した結果、正しい遅延間隔は数値ごとに16時間単位であることがわかりました。1行に十分な文字を収めることは実行不可能であるように思えたため、実際の遅延に10文字を残して、2行に遅延を配置する必要があります。パターンがそれ自体と一致するためには、両方の行に5文字が必要であり、行の中央の3文字を2回トラバースできるため、必要に応じて16時間単位になります。

これを&8列目に一致させる必要があるため、3行目の内部の改行で開始できることに気付くまで、これは不可能に思えました。これにより、最後から2番目の行が適切な長さになり、3行目の現在冗長な端が削除されます。


1
以下も動作します:\v/v>-----)
SamYonnou

お疲れ様でした。@SamYonnouは意図したソリューションに近かった。さらに、別の解決策に向かっているにもかかわらず、思考プロセスが意図したプロセスに似ていたことを嬉しく思います!
アリオン

2

ブラキログ無関係な文字列による配列A114018

元のプログラム:

≜ṗ↔ṗb&w

挿入する文字列:

≜ṗ↔ṗẹbb&w
    ^^

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

説明

最初に元のプログラムの説明があります(使用されているシーケンスが「桁反転も素数である最下位n桁素数」であることを知っている)

≜         Assign an integer value to a variable named ? 
            (try 0, then 1, then -1, then 2, etc.)
 ṗ        ? must be prime
  ↔ṗ      The reverse of ? must be prime
    b     Remove the first element of ?
     &    Ignore that we removed that element
      w   Write ? to STDOUT

あなたが見ることができるように、プログラムは1つのことを除いてかなり簡単です:完全に役に立たないことがあります b - behead述語呼び出しがあります。これは、数の逆の最初の要素を削除します。

これは、文字列を見つける方法に関する明確な手がかりです。アイデアは、文字列を追加するたびに数字の長さを1桁ずつ増やしたいので、その役に立たないものを使用して、その数字の長さを何らかの方法で「評価」する文字列が必要だということです。bです。

解決策は次を使用することẹbです:最初に、ẹ - elements数字を数字のリストに変換します。その後、b - behead最初の要素が削除されます。トリックはb、数字のリストが空の場合に失敗するということです。したがってb、を追加するたびに、必要な数値の長さを1増やします(割り当てられた値?が十分に多くの数字を含むようになり、最後のb数字が1桁のリストに適用される)。

毎回の再適用は、すでに数字のリストであるため効果がありません。9001数字のリストの代わりに数字のように頭を切ると、数字の数001 = 1に関する情報が失われるため、最初に一度だけ必要です。


1
とてもうまくできました。私はこの9001b1問題を考えたことがありませんでした。実際には、数字bリストが空の場合は失敗しますが、実際にリストを持っていない場合は失敗しません.1桁の数字は0を含み、0自体を含みます。
無関係な文字列

1
@UnrelatedString要するに:b奇妙です
致命的です

2

VDM-SLA000312期限切れデータ別

let m={1|->{0}}in hd reverse[let x=x+1 in x**x|x in set m(1)&x<card m(1)]
                             ^^^^^^^^^^^^^

VDM-SLのためlet-expressionsが再結合することができる既に囲み範囲にバインドされている変数は、x**xスコープ内の任意深くネスト評価することが可能なx原稿をしながら、もう一つ前の範囲でよりxの基数よりも依然として小さいですm(1)


n = 11までテストし、正常に動作しました
無関係な文字列

... 1つの数字のみであることになっています。If you insert s somewhere into p, this program must print the second integer from the sequence. If you insert s + s into the same location in p, this program must print the third integer from the sequence. 例の動作に注意してくださいprint(1)
無関係な文字列

Ah rip、わかりやすい
無関係な文字列

1
これはささいなことだとは思わないでください。
期限切れデータ

1
++オーバーライドのマッピングに使用
期限切れデータ


2

HaskellA000045(フィボナッチ)リンのフーリエ変換による

f = head $(flip(:)<*>sum.take 2)[0, 1]
         ^^^^^^^^^^^^^^^^^^^^^^^

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

正確に23バイト。

これは楽しかったし、少しトリッキーだった。0と1を逆にすると、それが問題ではないことに気付く前に、少しの間私を追い払った。$オリジナルに欠けていたので、$...$id(1バイトが長すぎる)ような大ざっぱなものを試してみてから、すべてをかっこで囲むことができました。全体として、素敵な小さなパズル。

H.PWizは、パターンマッチングで少なくとも5バイトは節約できたと指摘しています$(\[x,y]->[y,x+y])。その無意味な挑戦は、どこでも無意味だと考えさせられます。

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