변형 된 소스 코드 복구


27

작은 표본의 라듐, 감전 된 고래 및 3 개의 구미 곰과 관련된 매우 이상한 사고로 일부 Management ™의 소스 코드가 변경되었습니다. The Management ™의 사장은 Management ™의 "악한"계획을 막기 위해 실제로 책임을지는 경찰이었던 사람은 거의 모른다. Robbers®는 때로 악을 좋아하지 않기 때문에 원래 코드를 검색하기 위해 고용되었습니다.

참고 :이 과제는 Unscramble the Source Code 에서 큰 영향을 받았습니다 .

기술

이것은 도전입니다.

  • 경찰 수행 작업 # 1 (또한 작업을 수행 # 2하지만 비밀을 유지하도록하는 프로그램을 작성)하는 프로그램 (돌연변이 코드)를 작성한다.
  • 강도는 은 "돌연변이"반전을 시도하고 코드가 수행하는 작업 # 2에이 원래의 코드를 변경합니다.

이 도전에서 과제 # 1은 소수출력하는n 것이고 과제 # 2는 피보나치 숫자출력하는n 것입니다 (어쨌든 경찰에 따르면 악의적입니다). 피보나치 수열은 ( n=11; n=21; n=32; ...)로 정의되고 소수는 ( n=12; n=23; n=35; ...) 로 정의됩니다 .

경찰의 목표는 작업 # 1과 작업 # 2를 완료하는 프로그램 간의 차이를 최소화하면서 강도가 작업 # 2를 완료하는 코드를 다시 생성하지 못하게하는 것입니다.

경찰 규칙

경찰은 두 개의 프로그램 (하나는 작업 # 1을 완료하고 다른 하나는 작업 # 2를 완료)을 작성하고 다음 정보를 공개합니다.

  • 번째 프로그램 ( n10 번째 소수 출력 )
  • 첫 번째 프로그램과 두 번째 프로그램 사이 의 Levenshtein 편집 거리
  • 프로그래밍 언어 두 프로그램이 작성되는은 (두 프로그램 모두에 대해 동일한 언어이어야 함)

다음 제한 사항은 두 프로그램 모두에 적용됩니다.

  • 길이는 128 자 이하 여야합니다.
  • 인쇄 가능한 ASCII (및 개행 문자도 허용) 만 사용해야합니다.
  • 실행하는 데 10 초도 걸리지 n=45않으며 올바른 출력을 생성 할 필요가 없습니다 n>45.
  • 해시 또는 암호화 기능을 사용해서는 안됩니다.

강도 규칙

강도는 경찰의 프로그램 (작업 # 1을 완료 함)을 경찰이 지정한 편집 거리에서 작업 # 2 (경찰이 작성한 원래 프로그램 일 필요는 없음)를 완료하는 프로그램으로 변경하려고 시도합니다.

이미 금이 간 제출은 다시 금이 갈 수 없습니다 (제출을 한 첫 번째 강도 만 크레딧을 얻습니다).

제출물을 크랙 한 후 다음을 수행하십시오.

  • 이 과제와 함께 제공되는 질문 (link)에 대한 답변게시 하여 언어, 솔루션 및 원래 답변에 대한 링크를 제공하십시오.
  • 게시 한 답변으로 연결되는 "깨끗한"텍스트 로 의견남겨 주십시오.
  • 편집 권한이있는 경우 경찰의 답변을 편집하십시오 (없는 경우 필요한 권한을 가진 다른 사람이 그렇게 할 때까지 기다리거나 편집을 제안하십시오).

채점

경찰의 프로그램이 1 주일 동안 크랙되지 않은 상태로 남아 있으면 경찰은 작업 # 2를 완료 한 원본 코드를 게시 할 수 있으며 (지정된 편집 거리 내에서) 제출은 "안전"으로 간주됩니다. 가장 작은 편집 거리를 가진 안전한 제출이 이길 것입니다. 동점 일 경우 가장 짧은 프로그램 (작업 # 1을 완료 한 원본)이 승리합니다. 두 개의 제출물이 여전히 묶여 있으면 이전에 게시 된 것이 우선입니다.

강도가 경찰의 제출을 ​​크랙하면 강도는 해당 제출의 편집 거리만큼 올라갑니다. 예를 들어, 편집 거리가 3이고 거리가 5 인 제출을 크래킹하는 강도는 8 포인트를 얻습니다. 가장 높은 점수를받은 강도가 승리합니다. 동점 일 경우, 먼저 점수를 얻은 강도가 승리합니다.

리더 보드

  1. 루비, 6 (히스 토크 랫)

레 벤슈 테인 거리를 계산하는 작은 도구


1
첫 번째 피보나치 수는 무엇입니까? 0 또는 1? 또는 중요하지 않습니다
kukac67

@ kukac67 1입니다. 게시물을 수정했습니다.
Doorknob

오버플로의 경우 프로그램의 출력은 무엇입니까?
es1024

전체 프로그램이어야합니까 아니면 기능 일 수 있습니까? 익명 함수는 어떻습니까?
Tyilo

2
"해싱 또는 암호화 기능"으로 간주되는 것은 무엇입니까? 물건을 기본 변환 할 수 있습니까? 큰 지수 모듈로 큰 소수를 취할 수 있습니까?
Martin Ender

답변:


6

파이썬 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]

마지막 으로이 문자를 문자 제한 아래로 가져 왔습니다. 너무 어려워서는 안되지만 아이디어가 흥미 로웠다고 생각했습니다.


의도 된 솔루션 :

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으로 나누면 두 번째 줄 대신 대신 사용하여 솔루션으로 나누는 것처럼 보이지만 생각하지 않았습니다..0 float 나누기를 강제 실제로 과학 표기법의 어떤 이유는 Bignum이 더 의미가있는 경우에도 루비의 Float입니다. 나는 p=물건 에 대해 영리하다고 생각 했지만 그것을 쓴 방식은을 삭제할 수 있습니다 p. 나는 할 수 있었다p=p&&#


e무차별 대입을 할 때 아래로 삽입하려고 생각하지 않았습니다 . 정말 비열한 해결책. :)
벡터화

3

파이썬 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

하스켈, 거리 = 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

루비, 거리 14 ( 금이 )

p [x=2,y=1,*(1..200).map{|i|y==(y*x**(i-1)+x%2).divmod(i)[x-1]?i:1}].-([x-1])[gets.to_i-1]


흠, Fibbonaci 시퀀스는 0으로 시작하며 규칙은 1로 시작합니다. 그렇지 않으면 체크 아웃됩니다 (내 의도 한 솔루션과는 매우 다르지만).
histocrat

알았어. Fermat의 btw를 잘 사용했습니다.
Vectorized


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

파이썬 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

@feersum 감사합니다. 거리는 여전히 38입니다.
Timtech

1

파이썬 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)

우리는 이것이 얼마나 오래 지속되는지 볼 것입니다 ...


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.