恢复变异的源代码


27

在一次非常罕见的事故中,涉及到一小部分镭,一头电死的鲸鱼和三只软糖熊,The Management™的某些源代码已被更改。The Management™的老板几乎不知道,实际上是由警察©负责,以制止The Management™的“邪恶”计划。因此,有人雇用了Robbers®来尝试检索原始代码,因为有时谁不喜欢邪恶?

注意:此挑战在很大程度上受到“ 对源代码进行解读”的启发。

描述

这是挑战。

  • 警察将写一个程序(突变的代码),进行任务#1(并且还写一个程序,执行任务#2,但被保持秘密)。
  • 劫匪将试图扭转“突变”,改变这种原始代码转换成代码,执行任务#2。

在此挑战中,任务1将输出n第素数,任务2将输出n斐波那契数(无论如何,根据警察的说法,这是邪恶的)。斐波那契数列定义为(n=11; n=21; n=32; ...),素数定义为(n=12; n=23; n=35; ...)。

警察的目标是最小化完成任务1和任务2的程序之间的差异,同时防止强盗重新创建完成任务2的代码。

警察规则

警察将编写两个程序(一个完成任务1,一个完成任务2),并公开以下信息:

  • 一个程序(输出n第素数)
  • 所述的Levenshtein编辑距离的第一程序和第二程序之间
  • 两种程序都使用的编程语言(两种程序必须使用相同的语言)

以下限制适用于两个程序:

  • 长度不得超过128个字符。
  • 它们只能使用可打印的ASCII(加上换行符,也允许使用换行符)。
  • 它们必须运行少于10秒n=45,并且不需要为任何输出正确的输出n>45
  • 他们不得使用任何哈希或加密功能。

强盗规则

强盗将尝试将警察的程序(完成任务1的程序)更改为以警察指定的编辑距离完成任务2的程序(不一定是警察编写的原始程序)。

已经破解的提交不能再被破解(只有第一个破解提交的强盗才能获得信誉)。

破解提交内容后,请执行以下操作:

  • 发帖回答这一挑战的陪同问题(链接),提供的语言,你的解决方案,并在原来的答案的链接。
  • 用链接到您发布的答案的文本“ Cracked” 发表评论
  • 如果您具有编辑权限,请编辑警察的答案(如果没有,请等待具有所需权限的其他人替您这样做或建议进行编辑)。

计分

如果警察的程序保持未破解状态持续1周,则该警察可以发布完成任务2(在指定的编辑距离内)的原始代码,并且从那时起提交就被视为“安全”。编辑距离最小的安全提交将获胜。如果出现平局,则以最短的程序(完成任务1的原始程序)为准。如果仍然有两个提交物并列,则一个较早地获胜。

如果强盗成功破解了警察的提交文件,则强盗的分数将增加该提交文件的编辑距离。例如,强盗以3的编辑距离破解提交内容,而以5的距离破解提交内容,则可获得8分。得分最高的强盗获胜。如果出现平局,则赢得得分的强盗首先获胜。

排行榜

  1. Ruby,6岁(历史学家)

计算Levenshtein距离的小工具


1
第一个斐波那契数是多少?0还是1?还是没关系
kukac67 2014年

@ kukac67是1; 我已经编辑了帖子。
门把手

如果发生溢出,程序的输出应该是什么?
es1024 2014年

它必须是完整程序还是功能?匿名函数呢?
Tyilo 2014年

2
什么算作“散列或加密功能”?我可以进行基本转换吗?我可以取大质数为模的大指数吗?
Martin Ender 2014年

Answers:


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位,并使用它直接计算斐波那契序列。足够的精度足以正确地获得所需的术语数。如果您碰巧知道该公式,则完全不会混淆该部分。为了使暴力破解反向突变和恢复常数变得更加困难,我使用了八进制表示法(前导0)和科学表示法(4e10)。除以4e10而不是1e11看起来更像是我在除以某种.0强制浮点除法,而实际上某种科学记数法出于某种原因始终是Ruby中的Float,即使Bignum似乎更有意义。我以为我对p=这些东西很聪明,但是我编写它的方式可以删除p。我可以'p=解决方案,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

一个不错的,容易的(希望不太容易)开始:)

看起来太简单了;)我忘了可以使用注释了,我感到很傻:/



3

Haskell,距离= 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 2014年

@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()]



0

Python 3-距离= 14 [ 破裂 ]


a,c,n=1,2,int(input())
while n-1:
 c+=1
 while 1!=list(map(c.__mod__,range(2,46))).count(0):
  c,a=a+c,a
 n-=1
print(c)

我们将看到持续多长时间...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.