ミステリーストリングプリンター(強盗)


26

警官のスレッドはここで見つけることができます:ミステリーストリングプリンター(警官)

あなたの挑戦

  • copsスレッドから送信を選択し、そのスレッドの回答から文字列を出力します。
  • 選択する提出は安全ではありません(7日より新しいものでなければなりません)。
  • プログラム、関数、またはREPLスクリプトは、警官のスレッドと同じルールに従う必要があります。要約すると:

    • プログラムは128文字以下である必要があります(警官の提出が短いプログラム長の範囲にある場合、プログラムもその長さの範囲にある必要があります。たとえば、警官のプログラムが≤32バイトの場合、プログラムは≤32バイトでなければなりません)。
    • プログラムは、実行されるたびに同じ出力を生成する必要があります。
    • 暗号化機能はありません。
    • プログラムは入力を受け付けてはなりません。
    • 標準的な抜け穴はありません。
  • すべての新規提出には同じ言語を使用する必要があります。このルールが作成される前からの提出は、たとえそうでなくても問題ありません。

得点

スコアリングは強盗でも同様に機能しますが、わずかに異なります。

  • ≤8バイトのプログラムをクラックすると、1ポイントが与えられます。
  • 16バイト以下のプログラムをクラックすると、2ポイントが与えられます。≤32バイトは4ポイントなどを与えます。
  • 追加の提出ごとに、長さに関係なく、+ 5ポイントを獲得します
  • 各警官の提出は一度しかクラックできません。各提出をクラックした最初の人だけがポイントを獲得できます。

提出

各回答には、

  • 警官の提出へのリンク。
  • あなたのプログラムとプログラミング言語。
  • また、ヘッダーの最後の数字として、警官のプログラムの長さ(2の累乗)を指定します。

さらに、回答へのリンクを使用して警官の提出についてコメントしてください。

リーダーボードを生成するスタックスニペットを次に示します。スニペットに問題がある場合は、コメントを残してください。すべての公開警官の提出を確認したい場合は、警官の課題のスニペットを参照してください。

このコンテストは終了しました。

総合優勝者:kennytm

ほとんどの提出:Sp3000

(スコアの計算時にクラックされたプログラムの長さがカウントされるため、提出の量は正確にポイントに変換されないことに注意してください)。


注:追加の提出ごとに5ポイントが獲得されます
ダニエルM.

回答:


29

Pyth、デニス、≤8

V./Tp*FN

楽しかった-最も難しいのは、Pythで十分に短くする方法を見つけ出すことでした。

分析

最初1234は、おそらくセパレータなしで印刷された数字のリストを扱っていることを示唆しています。理にかなった方法で数値を分割してみましょう:

1 2 3 4 4 6 5 8 8 9 6 12 10 12 7 16 16 18 12 15 16 8 24 20 24 14 27 18 20 9 32 32 36 24 30 32 16 36 21 24 25 10

私たちが正しい軌道に乗っているといういくつかのヒントがあります:

  • すべての数値の素因数は10未満です
  • 多くの数字はリストのインデックスにかなり近い

ただし、いくつかの特性があります。インデックス23の数は24であり、インデックスの数がインデックス自体よりも大きい唯一のケースです。ただし、より大きな手がかりは、いくつかの数字が隣人よりも明らかに小さいことです。特に、インデックス15の7、インデックス22の8、インデックス30の9です。

これは、7-8-9パターンを形成することに注目し、我々はまた、最後の番号は、上の@Dennisの最近の問題を考えると、インデックス42で10であることがわかりますアーベル群を、OEIS上の迅速なチェックはそれが明らかになった15, 22, 30, 42のサブシーケンスであるパーティション数字。Pythにはパーティション用のビルトインがあり、8文字のうち2文字を提供します。./

ただし、最後の数字は10であることに注意してください。これは、10がPythで事前に初期化された変数であるためTです。./T番号10の42個のパーティションの完全なリストを提供します。これは便利なようです。

