変異したソースコードを回復する


27

ラジウムの小さなサンプル、感電死したクジラ、3匹のグミベアを含む非常に珍しい事故で、The Management™のソースコードの一部が変更されました。The Management™のボスは、The Management™の「悪」計画を阻止しようとして、実際に責​​任を持っていたのはCops©であったことをほとんど知りません。Robbers®は元のコードを取得するために雇われました。これは、悪が嫌いな人がいるからです。

注:この課題は、Unscramble the Source Codeに大きな影響を受けています

説明

これは挑戦です。

  • 警官は、タスク#1を実行する(実行タスク#2が、秘密に保たれていること、また、プログラムを書き込む)ことプログラム(突然変異コード)を記述します。
  • 強盗は「突然変異」を逆転しようとすると、コードを実行そのタスク#2には、この元のコードを変更します。

このチャレンジでは、タスク#1はth素数出力し、nタスク#2はthフィボナッチ数出力nます(とにかくCops©によれば、これはなんとなく悪いことです)。フィボナッチ数列は(n=11; n=21; n=32; ...)として定義され、素数は(n=12; n=23; n=35; ...)として定義されます。

警官の目標は、タスク#1とタスク#2を完了するプログラムの違いを最小限に抑えながら、タスク#2を完了するコードを強盗が再作成するのを防ぐことです。

警官のルール

警官は2つのプログラム(タスク#1を完了するプログラムとタスク#2を完了するプログラム)を作成し、次の情報を公開します。

  • 最初のプログラム(出力n番目の素数)
  • 最初のプログラムと2番目のプログラム間のレーベンシュタイン編集距離
  • プログラミング言語の両方のプログラムが書き込まれていることを(両方のプログラムのために同じ言語である必要があります)

次の制限が両方のプログラムに適用されます。

  • 長さは128文字以下でなければなりません。
  • 印刷可能なASCII(および改行も許可されます)のみを使用する必要があります。
  • それらは実行するのに10秒未満でなければならn=45ず、どんなもののためにも正しい出力を生成する必要はありませんn>45
  • ハッシュ関数または暗号化関数を使用してはなりません。

強盗ルール

強盗は、警官によって指定された編集距離で、警官のプログラム(タスク#1を完了する)をタスク#2(必ずしも警官によって書かれた元のプログラムではない)を完了するプログラムに変更しようとします。

すでにクラックされた提出物を再びクラックすることはできません(提出物をクラックした最初の強盗のみがクレジットを取得します)。

提出物をクラックした後、以下を実行してください。

  • この課題に付随する質問(リンク)の回答投稿し、言語、ソリューション、および元の回答へのリンクを提供します。
  • 投稿された回答にリンクするテキスト「クラック」を含むコメント残します。
  • 編集権限がある場合は警官の回答を編集します(権限がない場合は、必要な権限を持つ他の人があなたのために行うまで待つか、編集を提案します)。

得点

警官のプログラムが1週間ひびが入らない場合、警官はタスク2を完了する元のコードを(指定された編集距離で)投稿でき、それ以降は「安全」と見なされます。編集距離が最小の安全な送信が勝ちです。同点の場合、最短のプログラム(タスク#1を完了するオリジナル)が勝ちます。2つの提出物がまだ結び付けられている場合は、前の投稿が勝ちます。

強盗が警官の提出物を正常に解読した場合、強盗のスコアはその提出物の編集距離だけ上昇します。たとえば、編集距離が3の提出物と距離が5の提出物をクラックする強盗は、8ポイントを獲得します。最高スコアの強盗が勝ちます。同点の場合、スコアを獲得した強盗が最初に勝ちます。

リーダーボード

  1. ルビー、6(歴史家)

レーベンシュタイン距離を計算する小さなツール


1
最初のフィボナッチ数とは何ですか?0または1?またはそれは重要ではありません
kukac67

@ kukac67 1です。投稿を編集しました。
ドアノブ

オーバーフローの場合、プログラムの出力はどうあるべきですか?
es1024 14

完全なプログラムである必要がありますか、それとも関数であることができますか?無名関数はどうですか?
ティロ14

2
「ハッシュまたは暗号化機能」とは何ですか?ものをベース変換できますか?大きな素数を法とする大きな指数をとることはできますか?
マーティンエンダー14

回答:


6

Python 2、距離= 8 [ クラック ]

from fractions import*
n=input()
k,=P=[2]
while n>len(P):k+=1;z=reduce(lambda x,y:x*y,P,1);P+=[k]*(gcd(z,k)<2)
print P[-1]

ついにこれをchar制限の下に収めました。それほど難しくはないはずですが、このアイデアは面白いと思いました。


意図したソリューション:

from fractions import* n=input() k,=P=[1] while n>len(P):k+=1;z=reduce(lambda x,y:x+y,P[:-1],1);P+=[z]*(gcd(z,k)<2) print P[-1]

アイデアは、それを使用することF(n+2) = 1 + (sum over F(k) from k = 1 to n)であり、連続したフィボナッチ数が互いに素であるという事実です。1削減引数では、提供することになりました+1

feersumは別の攻撃ラインを見つけたようです!




4

ルビー、距離6 [安全]

require'prime';p Prime.take(n=gets.to_i)[-1]
#p (((807462154311276410)**n/(5**0.5)).round)

編集距離が短い数式のペアを作成するのは楽しいですが、このアプローチはより効果的/煩わしいかもしれません。あなたは私が何をしたかを正確に理解するかもしれませんが、それはあなたがそれを逆にすることができるという意味ではありません。

溶液:

require'prime';p=Prime.take(n=gets.to_i)[-1] p (((0742154311276/4e10)**n/(5**0.5)).round)

説明:

このコードは、小数点以下11桁までの黄金比を生成し、それを使用してフィボナッチ数列を直接計算します。必要な数の用語を正しく取得するのに十分な精度です。公式を知っていれば、その部分はまったく難読化されていません。突然変異をブルートフォースで逆転させて定数を回復するのを難しくするために、8進数表記(先頭の0)と科学表記(4e10)を使用しました。1e11ではなく4e10で割ると、Bignumがより理にかなっているように見える.0場合でも、実際には科学表記法で何らかの理由で常にRubyでFloatである場合、フロート除算を強制するために何かで割っているように見えます。私は自分のp=ものを賢くしていると思っていましたが、それを書いた方法であなたはただ削除することができますp。私はできた'p=2行目のp&&代わりに使用することで解決し#ますが、私はそれを考えませんでした。


e総当たり攻撃を行うときに、そこにダウンを挿入しようとは思わなかった。本当に卑劣なソリューション。:)
ベクトル化

3

Python 2-LD = 13 クラック

n=1;j=input();
while j>0:
    n+=1;j-=1;
    while~-all(n%i for i in range(2,n)):n+=1;
print n

簡単に素敵な、(うまくいけばない、あまりにも簡単に)物事を始めるために1 :)

それは簡単すぎるように見えます;)私はあなたがコメントを使用できることを忘れていたことをかなり愚かに感じます:/



