干し草の山で針を見つける(強盗)


18

これは挑戦の一部です。警官の役のためにここ行ってください

強盗の挑戦

警察官の答えは、Haystackプログラムから文字のサブセットを削除することで解読でき、Needle代わりにHaystack(同じ言語での有効な提出のまま)出力します。上記の制約によって有効である限り、意図した警官とまったく同じ解決策を見つける必要はありません。

これを管理する場合は、ソリューションに回答を投稿し、警官の回答にリンクし、警官の回答にコメントを残して自分にリンクします。

最も警官に答える強盗が勝ちます。ひびの入った警官の回答のサイズの合計によって関係が壊れます(より長い提出物をひっくり返す強盗に有利に)。

各警官の答えは1回しか解読できません。もちろん、自分の答えを解読することはできません。警官の答えがクラッキングされる前または後に無効であることが判明した場合、強盗のスコアにはカウントされません。

以下に、異なる言語での簡単な例をいくつか示します。

Ruby

Haystack: puts 1>0?"Haystack":"Needle"
Delete:        XXXXXXXXXXXXXXX
Needle:   puts "Needle"

Python 2

Haystack: print "kcatsyaHeldeeN"[-7::-1]
Delete:          XXXXXXXX        XX
Needle:   print "eldeeN"[::-1]

削除された文字のサブセットは連続している必要はありません。


強盗の使用は場合はhashing, encryption or random number generation?それは(可能性の小さいが)許可されている
l4m2

回答:


11

JavaScript、85バイト(ES6)

Arnauldの答えをクラック

f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

「ニードル」デモ

説明

元の機能は次のとおりです。

f=(k=b=x=35)=>x--?f(k*74837258394056219&268435455):k&2?'N'+(k^124038877).toString(b):'Haystack'

より読みやすい:

f = (k=b=x=35) => {
    if (x--) {
        return f(k*74837258394056219&268435455);
    } else {
        if (k&2) {
            return 'N'+(k^124038877).toString(b);
        } else {
            return 'Haystack';
        }
    }
}

ことを注意n=21625674し、n.toString(35)あります'eedle'

入力の35は、おそらくサブセットに変更できません(すべての文字「del」を含めるのに十分な大きさのベースが必要なため、少なくとも22のベースが必要です)。だから、変化に数字がある74837258394056219268435455124038877。関数を、元の数字の桁のサブセットで形成された数字a、b、cに置き換えたいg(k) = (k * a & b)が始まり、k=3535回反復され、次にcとXORされて、21625674

これのために、長さ(最大が小さいように、ビットを考えた後にa長さ17を有し、bそしてc長さ9を有している)、私は、ブルートフォースを使用:-)書いたC ++のプログラムをすべての可能な数字を生成するためにabcサブセットとして形成します元の番号のすべてa、およびを反復処理しb、必要なものcがセットに含まれているかどうかを確認します。約15秒で実行され、唯一の出力はa=4853461b=268435455c=12408877(数ターンアウトをb変更する必要はありません)。この関数を反転させるもっと賢い方法があるかどうかはわかりません。



5

Brain-Flak、96バイト

Funky Computer Manの答えをクラックします

([((((()()())){}){}){}](()[()]({}([(((()()()){}))[]])[]({}({}()(((()(({}){}){}){}){}())))[]))())

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

これは楽しいチャレンジでした。

元のに変換yする先頭の-24がに変換aされるようにeなりましたM。これは、N終了ループ全体をに変更することにより、所定の場所に変換されます())。最初にプッシュされた文字ke、6を追加するプッシュポップを削除するだけで変更されました。残りは大部分が適切に配置され、途中でユーモラスなミスステップが発生しました(出力が1つのプログラムを含む)Meddle)。

2つのプログラムの比較:

Haystack: ([((((()()())){}){}){}](()([()](()({}([((((()()()){})))[]])[]({}({})[{}]()({}((()(({}){}){}){}){}())))[][][][][][]))[]))(((()[]){}){({}[()()])}{})
Needle:   ([((((()()())){}){}){}](() [()]   ({}([ (((()()()){})) []])[]({}({}     ()(  ((()(({}){}){}){}){}())))[]              ))   ()  )

私はそれがこの
-H.PWiz

確かに 動作しますが、私は何らかの形Nで78ではなく77 だと確信していたので、私はそれをキャッチしませんでした。
ニトロドン

とにかくあなたの方が短いです。
-H.PWiz

興味深いソリューション!ご覧になりたい場合は、元の投稿に目的のソリューションを追加しました。
小麦ウィザード

5

ハスケル

@Laikoniの答えをクラックします