現在、セパレータなしで印刷が行われているため、これはの使用を示唆していますp。おそらく、各パーティションをループし、それに対して何かをしてからp?これにより、次のテンプレートが提供されます。

V./Tp??N

where Vは、反復可能要素をループして、変数に各要素を格納するforループですN

最後から2番目のパーティション(5, 5)をざっと見てみると、製品を購入したいことが明らかになります。乗算によってリストを減らす素朴な方法は

u*GHd1

d問題のリストはどこですか。ただし、これは長すぎます。

残念ながら、これは私が総当たり攻撃を引き出す必要があった場所です。私はしばらくPythに追いついていないので、新しい機能の多くを知りませんでした。残り2文字で、完全に実行可能に見えました。

ブルートフォーサーが戻ってきました:

V./Tp*FN

どこ*Fで折ります*(乗算)。検索で見つけられなかったのも不思議ではありません。「fold」ではなく「reduce」というキーワードを検索していました。


3
7でも可能:jk*M./T
ジャクベ

@ジャクベああ、すごい、範囲があったなら、<= 7私は運命づけられていただろう。私が言語をチェックアウトしてからしばらく経ちました。
Sp3000


9

> <>、VTCAKAVSMoACE、≤64

'9?':?!;1-$:'@'+o'3'*'='%$30.

皮肉なことに、これは範囲の制限がはるかに低いだけでなく、ポータブルであり、オンライン通訳と連携します

分析

ターゲット文字列から始めましょう:

yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh[

> <> は文字列モードで、'または"文字列モードでスタックに文字をプッシュしますが、印刷する63文字と処理する64バイトのみで、大文字の存在(標準的なループアラウンドトリックでは> <>の無効な命令)が直接印刷を行います不可能。したがって、コードポイントを使用して何かを行う必要があります。

コードポイントに変換すると、次のようになります(ここではPythonを使用しています)。

>>> L = [ord(c) for c in "yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh["]
>>> L
[121, 104, 91, 99, 80, 87, 78, 107, 122, 94, 69, 75, 76, 66, 105, 81, 77, 117, 83, 118, 73, 96, 110, 92, 89, 119, 124, 74, 86, 88, 68, 85, 98, 90, 109, 102, 111, 82, 67, 95, 120, 114, 113, 123, 84, 108, 112, 72, 106, 71, 116, 93, 79, 97, 100, 70, 65, 115, 103, 101, 121, 104, 91]

最後の3つの数字は最初の3つの数字と同じであることに注意してください。これは、進行中の可能性のあるモジュロループを示唆しています。

さまざまな要素がいくつあるかを見てみましょう。

>>> len(set(L))
60

には63個の要素がLあり、最初の3つは最後の3つと一致しています。これは、この衝突を除いて、他のすべての要素が一意であることを意味します。今、これは素数を法とするべき乗を取るようなものを示唆しています。確かに、60 + 1 = 61素数であり、これは良い兆候です。

最小の要素を見つけてみましょう

>>> min(L)
65

それを使用して、min要素が1になるようにすべての要素を縮小します。

>>> M = [x-64 for x in L]
>>> M
[57, 40, 27, 35, 16, 23, 14, 43, 58, 30, 5, 11, 12, 2, 41, 17, 13, 53, 19, 54, 9, 32, 46, 28, 25, 55, 60, 10, 22, 24, 4, 21, 34, 26, 45, 38, 47, 18, 3, 31, 56, 50, 49, 59, 20, 44, 48, 8, 42, 7, 52, 29, 15, 33, 36, 6, 1, 51, 39, 37, 57, 40, 27]

後の要素がどのように注意1です51。何らかの種類の累乗/乗算が行われている場合、これは乗数の良い推測です。

試してみましょう:

>>> (57*51)%61
40
>>> (40*51)%61
27
>>> all((x*51)%61 == y for x,y in zip(M, M[1:]))
True

ビンゴ!次のコードを提供して、バックトラックできます。

x = 57
for _ in range(63):
    print(chr(x + 64), end="")
    x = (x*51)%61

その後、> <>に翻訳されました


1
興味深いことに、これは私がやったこととは異なる多くの方法です-私は37と112を使用しました(101を使用することを意図していますが、コードでミスを犯しました。Epicは失敗します)読み取り可能なASCII範囲に入ります。+1よくやった。
アディソンクランプ

非常に素晴らしい、それができたらいいのに;)
Jアトキン