3

ハスケル、距離= 13

import Data.List
x=id=<<snd(mapAccumL(\m n->(,)=<<(++m)$[n|and[n`mod`m1/=0|m1<-m]])[1+1][3..])
main=print.(!!)(0:2:x)=<<readLn

これはもっと読みやすいかもしれませんが、import食べ過ぎたので、少しゴルフをしなければなりませんでした。




2

J、距離= 4 [安全]

f =: 3 :  '{. (p:) (+) / 0 , y - 1x'

溶液:

f =:3: '{。2(x :)(+%)/ 0、y $ 1x '

方法:

{. 2(x:)連続分数の分母(+%)1 + 1 /(...(1 + 1 /(1 + 1 /(1 + 1 /(1)))))。


1

Python 3、距離= 14 [ クラック ]

n = int(input())
P = [2]
k = 2
while n > len(P):
 k += 1
 for x in P:
  if k%x == 0: break
 else: P += [k]
print(k)

予備の文字がいくつかあったので、明確にするために空白を入れました:)




1

TI-BASIC、距離38

Input N:{2>L1:For(A,3,E99:If min(1=gcd(A,seq(A,A,2,$(A:A>L1(1+dim(L1:End:L1(N

>表しSTO→キーをし、$平方根記号を表します。


4
これらの文字の一部は、印刷可能なASCIIではないようです。
feersum 14

@feersumありがとう、訂正。距離はまだ38です
Timtech

1

Python 2 –距離= 12 [ ひび割れ ]

私はこれがどのようになったかに少し満足しています。

f=lambda p,i:p if p[45:]else f(p+[i]if all(i%q for q in p[1:])else p,-~i)
print f([1,2,3],2)[input()]

どれくらい時間がかかるか見てみましょう...まだクラックされていると思います。

編集:コードを少し短くし、操作/距離に影響を与えません。

意図したソリューション

コメントや改行の変更を求めずに行こうとしました。

f=lambda p,i:p if p[45:]else f(p+[p[i]+p[-2]]if all(i|q for q in p[1:])else p,-~i) print f([1,1,1],2)[input()]



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