s=map;hay=zipWith;a=head;h=s a.(hay(scanr id).s a<*>s(succ<$))$words"Haysta ayst ackH ays k ayst"

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

元のコード:

hays=map;hay=zipWith;stack=head;h=stack{-
 hay.(hays.(stackany hay$or id).stack hay
<*>hays(sum$stack haystack<$>hay))-}$words
 "Haystack Hayst ackH aysta ckH aystac k"

削除された文字をアンダースコアに置き換える:

___s=map;hay=zipWith;__a__=head;h=s______
 _a_.(hay__(s__c_an_______r id).s____ _a_
<*>___s(su_____c________c_<$____))__$words
 "Haysta__ _ayst ackH ays__ _k_ ayst____"

構成方法Needle:コードの最後の文字列は単語に分割されます。各単語の最初の文字は、単語内の文字数だけ増加します(例: Haysta-> Hplus 6 chars->)N


5

六角形、17バイト、H.PWiz

]; N @ cl; e ;;(\。s。; _

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

オリジナルとの比較:

];N.@cl;e@;;(\H/;ya;_.>s.;t//<._  original
];N @cl;e ;;(\       . s.;     _  modified

視覚化:

  ] ; N
 @ c l ;
e ; ; ( \
 . s . ;
  _ . .

説明

ボーナスマーク-6つのIPをすべて使用し、1つを除くすべてのセルを使用します!

Coloured paths

IP#0は、黒いパスに沿って右に向かって開始し]ます。
次に、IP#1に移行します。これは、赤いパスに沿って進み、印刷NN;てから]再び折り返します。
我々次いで青色の経路に沿ってヘッドが、記憶IPへの移行#2、e現在のメモリセルにおいて、次に緑の経路に沿って、(にて反射して実行される\)が;;(;印刷ee、からメモリセルをデクリメントeするd、次にプリントd
IPはオレンジのパスに沿って続行し、Nl;sewhichが実行され、現在のメモリセルにl保存さeれます。茶色のパスに沿って続きe;。この時点で、すでに印刷されているNeedleので、残りはちょうど終わりです。IPは保存cしてからヒットし]ます。 次に、IP#3に移行します。IP#3は、青のパスに沿って進み、ヒット、バウンス、バウンス、インバウンドします。 次に、IP#4に移行します。これは、緑色のパスに沿って進み、に跳ねて、分岐します(正であるため)。 最後に、IP#5に移行し、保存してからで終了します。
Coloured paths 2
\_]
_\]c
e@


いいね!それが意図された解決策でした。
H.PWiz

4

Python 2、123バイト

agtoeverの答えをクラック

import numpy
print "".join([dir(numpy)[int(i)][0] for i in numpy.poly1d([-143/2e1,-31,14,131,61,184])(numpy.arange(-3,3))])

repl.it

比較:

print "".join([dir(numpy)[int(i)][1-0] for i in numpy.poly1d([-1*1433/252e1,-3232/1920.,4026./72/2/3.,613/(6*4.)*1,-4723./1.8e2,-9763/120.,-2689/(-1+5*17.),1+138*.4*2])(numpy.arange(-12/3,13%9))])
print "".join([dir(numpy)[int(i)][  0] for i in numpy.poly1d([-1  43 /2  e1,-3    1    ,               1     4    ,       1         3 1   ,  6     1       ,1   8  4  ])(numpy.arange(-   3, 3  ))])

印刷したソリューションを見つけるのがとても楽しかった MeedleNeedlfの文字のそれぞれで始まるnumpyのシンボルのインデックスの中央値に多項式をフィッティングすることによってをNeedle。次に、元のプログラムのサブセットを使用して手作業で同様の係数を見つけようとしましたが、最終的には有効な解を見つけるためにブルートフォースに頼らなければなりませんでした。


うわー!よくやった!すぐにクラックされるとは思っていませんでした。
agtoever

私はもともとnumpy 1.13に基づいてチャレンジを開発しましたが、これはどのrepl環境でも見つかりませんでしたので、numpy 1.12に書き換えなければなりませんでした
;


2

ゼリー、14 バイト

クラックジョナサン・アランの回答

“¡#ɦṢÞɠ»ḟ“¡pṄ»

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

比較:

“¿ọ⁽ṅ*FỊ⁼g£¡#!ʋzoɦṪ£ṢÞḲÐɠ`”m3⁾“»jVḟ“¡!pṄ»
“          ¡#    ɦ  ṢÞ  ɠ      »  ḟ“¡ pṄ»