7

Pyth、Maltysen、≤4

C.ZG

ブルートフォースは非常に時間がかかったので、手動でより速くしました。

分析

C(文字列を基数256の整数に変換する)は、Pythで大きな数を生成する最も簡単な方法であるため、おそらく最初の文字です。ベース256から変換すると、次のようになります。

xÚKLJNIMKÏÈÌÊÎÉÍË/(,*.)-+¯¨¬ 

うーん...あまり明るくない。

これGがアルファベット文字列です"abc...z"。これは長い文字列をフィードするソースになりそうCです。私が見つけるドキュメントを見て:

.Z    Compresses or decompresses a string.

ここで圧縮を扱っている場合、あらゆる種類の拡張ASCII文字を取得しても驚くことではありません。C.ZGそれから試してみると答えが得られました。


6

フーリエ、ベータ崩壊、≤32

2~x1~y20(xoy~z*x~yz~xq^~q)

または、CJamで:

X0I{_2$+}*]2\f#

分析

最初に、2の多くの能力を見ることができます。

2
1
2
2
4
8
32
256
8192
2097152
...

これらの数値の2を底とする対数を取ると、次のようになります。

1 0 1 1 2 3 5 8 13 21 ...

で始まるフィボナッチ数列1, 0です。


6

カタツムリ、feersum、≤2バイト

z

これは実際には2バイトです。文字のz後に改行が続きます\n

それが動作するか、それがやっている何が、とは別に、すべての可能な入力をテストした後どのように私は考えている~+~,、これが生産する唯一の2バイトのプログラムだっ8出力として。

そして、この結果を得るには何年もかかりました。「カタツムリ」と呼ばれるのも不思議ではありません:-D


自己への注意:未知のソフトウェアを次にファズテストするときは、VM内で実行します。


5

Rust、Liam Noronha、≤128バイト

fn main(){print!("AACAAEGAAACIIMOAAACAAEGQQQSYYDFAAACAAEGAAACIIMOHHHJHHLNXXXAGGKMAAACAAEGAAACIIMOAAACAAEGQQQSYYDFOOO");}

文字列をそのまま逐語的に印刷するのは120バイトです...


1
すごい遅かった。すみません 労力をかけずにテキストをかなり長くすることもできました。実際のソースを投稿します。
リアム



5

CoffeeScript、user2428118、≤64

alert 0+(btoa k.substr -2 for k of document.body.style).join ''

(警官の説明に従って、Chrome 46.0.2490.71でのみ動作します。)


出力は、すべての「=」のため、明らかにbase64でエンコードされた短い文字列の連結です。それらをデコードすると、次のような2文字の文字列のリストが見つかります。

['nt', 'ms', 'lf', 'ne', 'll', 'on', 'ay', 'on', …

意味をなさないようです。しかし、私は、それにいくつかの奇妙なアイテムを見つけるようにnXしてtY。これらをフィルタリングした後、取得します

>>> # Python
>>>
>>> [i for i in tt if not re.match('[a-z]{2}$', i)]
['nX', 'nY', 'tX', 'tY', 'wX', 'wY', 'r', 'nX', 'nY', 'tX', 'tY', 'nX', 'nY', 'nX', 'nY', 'nZ', 'x', 'y']

これらのXとYは、のような位置プロパティを使用した元のソースコードを示しているようoffsetX/Yです。特に興味深いのはnZアイテムです。仮定を確認するために、「Z」で終わるすべてのプロパティを検索しました。

// CoffeeScript
checked = []
f = (o) ->
    if !(o in checked) 
        for k of o
            if /Z$/.test(k)
                console.log(o, k)
            if o[k] instanceof Object
                f o[k]
f window

のトンを示していますCSSStyleDeclaration, "webkitTransformOriginZ"。このことから、リストがstyleオブジェクトのすべてのキーの最後の2文字で構成されているという強力な兆候があります。上記のテストは実際に正しいことを示しています。


おめでとうございます!元のソースコード
-user2428118

5

Lua <= 4、Egor Skriptunoff

多くのユーザーがチャットでこの答えに興奮していたので、私は彼らの悲惨さから解放しなければなりません。私はLuaを知らず、それをテストすることができませんでしたが、これが機能しない場合は非常に驚くでしょう。

4^~9

これは非常に明白ですが、ビット単位の演算子はバージョン5.3でのみ追加されたため、おそらく誰も理解できませんでした。ideone.comのバージョンは5.2のみです。


facepalm整数のみを使用するため、ビット単位の演算子を見落としていました。
LegionMammal978

5

Python 2、ヒストクラット、≤16

[[[51002**3/6]]] 

最大のヒントは、Python 3では機能しないという約束です。Python3では何が変更されましたか?最大の疑いは、除算演算子がfloatPython 3でa を返すことです。

解決策は、フォーム⌊αであると仮定し、私はそうβ累乗は、膨大な数を作成するための唯一の方法である短いよう、/n⌋= C = 22111101102001。

{α、β、n}が実際に解を形成する場合、(cn)1 / β≈α は整数に非常に近いはずです。したがって、各nに対して{α、β}をブルートフォースするために、次を使用します。

(* Mathematica *)
n=2; Sort[Table[{N[Abs[k - Round@k] /. k -> (22111101102001*n)^(1/b), 12], b}, {b, 2, 50}]]

(* Output: {{0.00262542213622, 7}, ...}

   The first number is the "quality" of the solution, lower is better.
   the second number is β.
   Thus α ≈ (nc)^(1/β) = 89
   But (89^7)/2 = 22115667447764, which is still far away from the answer.

*)

n = 6の場合、実際の結果はすぐに現れます。


よくやった!それが意図されたソリューションであり、誰かがそれを解決することをどのように期待したかについてです(ただし、それがプラットフォームにどれだけ依存していたかを事前に認識していませんでした)。
-histocrat

4

MATLAB、StewieGriffin、≤16

[36;87]*' |'*5

プリント:

ans =
        5760       22320
       13920       53940

いいね!うれしいあなたはそれが好き:-)私はそれをやった方法を:5*'$W'.'*' |'
スティーヴィーグリフィン

私は、例えば.735の代わりに乗算することでもっと難しくすることを考えていました、do +5、または3x3マトリックスにしますが、これはもっと楽しいと思いました。残りの3バイトで多くのことができたでしょう。
スティービーグリフィン

@StewieGriffinこれまでに出会ったことはありません.'が、完全に理にかなっています-括弧に頼らずに文字列を転置する方法を疑問に思っていました。
トムカーペンター



4

Python、spacemanjosh、≤64

n=0;d=1;L=[]
exec("L+=[10/(100-n)**.5];n+=d;d+=2;"*10)
print(L)

栄光の逆シンボリック計算機。ゴルフは上手ではありませんが、ちょっと似合います。

編集:私はそれをゴルフしました。

print([10/(100-n*n)**.5for n in range(10)])

4

JavaScript ES6、CᴏɴᴏʀO'Bʀɪᴇɴ、≤128バイト

var x=122,s='0037122342526683102122';for(var i=23;i<=505;i+=2)s+=(x+=i);s;

128バイト近くは必要ないので、これが正しいとは思いませんが、繰り返しシーケンスを見つけるのは楽しいチャレンジでした。


ワオ。私はまったく異なる方法を使用しました。それでもカウントされますか?:3
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴは通常そうです。私は、ループ初期化で何かファンキーを推測するだろう、オリジナルとどのようなものの、それらの最初の22のバイトを生成について本当に好奇心が強い
SLuck49