私が使用されるœc使用リテラル文字列、の種々のサブセットを反復処理するためにtr -d各可能なフィルタのため、およびgrep針のため編。最初の文字列の使用された文字はいずれも回答に使用されなかったという仮定を使用して、15秒以内に回答を見つけました。


私が念頭に置いていた正確に一つのNebbed+ rubleのいずれかなしrub
ジョナサンアラン


2

Java(OpenJDK 8)、191バイト

ルーク・スティーブンの答えを破る

String d(){int h=3905055,m=55,s=15443;String d="0"+h*2+""+m*20+""+s*7,x="",y;for(int g=0;g<d.length();g+=3){y="";for(int e=0;e<3;e++)y+=d.charAt(e+g);x+=(char)Integer.parseInt(y);}return x;}

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

削除された文字:

int h=3609000-5055+911,m=557558,s=15441301-157*10000
       xx  xxx    xxxx     xxxx       x xxxxxxxxxxxx

これにより、どのスペルをd評価し078101101100108101ますNeedle


2

ルビー、149バイト

これをクラック: https //codegolf.stackexchange.com/a/144790/74216

モジュールは非常に小さかったので、マルチスレッドの誕生日を書いて、最高のものを望みました。

編集:その後、さらに短い答えが見つかりました。

x='hxDKFQOoqJLuVNW'
s="n=x.to_i 36;x.bytjs.jach_cons(3){|a,b,c|n+=n*b%c;n*=a^b};puts n%8675309==1388649 ?'Njjdlj':'Haystack'"
eval s.tr ?j,s.size.chr

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

変更点:

x='yGwztsPXhxDkBKlCYdFjQnpUROfoHvqmTgbaJSLcEiZrIAuMVNW'
x='        hxD  K    F Q    O o  q     J L       u VNW'

# and here's some more variants for extra pwnage:
x=' G  tsPx     KlCYd  Qn U   o v mT  a SLc    I u  NW'
x='  w  s    D BKl  dF QnpU O        ba SLcEiZrI  MV  '
x='yGwz s Xh Dk K C  F  npU O  Hvq   b   L    rIAu V W'

2

dc、34バイト

93 9 2*+432212+ 47*4242160 7 2++*P

これをクラックます。TIO

Haystack(5215583380252484459)とNeedle(86197399743589)の数値表現を取得することから始めました。次に、後者の因数分解を行いました。これは47 * 432323 * 4242169です。これから、これらの数値を再構築するのは非常に簡単でした。

使用する文字にマークを付ける:

6 93 3 9 2 2**+*+483622 1 2 3 3*+3*+89 47*+*+3 5 2* 269 158 9**107 97*2 4*++2 3 3*+42 14 2**+*+5*+5 2148 1 6 2*+*+68262 5 280 7 2 3 3*+5 2**+*+*+*+P
  XXX  XXX   XX  X X XX X X     X     XXXX                              X   X      XX X                    X                XXXXX     X     XX     X

gg!私はそのような数を置くことは悪い考えだと知っていました)
-cab404

@ cab404好奇心が強い:86197399743589に到達するために非常に異なる計算を使用しましたか?
agtoever


ワオ。それは驚くべきことです。それは別のコードゴルフの質問かもしれません:式の文字を削除することで特定の結果を得る方法はいくつありますか
-agtoever

すべての可能性を計算し、それらの数だけがあることを証明するには、一般的にいくつかの深刻な数学が必要だと思います)
-cab404

2

六角形、19バイト、マーティン・エンダー