時間があるときに投稿します。関数s * s-s /(5-s)のフローリング
コナーオブライエン

4

Thue、ppperry、<= 64

0::=11
1::=22
2::=33
3::=44
4::=55
a::=bbb
b::=000
::=
aaaaaaa

2016年を本質的にその主要な要因に分解します。62文字なので、これはあなたが望んでいたものに似ていると思います。


0 :: = 2222を実行して、いくつかのバイトを節約できます。
リトシアスト

公正な点、しかし少しエレガントではないようです。
-histocrat


4

> <>、Sp3000、<= 8

'l(?; o>

命令ポインタが折り返され、次の手順が実行されます。

  • 'l(?; o>'のASCII値をl(?; o>スタックにプッシュします
  • l スタックのサイズをスタックにプッシュします
  • (上の2つのスタック要素を比較しますsize of stackと、ord('>')
  • ?; スタックサイズが大きければプログラムを停止します
  • oスタックの一番上の要素を文字として出力します(これは常にになりますo
  • > IP方向を設定します。ここではノーオペレーションです。
  • 最初のステップに戻ります

出力はooooooooooooです。

[space]スタックをプッシュまたはポップするものに変更し>、プッシュまたはポップする可能性があるの代わりに別の有効な文字を使用することで、さまざまな出力を得ることができます。


いいね!参考のために、私が持っていた:'l=?;o*
SP3000



4

Pyth <= 4、デニス

ljyG

これは、アルファベットのすべてのサブセットの改行の結合の長さです。

試運転:

$ pyth -cd 'ljyG'
==================== 4 chars =====================
ljyG
==================================================
imp_print(Plen(join(subsets(G))))
==================================================
939524095

2^27 * 7 - 1yG、これが2^26要素長であるに基づいていることの強力なヒントである数字を見つけました。その後、文字列に変換し、その長さを出力する必要があると思いました。しかし、私がしばらく考えることができたこれを行う唯一の方法は、「repr。それから、私はを考えましたj


4

C、tucuxi、≤64

main(i){for(i=0;i<11000;++i)if(!(i&2*i))printf("1%d",!(i&1));}

出力はすべて0と1ですが、Cはバイナリを直接印刷できないため、これらはブール値の結果である可能性が高いです。

0よりも1が多いので、0の位置(3, 9, 13, 19, …)を記録しました。これはOEIS A075318であることがわかりました。ただし、これは有用ではありません。このシーケンスのどこに数字があるかを決定する簡単な式はありません。

ただし、すべて奇数であるため、(x-1)/2 = {1, 4, 6, 9, 12, …}より有用な情報がある可能性があります。そして、これはA003622です。

A003622は「A003849の1の位置」として定義できます。これはまさにここでクラックする必要があるものです。そして、A003849は「A003714 mod 2」として定義されますx & (2*x) == 0。ここで、A003714は単にすべての整数です。したがって、解決策があります。

OEISロックス。


本当に印象的-このサイトのユーザーに驚かされることはありません
-tucuxi

4

Dyalog APL、デニス、≤4

*⍨⍟8

ln(8)^ ln(8)を計算します。StackExchangeは回答の変換を停止しますか?ここに大量のものを入力して、コメントにならないようにします。


私は持ってい8*⍟⍟8たが、知らなかった。良い仕事:)
Sp3000


3

Pyth、xnor、≤4

C`CG

CG(アルファベット文字列"abc...z"を256から変換)は、非常に大きな数を生成する典型的なPythの方法です。その後、単に文字列化し、ベースから再び変換します。


3

Python 3、Mego、≤128

(以前のバージョンではテストされていないPython 3.5.0を使用しています。 105 98バイト。)

import sys
a=sys.stdout
sys.stdout=None
from this import*
a.write(s.translate(s.maketrans(d))[4:])

とても良い!私は94年にそれをしました。コードについては私の警官の投稿をご覧ください。
メゴ


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