[@;(...e<l.a;./;N>;

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

オリジナルとの比較

H[@;(...e<l.a;./$.>;\sN;\ac.>).;;;._y
 [@;(...e<l.a;./   ;  N     >  ;

展開されたコード

  [ @ ;
 ( . . .
e < l . a
 ; . / ;
  N > ;

そのため、Hexagonyで何も書いたことはありませんが、クラックを思い付くことができるのは37バイトだけだと考えました。マーティン、私がたくさん入れことを知ってほしいの時間。:)

私は間違っているかもしれませんが、私が思うことを説明しますこのコードが。

プログラムはから始まり[、自動的にIP#5に移行します。このIPは西の隅から始まり、[再びIPに向かって進み、IP#4に移動します。ここから、実行N;eしてから南東の角に向かい、実行;して、右に跳ねて別の;もの(を探し、次にラップして現在の値を減らしますed。次に(ラップを使用して)継続し、最後に...;.バウンスし、最後l[1つ到達して、IP#3に移動します。それは実行し;>北西へのリダイレクト.、その後は<、西にリダイレクト打つe、に折り返し;、そして上で終端します@

詳細バージョン

ニードルプログラムに通常の六角形のサイズを使用してくださったことを嬉しく思います。サイズ19のプログラム(長さ3の辺の六角形)をチェックしていたときに、任意の数の文字を削除でき.、最後に六角形を自動的にsで埋めることができたため、クラックが劇的に難しくなりました。現状では、Hexagonyはこのチャレンジにとって悪言語です。なぜなら、(ほとんど)削除されたキャラクターはプログラムの実行パス全体を変更するからです。そうは言っても、たとえ最後にそれを強引に強制したとしても、私はこれを思い付くのを楽しんだ。:)


私が何かを台無しにしたり見逃した場合は、私に知らせてください。
ジョー。

すばらしい仕事です。これはかなり正確に見えます。週末に最初に持っていたものと比較します。
マーティンエンダー

1

Java(OpenJDK 8)、151バイト

Kevin Cruijssenの回答をクラック

v->{String h="H";int x=7;return new String(new byte[]{(byte)((-~-~-~-~-~-~1^x++*x)+15),new Byte("10"+h.length())})+new StringBuffer("elde").reverse();}

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

比較:

v->{String h="Haystack";int x=-7;return x<0?h:new String(new java.math.BigInteger(new byte[]{(byte)((~-~-~-~-~-~-~-~-~-~1^-x++*x)+151),new Byte("2"+"1+\"0+\"".length()+(x=h.length()*4/x)+"-x-7")}).toByteArray())+(new StringBuffer("hidden".substring(++x%3^4,--x-x--).replaceFirst("dd","e"+(char)(x*211%+93))).reverse());}
v->{String h="H       ";int x= 7;return       new String(                         new byte[]{(byte)(( -~-~-~-~-~-~      1^ x++*x)+15 ),new Byte("    1   0  "          +   h.length()    )        })               + new StringBuffer("    e                                 l          d    e"      )             .reverse() ;}

最後の部分は意図していないように感じます。


大丈夫、それは「edle」を作るスマートな方法です。:)意図したソリューションがあった。私はすでに..私は少しあまりにも多くを行なったし、ソリューションの負荷が可能だろうと思ったの周りいじってますがv->{String h="Haystack";int x=7;return new String(new java.math.BigInteger(new byte[]{(byte)((~-~-~-~-~-~-~-~1^-x++*x)+15),new Byte(""+10+((x=h.length()*4/x)+x-7))}).toByteArray())+(new StringBuffer("hidden".substring(++x%3,x).replaceFirst("d","e"+(char)(x*21+3))).reverse());}(単なるバイト配列が十分にあるので、私はBigIntegerのを含めた理由がわかりません...)が、私より良いあなたのような... :)
ケビンCruijssen

1

Brain-Flak、102バイト

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

H.PWizの答えをクラックします

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

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


1

ジョナサンS.によるJava

import java.util.*;interface Main{static void main(String[]args){Stack<Hay>s=new Stack();s.add(new Needle());System.out.println(s.get(s.indexOf(new Hay())+1).a);}}class Needle extends Hay{{a="Needle";}}class Hay{String a="Haystack";public boolean equals(Object o){return getClass().equals(o.getClass());}}

TiO

Hayを追加するループを削除するだけで、スタックには針以外は何も残りません。


いいね-ループを単に削除することは考えていませんでした!equalsメソッドの削除も同様に機能します。
ジョナサンS.


0

phroureoよるT-SQL、757バイト

seleCT 'Needle'

どういうわけか、私はそれが意図された解決策だとは思わない。で囲まれた文字を使用します{}

create table a(l int,c int)
in{se}rt into a va{l}u{e}s (1,10),(2,1),(3,8),(4,0)
go
;CREATE FUN{CT}ION b(@ varchar(max)) returns varchar(max) as
begin return{ '}char('+@+'),'''','end 
go
;CREATE FU{N}CTION h(@ varchar(max),@a varchar(max), @b varchar(max), @c varchar(max), @d varchar(max), @e varchar(max), @f varchar(max), @g varchar(max), @h varchar(max))
r{e}turns varchar(max) as 
b{e}gin
return replace(replace(replace(replace(@,@a,@b),@c,@d),@e,@f),@g,@h)
end
{d}ec{l}ar{e} @x varchar(max),@ int=1,@y varchar(99)={'}'
,@D varchar(4)='Ha',@O varchar(4)='ys'
,@T varchar(3)='ta',@A varchar(4)='ck'
WHILE @<=4
BEGIN
set @y+=(SELECT dbo.b(c+100)from a where l=@)+' '
set @+=1
END
SELECT @x='select
left(dbo.h('''+@D+@O+@T+@A+''','+ left(@y,len(@y)-1) +'),char(56))'
execute(@x)

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