로커 대 크래커 : 5 요소 시퀀스


31

도전

간단한 "스파이 대 스파이"도전.

다음 사양의 프로그램을 작성하십시오.

  1. 프로그램은 모든 언어로 작성 될 수 있지만 512 자 (이 사이트의 코드 블록으로 표시)를 초과해서는 안됩니다.
  2. 프로그램은 5 부호있는 32 비트 정수를 입력으로 허용해야합니다. 5 개의 인수를받는 함수, 단일 5 요소 배열을받는 함수 또는 표준 입력에서 5 개의 정수를 읽는 완전한 프로그램의 형태를 취할 수 있습니다.
  3. 프로그램은 부호있는 32 비트 정수를 출력해야합니다.
  4. 시퀀스로 해석 된 5 개의 입력이 "키"라고하는 프로그래머가 선택한 특정 산술 시퀀스와 일치하는 경우에만 프로그램에서 1을 반환해야합니다. 이 함수는 다른 모든 입력에 대해 0을 반환해야합니다.

산술 시퀀스는 시퀀스의 각 연속 요소에 이전 상수와 고정 상수를 더한 속성을 갖습니다 a.

예를 들어, 25 30 35 40 45시퀀스의 각 요소가 전임 수 + 5와 17 10 3 -4 -11같기 때문에 산술 시퀀스입니다 . 마찬가지로, 각 요소가 전임 수 + -7과 같기 때문에 산술 시퀀스입니다.

서열 1 2 4 8 163 9 15 6 12연산 시퀀스 아니다.

키는 정수 오버플로와 관련된 시퀀스가 ​​허용되지 않는다는 유일한 제한 사항과 함께 선택한 임의의 산술 시퀀스 일 수 있습니다. 즉, 시퀀스는 해야 엄격히 감소 엄격 증가, 또는 모든 요소가 동일있다.

예를 들어 키를 선택한다고 가정합니다 98021 93880 89739 85598 81457. 입력 (순서대로)이이 5 개의 숫자와 일치하면 프로그램은 1을, 그렇지 않으면 0을 반환해야합니다.

키를 보호하는 수단은 자신 만의 참신한 디자인이어야합니다. 또한, 0이 아닌 확률로 오 탐지를 반환 할 수있는 확률 적 솔루션은 허용되지 않습니다. 특히 표준 암호화 해시에 대한 라이브러리 함수를 포함하여 표준 암호화 해시를 사용하지 마십시오.

득점

문자 수당 가장 짧은 비 균열 제출물이 승자로 선언됩니다.

혼동이 있으시면 언제든지 문의하거나 의견을 보내주십시오.

카운터 챌린지

자신의 프로그램을 제출 한 독자를 포함한 모든 독자는 제출물을 "크랙"할 것을 권장합니다. 키가 관련 댓글 섹션에 게시되면 제출 내용이 해독됩니다. 제출물이 수정되거나 깨지지 않은 상태로 72 시간 동안 지속되는 경우 "안전한"것으로 간주되며 이후의 크래킹 성공은 컨테스트를 위해 무시됩니다.

업데이트 된 크래킹 점수 정책에 대한 자세한 내용은 아래의 "면책 사항"을 참조하십시오.

금이 간 제출은 경합에서 제거됩니다 ( "안전하지 않은"경우). 편집해서는 안됩니다. 독자가 새 프로그램을 제출하려면 별도의 답변으로 제출해야합니다.

가장 높은 점수를받은 크래커는 우승 프로그램의 개발자와 함께 승자로 선언됩니다.

직접 제출하지 마십시오.

행운을 빌어 요. :)

리더 보드

최후 순위 (Dennis CJam 49 제출의 안전에 따라).

보안 사물함

  1. CJam 49, 데니스
  2. CJam 62, Dennis safe
  3. CJam 91, 데니스 세이프
  4. Python 156, Maarten Baert 안전
  5. 펄 256, chilemagic Safe
  6. Java 468, Geobits 안전

막을 수없는 크래커

  1. 피터 테일러 [Ruby 130, Java 342, Mathematica 146 *, Mathematica 72 *, CJam 37]
  2. 데니스 [Pyth 13, Python 86 *, Lua 105 *, GolfScript 116, C 239 *]
  3. Martin Büttner [자바 스크립트 125, Python 128 *, Ruby 175 *, Ruby 249 *]
  4. Tyilo [C 459, 자바 스크립트 958 *]
  5. freddieknets [Mathematica 67 *]
  6. 일 마리 카로 넨 [Python27182 *]
  7. 아질산 [C 212 *]

* 비준수 제출

면책 조항 (8 월 26 일 오후 EST 11:15 업데이트)

점수 문제가 최종적으로 임계 질량에 도달함에 따라 (크랙 제출의 3 분의 2가 지금까지 비준 수임), 크랙 제출 제출 (1 차) 및 준수 크랙 제출의 총 문자 수 측면에서 최고 크래커 순위를 매겼습니다. (반성).

이전과 마찬가지로 정확한 제출 제출, 제출 기간 및 준수 / 비준수 상태가 모두 표시되어있어 새로운 공식 순위가 불공평하다고 생각하는 독자는 자신의 순위를 유추 할 수 있습니다.

게임 후반에 규칙을 수정 해 주셔서 감사합니다.


6
프로그램이 포인트 4를 충족하는지 어떻게 확인합니까? 사람들이 증거를 추가하기 위해 안전한 답변을 편집 할 것을 기대하십니까? 해시 함수가 이상적이며 48 비트의 다른 요소와 충돌 할 가능성이 있다고 가정하여 확률 적 제출이 허용됩니까?
피터 테일러

2
스코어링 시스템은 크래커가 두 개의 작은 잠금 장치보다 두 개의 긴 잠금 장치를 크랙하여 더 나은 점수를 얻으므로 가장 짧은 잠금 장치를 무시하도록 권장하는 것 같습니다.
피터 테일러

3
@COTO 문제는 2 개의 크래킹 점수와 가장 짧은 점수 얻을 수 있다는 것 입니다. 그렇다면 왜 기다리지 말고 더 오래 보입니까? 예를 들어, Martin은 이제 두 개의 더 짧은 잠금 장치를 깨뜨 렸기 때문에 이제 더 긴 잠금을 해제 동기 가 없습니다 . 내 것을 깨는 사람은 이제 두 번째 일을하지 않아도 그를 이길 것입니다.
Geobits

1
더 나은 점수 시스템은 질문과 균열 사이의 총 시간의 합일 수 있다고 생각합니다. 그렇게하면 쉬운 것들을 많이 깨뜨릴 수 있고, 진정한 보상은 정말 어려운 것들을 깨뜨리는 것에서 비롯됩니다.
isaacg

1
나는 골프를 처음 사용하기 때문에 어리석은 질문 일 수 있습니다. 죄송합니다. 코드 길이가 바이트가 아닌 문자로 측정되는 이유는 무엇입니까? 후자는 말 그대로 프로그램이 차지하는 메모리 공간이므로 더 논리적으로 보입니다. 예 : CJam의 대답은 문자가 가장 짧지 만 크기 (유니 코드로 인해 326)를 볼 때 상위 5도 아닙니다. 그래서 바이트 대신 문자를 계산하는 것이 골프에서 일반적인 관례입니까?
freddieknets

답변:


3

CJam, 62 자

"ḡꬼ쏉壥떨ሤ뭦㪐ꍡ㡩折量ⶌ팭뭲䯬ꀫ郯⛅彨ꄇ벍起ឣ莨ຉᆞ涁呢鲒찜⋙韪鰴ꟓ䘦쥆疭ⶊ凃揭"2G#b129b:c~

스택 교환은 인쇄 할 수없는 문자를 다루기 쉽지만 이 붙여 넣기 에서 코드를 복사 하여 CJam 인터프리터 에 붙여 넣는 것이 좋습니다 .

작동 원리

유니 코드 문자열을 ASCII 문자열로 바꾸면 다음 코드가 실행됩니다.

" Push 85, read the integers from STDIN and collect everything in an array.               ";

85l~]

" Convert the array of base 4**17 digits into and array of base 2 digits.                 ";

4H#b2b

" Split into chunks of length 93 and 84.                                                  ";

93/~

" Do the following 611 times:

    * Rotate array A (93 elements) and B one element to the left.
    * B[83] ^= B[14]
    * T = B[83]
    * B[83] ^= B[0] & B[1] ^ A[23]
    * A[92] ^= A[26]
    * Rotate T ^ A[92] below the arrays.
    * A[92] ^= A[0] & A[1] ^ B[5].                                                        ";

{(X$E=^:T1$2<:&^2$24=^+\(1$26=^_T^@@1$2<:&^3$5=^+@}611*

" Discard the arrays and collects the last 177 generated bits into an array.              ";

;;]434>

" Convert the into an integer and check if the result is 922 ... 593.                     ";

2b9229084211442676863661078230267436345695618217593=

이 접근법은 스트림 암호 Trivium 의 약화 된 버전 인 Bivium-B ( Trivium 유사 암호의 대수 분석 참조 )를 사용합니다 .

이 프로그램은 정수 시퀀스를 초기 상태로 사용하고 434 번 상태를 업데이트하고 (354 라운드는 완전 확산을 달성) 177 비트의 출력을 생성하여 올바른 시퀀스와 비교합니다.

상태의 크기가 정확히 177 비트이기 때문에,이 해야 고유의 초기 상태를 식별하는 데 충분하다.

예제 실행

$ echo $LANG
en_US.UTF-8
$ base64 -d > block.cjam <<< IgThuKHqrLzsj4nlo6XrlqjhiKTrrabjqpDqjaHjoanmipjvpb7itozuoIDtjK3rrbLul7bkr6zqgKvvjafpg6/im4XlvajqhIfrso3uprrotbfvmL/hnqPojqjguonhhp7mtoHujLPuipzlkaLpspLssJzii5npn6rpsLTqn5PkmKbspYbnlq3itorlh4Pmj60iMkcjYjEyOWI6Y34=
$ wc -m block.cjam
62 block.cjam
$ cjam block.cjam < block.secret; echo
1
$ cjam block.cjam <<< "1 2 3 4 5"; echo
0

6

CJam, 91 자

q~]KK#bD#"᫖࿼듋ޔ唱୦廽⻎킋뎢凌Ḏ끮冕옷뿹毳슟夫΢眘藸躦䪕齃噳卤"65533:Bb%"萗縤ᤞ雑燠Ꮖ㈢ꭙ㈶タ敫䙿娲훔쓭벓脿翠❶셭剮쬭玓ୂ쁬䈆﹌⫌稟"Bb=

스택 교환은 인쇄 할 수없는 문자를 다루기 쉽지만 이 붙여 넣기 에서 코드를 복사 하여 CJam 인터프리터 에 붙여 넣는 것이 좋습니다 .

작동 원리

기본 65533 숫자의 문자 숫자를 고려하여 유니 코드 문자열을 정수로 바꾸면 다음 코드가 실행됩니다.

" Read the integers from STDIN and collect them in an array.                               ";

q~]

" Convert it into an integer by considering its elements digits of a base 20**20 number.   ";

KK#b

" Elevate it to the 13th power modulus 252 ... 701.                                        ";

D#
25211471039348320335042771975511542429923787152099395215402073753353303876955720415705947365696970054141596580623913538507854517012317194585728620266050701%

" Check if the result is 202 ... 866.                                                      ";

20296578126505831855363602947513398780162083699878357763732452715119575942704948999334568239084302792717120612636331880722869443591786121631020625810496866=

13은 모듈러스의 계보에 대한 coprime이기 때문에 (계류는 비밀이므로 나를 믿어야 할 것입니다) 다른 기반은 다른 결과를 생성합니다. 즉, 솔루션은 고유합니다.

작은 지수 (13)를 악용 할 수 없다면이 잠금을 해제하는 가장 효율적인 방법은 계수를 인수 분해하는 것입니다 ( RSA 문제 참조 ). 72 시간의 인수 분해 시도를 견뎌야하는 모듈러스에 대해 512 비트 정수를 선택했습니다.

예제 실행

$ echo $LANG
en_US.UTF-8
$ base64 -d > lock.cjam <<< cX5dS0sjYkQjIgHuiJHhq5bgv7zrk4velOWUse6zjuCtpuW7veK7ju2Ci+uOouWHjOG4ju+Rh+uBruWGleyYt+u/ueavs+6boOyKn+Wkq86i55yY6Je46Lqm5KqV6b2D5Zmz75Wp5Y2kIjY1NTMzOkJiJSIB6JCX57ik4aSe74aS6ZuR54eg4Y+G44ii6q2Z44i244K/5pWr5Jm/5aiy7ZuU7JOt67KT7rO26IS/57+g4p2275+K7IWt5Ymu7Kyt546T4K2C7IGs5IiG77mM4quM56ifIkJiPQ==
$ wc -m lock.cjam
91 lock.cjam
$ cjam lock.cjam < lock.secret; echo
1
$ cjam lock.cjam <<< "1 2 3 4 5"; echo
0

첫 번째 문자에서 불필요한 문자를 제거하는 것을 잊은 이후 새 버전을 게시했습니다. 비밀 시퀀스는 여전히 동일하므로 둘 중 하나를 크래킹 할 수 있습니다.
Dennis

참고로, 팩토링 시도를 중단합니다. msieve는 시간 제한을 276 시간으로 설정했지만 이는 요인 기반을 구축하기위한 것입니다. 그 당시 그것은 found 1740001 rational and 1739328 algebraic entries; 그 이후로 처리하는 데 거의 100 시간이 걸렸습니다 sieving in progress b = 46583, 0 complete / 0 batched relations (need 44970493).
피터 테일러

@PeterTaylor : 512 비트가 과잉 인 것처럼 보입니다. 다른 답변이 나이 답변에서 정수를 고려하려고 했습니까?
Dennis

아 죄송합니다. 예, 다른 사람
피터 테일러

4

파이썬-128

이것을 시도해 봅시다 :

i=input()
k=1050809377681880902769L
print'01'[all((i>1,i[0]<i[4],k%i[0]<1,k%i[4]<1,i[4]-i[3]==i[3]-i[2]==i[2]-i[1]==i[1]-i[0]))]

(예 : 쉼표로 구분 된 5 개의 숫자를 입력해야합니다 1,2,3,4,5.)


3
32416190039,32416190047,32416190055,32416190063,32416190071
Martin Ender

와우, 그것은 빠르다! 네가 옳아! 그리고 나갔어
Falko

3
Btw, 5 개의 정수가 32 비트 정수에 맞지 않기 때문에 실제로 유효하지 않습니다.
Martin Ender

4

자바 : 468

입력은 k(int[5])입니다. 간격이 고르지 않으면 일찍 울립니다. 그렇지 않으면 열 개의 해시가 모두 올바른지 알아내는 데 약간의 시간이 걸립니다. 숫자가 큰 경우 "비트"는 10 초 이상을 의미하므로 크래커를 설득 할 수 있습니다.

//golfed
int k(int[]q){int b=q[1]-q[0],i,x,y,j,h[]=new int[]{280256579,123883276,1771253254,1977914749,449635393,998860524,888446062,1833324980,1391496617,2075731831};for(i=0;i<4;)if(q[i+1]-q[i++]!=b||b<1)return 0;for(i=1;i<6;b=m(b,b/(i++*100),(1<<31)-1));for(i=0;i<5;i++){for(j=1,x=b,y=b/2;j<6;x=m(x,q[i]%100000000,(1<<31)-1),y=m(y,q[i]/(j++*1000),(1<<31)-1));if(x!=h[i*2]||y!=h[i*2+1])return 0;}return 1;}int m(int a,int b,int c){long d=1;for(;b-->0;d=(d*a)%c);return (int)d;}

// line breaks
int k(int[]q){
    int b=q[1]-q[0],i,x,y,j,
    h[]=new int[]{280256579,123883276,1771253254,1977914749,449635393,
                  998860524,888446062,1833324980,1391496617,2075731831};
    for(i=0;i<4;)
        if(q[i+1]-q[i++]!=b||b<1)
            return 0;
    for(i=1;i<6;b=m(b,b/(i++*100),(1<<31)-1));
    for(i=0;i<5;i++){
        for(j=1,x=b,y=b/2;j<6;x=m(x,q[i]%100000000,(1<<31)-1),y=m(y,q[i]/(j++*1000),(1<<31)-1));
        if(x!=h[i*2]||y!=h[i*2+1])
            return 0;
    }
    return 1;
}
int m(int a,int b,int c){
    long d=1;for(;b-->0;d=(d*a)%c);
    return (int)d;
}

1
입력 산술 시퀀스가 ​​내림차순이면 코드가 중단됩니다. 또는 적어도 시간 오래 걸립니다. 비밀 코드가 오름차순이라고 생각하게 만드는 것은 ...
Keith Randall

3
@KeithRandall 죄송합니다. 내림차순 시퀀스가 ​​비정상적으로 짧은 시간이 걸리도록 4 바이트를 추가 하여 믿음을 더욱 강화 해 봅시다 .
Geobits

4

자바 : 342

int l(int[]a){String s=""+(a[1]-a[0]);for(int b:a)s+=b;char[]c=new char[11];for(char x:s.toCharArray())c[x<48?10:x-48]++;for(int i=0;i<11;c[i]+=48,c[i]=c[i]>57?57:c[i],i++,s="");for(int b:a)s+=new Long(new String(c))/(double)b;return s.equals("-3083.7767567702776-8563.34366442527211022.4345579010483353.1736981951231977.3560837512646")?1:0;}

다음은 입력 문자 수와 특정 입력에 따라 달라지는 문자열 기반 사물함입니다. 시퀀스 모호한 대중 문화 참조를 기반으로 할 수 있습니다. 즐기세요!

언 골프 :

int lock(int[]a){
    String s=""+(a[1]-a[0]);
    for(int b:a)
        s+=b;
    char[]c=new char[11];
    for(char x:s.toCharArray())
        c[x<48?10:x-48]++;
    for(int i=0;i<11;c[i]+=48,
                     c[i]=c[i]>57?57:c[i],
                     i++,
                     s="");
    for(int b:a)
        s+=new Long(new String(c))/(double)b;
    return s.equals("-3083.7767567702776-8563.34366442527211022.4345579010483353.1736981951231977.3560837512646")?1:0;
}

2
8675309? 90210?
말라기

1
@Malachi 의심 할 여지없이 두 가지 뛰어난 참고 자료는 있지만이 연습에 대한 적용 가능성을 확인하거나 거부 할 수는 없습니다.
Geobits

lol, 나는이 도전이 아직 어떻게 작동하는지 완전히 이해하지 못했습니다. 나중에 집에있을 때 기회를 줄 수 있습니다.
말라기

1
초기 용어는 -8675309델타입니다 5551212.
피터 테일러

@PeterTaylor 멋지게 완료 :)
Geobits

4

파이썬, 147

편집 : Dennis의 의견에 따라 짧은 버전. 정보 유출을 피하기 위해 시퀀스를 업데이트했습니다.

def a(b):
    c=1
    for d in b:
        c=(c<<32)+d
    return pow(7,c,0xf494eca63dcab7b47ac21158799ffcabca8f2c6b3)==0xa3742a4abcb812e0c3664551dd3d6d2207aecb9be

불완전하다고 생각되는 불연속 대수 문제를 기반으로하지만, 내가 사용하는 소수는 아마도 너무 작아서 안전하지 않을 수도 있습니다 (그리고 다른 문제가있을 수도 있습니다). 알 수없는 유일한 것은 두 개의 32 비트 정수이므로 당연히 강제 할 수 있습니다.


이산 대수는 생각보다 훨씬 어렵습니다. 내 크래커는 26 시간 동안 이것에 있었다. 나는 포기한다.
Dennis

상수 를 초기화 c=1, 계산 c=(c<<32)+d및 변경하여 부호 문제를 해결할 수 있습니다.
Dennis

3

자바 스크립트 125

이것은 금방 깨어 져야합니다. 나는 더 강한 것을 추적 할 것이다.

function unlock(a, b, c, d, e)
{
    return (e << a == 15652) && (c >> a == 7826) && (e - b == d) && (d - c - a == b) ? 1 : 0;
}

6
0, 3913, 7826, 11739, 15652
Martin Ender

그렇습니다. :)
rdans

3

루비, 175

a=gets.scan(/\d+/).map(&:to_i)
a.each_cons(2).map{|x,y|x-y}.uniq[1]&&p(0)&&exit
p a[2]*(a[1]^a[2]+3)**7==0x213a81f4518a907c85e9f1b39258723bc70f07388eec6f3274293fa03e4091e1?1:0

암호화 해시 srand또는를 사용하는 것과 달리 이것은 독창적입니다 (약간의 실마리입니다). 숫자가 아닌 개행 문자 나 문자로 구분 된 STDIN을 통해 5 개의 숫자를받습니다. STDOUT으로 출력합니다.


그렇습니다.
histocrat

2
622238809,1397646693,2173054577,2948462461,3723870345(나의 이전 추측은 실수가 있었지만 이것은 테스트되었습니다). 마지막 숫자가 부호있는 32 비트 정수에 맞지 않기 때문에 이것이 유효하다고 생각하지 않습니다.
Martin Ender

3

GolfScript (116 자)

공백으로 구분 된 정수로 입력을받습니다.

~]{2.5??:^(&}%^base 2733?5121107535380437850547394675965451197140470531483%5207278525522834743713290685466222557399=

2
-51469355 -37912886 -24356417 -10799948 2756521
Dennis

잘 하셨어요. 작은 지수를 이용 했습니까?
피터 테일러

2
아니요, 계수를 인수 분해했습니다. primo의 Multiple Polynomial Quadratic Sieve 와 PyPy를 사용하여 단 13 초만 걸렸습니다 .
Dennis

이 경우 압축 된 모듈러스를 사용하여 현재 골프를 버릴 수도 있습니다. 팩토링으로부터 안전하기 위해 결과가 1024 비트와 같아야한다면 base-256 표현을 사용하더라도 너무 길어질 것입니다.
피터 테일러

내가하지 희망. 내 대답은 당신과 같은 아이디어를 사용하지만 512 비트 모듈러스와 훨씬 작은 지수 (13)를 사용합니다. 72 시간 시간 제한을 감안할 때, 그 ... 충분
데니스

3

C 459 바이트

Tyilo에 의해 해결-아래의 편집을 읽으십시오

int c (int* a){
int d[4] = {a[1] - a[0], a[2] - a[1], a[3] - a[2], a[4] - a[3]};
if (d[0] != d[1] || d[0] != d[2] || d[0] != d[3]) return 0;
int b[5] = {a[0], a[1], a[2], a[3], a[4]};
int i, j, k;
for (i = 0; i < 5; i++) { 
for (j = 0, k = 2 * i; j < 5; j++, k++) {
k %= i + 1;
b[j] += a[k];
}
}
if (b[0] == 0xC0942 - b[1] && 
b[1] == 0x9785A - b[2] && 
b[2] == 0x6E772 - b[3] && 
b[3] == 0xC0942 - b[4] && 
b[4] == 0xB6508 - b[0]) return 1;
else return 0;
}

우리는 누군가 C 솔루션을 작성해야합니까? 나는 길이가있는 사람에게 깊은 인상을받지 않으며 골퍼가 아닙니다. 그래도 흥미로운 도전이 되길 바랍니다!

나는 이것을 깨는 확실한 방법이 없다고 생각하며, 모든 시도를 열심히 기다리고 있습니다! 이 솔루션이 독특하다는 것을 알고 있습니다. 길이 요건을 충족시키기 위해 난독 화를 최소화합니다. 이것은 간단하게 테스트 할 수 있습니다 :

int main(){
    a[5] = {0, 0, 0, 0, 0} /* your guess */
    printf("%d\n", c(a));
    return 0;
}

추신 :에 의미가있다 a[0] 그 자체로는 숫자로서의 있으며, 누군가 주석에서 지적하고 싶습니다!

편집하다:

해결책: 6174, 48216, 90258, 132300, 174342

크래킹에 대한 참고 사항 :

이것은 사용 된 방법이 아니지만 (주석 참조) 매우 쉬운 무차별 대입으로 내 암호를 해독했습니다. 이제 숫자를 크게 만드는 것이 매우 중요하다는 것을 알고 있습니다. 다음 코드는 upper_bound알려진 상한 인 모든 암호를 해독 할 수 있습니다 a[0] + a[1] + a[2] + a[3] + a[4]. 위 암호의 상한은 457464의 방정식 시스템 b[]과 일부 알고리즘을 통해 도출 할 수 있습니다 . 그것은 보여 질 수있다 b[4] = a[0] + a[1] + a[2] + a[3] + a[4].

int a[5];
for (a[0] = 0; a[0] <= upper_bound / 5; a[0]++) {
    for (a[1] = a[0] + 1; 10 * (a[1] - a[0]) + a[0] <= upper_bound; a[1]++) {
        a[2] = a[1] + (a[1] - a[0]);
        a[3] = a[2] + (a[1] - a[0]);
        a[4] = a[3] + (a[1] - a[0]);
        if (c(a)) {
            printf("PASSED FOR {%d, %d, %d, %d, %d}\n", a[0], a[1], a[2], a[3], a[4]);
        }
    }
    printf("a[0] = %d Checked\n", a[0]);
}

으로는 a[0] = 6174,이 루프는 1 분 조금 내 일을 끊었다.


6
해결책 : 6174, 48216, 90258, 132300, 174342.
Tyilo

와아, 그것은 빠르다. 좋은데 Bruteforced, 또는 내가 놓친 영리한 것을 찾았습니까?
BrainSteel

Mathematica의 상징적 평가를 다음과 같이 사용했습니다 : ghostbin.com/paste/jkjpf screenshot : i.imgur.com/2JRo7LE.png
Tyilo

편집 : 나는 기본적으로 같은 일을했지만 500k에서 상단을 퍼지했습니다. 답을 얻었고 Tyilo가 이미 그것을 게시 한 것을 보았습니다 :(
Geobits

@Geobits 놀랍도록 정확한 추측입니다. 그 숫자의 끝에 0을 더 넣어야합니다.
BrainSteel

3

매스 매 티카 80 67

f=Boole[(p=NextPrime/@#)-#=={18,31,6,9,2}&&BitXor@@#~Join~p==1000]&

달리는:

f[{1,2,3,4,5}] (* => 0 *)

아마도 쉽게 깨지기 쉽고 여러 솔루션이있을 수 있습니다.

업데이트 : Martin Büttner가 제안한 것을 수행하여 골프 향상. 기능과 키의 기능은 변경되지 않았습니다.


@ MartinBüttner 당신이 그들을 부를 때 더 높은 점수를 얻기 위해 답변을 개선. Smart; P
Tyilo

허, 카운터 챌린지의 득점에 관한 단락을 건너 뛰었습니다. 나는 그것이 전혀 점수없이 그것의 재미를위한 것이라고 생각했다. 나는 그것이 내 솔루션을 단축시키는 것이 타당하지 않다고 생각하지만 내 점수를 떨어 뜨릴 수 있기 때문에 깨고 싶다.
Martin Ender

4
{58871,5592,-47687,-100966,-154245}
freddieknets

@freddieknets 내가 만들 때 사용한 솔루션이 아닙니다. NextPrime음수 값을 반환 할 수 있다는 것을 몰랐습니다 . 어떻게 찾았 어?
Tyilo

그런 다음 키가 고유하지 않습니다 : p. 방금 몇 가지 테스트를 수행했습니다. NextPrime [#]-#이 31로 평가되는 숫자가 많지 않으므로 쉽게 해독 할 수 있습니다.
freddieknets

2

Python27, 283 182

좋아, 나는 내 사물함에 대해 매우 확신하지만, 입력에 '반복하기 어려운'계산을 추가하여 뒤집기 어렵게 만드는 것은 꽤 길다.

import sys
p=1
for m in map(int,sys.argv[1:6]):m*=3**len(str(m));p*=m<<sum([int(str(m).zfill(9)[-i])for i in[1,3,5,7]])
print'01'[p==0x4cc695e00484947a2cb7133049bfb18c21*3**45<<101]

편집 : 추가 골프를위한 colevk 감사합니다. 편집 중에 버그와 알고리즘에 결함이 있음을 깨달았습니다. 아마 다음 번에 더 나은 행운을 얻게 될 것입니다.


5
이것은 인수의 순서를 변경해도 변하지 않으므로 유효한 로커가 아닙니다.
피터 테일러

게다가, 게시 된 코드가 버그가 있다고 생각합니다. 키가 121174841 121174871 121174901 121174931 121174961작동하지만 [1,3,5,7]7 행 의 목록 이로 바뀔 때만 가능합니다 [1,3,5,7,11].
Ilmari Karonen

Darn, 그렇습니다. 오타를 고치는 중이 었는데,이 과정에서 알고리즘에서 중대한 실수를 저지르고 깨지기 쉬웠습니다.
stokastic

실제로 버그를 찾아 수정하는 것은 어려운 부분이었습니다. 알고리즘을 고려할 때 상수를 고려하는 것은 시도해야 할 명백한 일이었습니다.
Ilmari Karonen

2

매쓰 142 146

편집 : 키는 고유하지 않았으며 4자를 추가했습니다.

n=NextPrime;
f=Boole[
    FromDigits /@ (
        PartitionsQ[n@(237/Plus@##) {1, ##} + 1] & @@@ 
            IntegerDigits@n@{Plus@##-37*Log[#3],(#1-#5)#4}
    ) == {1913001154,729783244}
]&

(가독성 및 가독성을 위해 추가 된 공백과 줄 바꿈)

용법:

f[1,2,3,4,5]   (* => 0 *)

1
초기 용어 256208, 델타 -5.
피터 테일러

Dang, 이건 내 원래 키가 아니기 때문에 여전히 독특하지 않습니다. 당신은 무차별 했습니까?
freddieknets

테스트 해보십시오. Mathematica에 액세스 할 수 없기 때문에 실수했을 수 있습니다. 각 단계는 무차별 대입을 사용하지만 컴퓨터 시간이 많지 않습니다. 이 접근법은 IntegerDigits초기 결과와 델타에 대한 후보를 얻기 위해 결과를 거꾸로 계산하는 것입니다.
피터 테일러

그러나이 접근법이 어쨌든 독창적 일 수는 없습니다. 5 개의 입력 중 두 번째 입력은에 전달 된 합계에만 사용됩니다 NextPrime. 우리가 그것을 더하기 또는 빼기로 바꾸면, 그들 중 적어도 하나는 다음에 같은 소수를 줄 것입니다.
피터 테일러

예. 그러나 산술 시퀀스의 경우 필요한 입력과 마찬가지로 고유해야합니다.
freddieknets

1

2 시간 후 @Dennis에 의해 금이 간


일을 시작하는 간단한 것-나는 이것이 금방 깨질 것이라고 완전히 기대합니다.

피스 , 13

h_^ZqU5m-CGdQ

STDIN에서 쉼표로 구분 된 입력을받습니다.

다음과 같이 실행하십시오 (-c는 프로그램을 명령 행 인수로 사용함을 의미 함).

$ echo '1,2,3,4,5' | python3 pyth.py -c h_^ZqU5m-CGdQ
0

프로그램 수정-사양을 이해하지 못했습니다.

이 언어는이 경쟁에서 너무 난해 할 수 있습니다. OP가 그렇게 생각하면 제거하겠습니다.


7
그게 1,2,3,4,5열쇠 라는 것을 방금 주었 습니까?
피터 테일러

1
내가 시도한 모든 입력은 1을 반환했습니다. 출력으로 1과 0을 전환 했습니까?
Tyilo

죄송합니다. 출력과 반품의 차이를 이해하지 못했습니다. 이제 프로그램이 작동해야합니다. 동일한 기본 알고리즘.
isaacg

3
97,96,95,94,93(방금 내 크래킹 점수를 죽였습니다.)
Dennis

@Dennis 잘 했어. 크래킹 점수 시스템을 변경해야합니다. 정말 이상한 인센티브를 만들고 있습니다.
isaacg

1

루아 105

나는 그것이 금이 오기까지 오래 걸리지 않을 것이라고 생각하지만 여기에 우리는 간다.

function f(a,b,c,d,e)
   t1=a%b-(e-2*(d-b))
   t2=(a+b+c+d+e)%e
   t3=(d+e)/2
   print(t1==0 and t2==t3 and"1"or"0")
end

(명확성을 위해 추가 된 공간이지만 개수에 포함되지 않음)


3, 7, 11, 15, 19또는6, 14, 22, 30, 38
데니스

@ 데니스 : 슬프게도 그중 하나도 아닙니다. 비고 유성을 보장하기 위해 약간 나중에 작업해야합니다.
Kyle Kanos

t1==0때마다 S증가합니다. 또한 두 조건 모두 균질합니다. 경우 S해결책은, 그래서이다 kS.
Dennis

1

펄-256

sub t{($z,$j,$x,$g,$h)=@_;$t="3"x$z;@n=(7,0,split(//,$g),split(//,$h),4);@r=((2)x6,1,1,(2)x9,4,2,2,2);$u=($j+1)/2;for$n(0..$#r+1){eval{substr($t,$j,1)=$n[$n]};if($@){print 0; return}$j+=$r[$n]*$u}for(1..$x){$t=pack'H*',$t;}eval$t;if($@||$t!~/\D/){print 0}}

나는 많은 오류 처리 논리를 넣어야했고 이것은 분명히 더 많이 골라 질 수 있습니다. 1올바른 5 개의 숫자를 얻으면 a가 인쇄 됩니다. 그것은 것입니다 희망 인쇄 a 0(나도 몰라 오류 또는 아무것도 수 있습니다) 다른 모든 것들에 대해. 누구나 코드를 향상 시키거나 골프를 돕고 싶다면 언제든지 도와주세요!


전화 :

t(1,2,3,4,5);

1

루비-130

선형 피드백 시프트 레지스터를 기반으로합니다. 명령 행 인수로 입력합니다.
LFSR의 특성에 따라 고유해야합니다. 단서 : 오름차순 및 모든 긍정적.

아무도 빨리 해결하지 않으면 더 많은 단서를 줄 것입니다.

x=($*.map{|i|i.to_i+2**35}*'').to_i
(9**8).times{x=((x/4&1^x&1)<<182)+x/2}
p x.to_s(36)=="qnsjzo1qn9o83oaw0a4av9xgnutn28x17dx"?1:0

3
초기 값 781783, 증분 17982811
Peter Taylor

@PeterTaylor Argh ... =)
벡터화

1

루비, 249

a=gets.scan(/\d+/).map(&:to_i)
a.each_cons(2).map{|x,y|x-y}.uniq[1]&&p(0)&&exit
r=(a[0]*a[1]).to_s(5).tr'234','(+)'
v=a[0]<a[1]&&!r[20]&&(0..3).select{|i|/^#{r}$/=~'%b'%[0xaa74f54ea7aa753a9d534ea7,'101'*32,'010'*32,'100'*32][i]}==[0]?1:0rescue 0
p v

재미 있어야합니다. 누가 수학이 필요합니까?


2
309, 77347, 154385, 231423, 308461그러나 나는 그것이 독특하다고 생각하지 않습니다.
Martin Ender

예, 그렇지 않습니다. 동일한 정규 표현식 (예 : 처음 두 숫자의 곱)의 경우 103, 232041, 463979, 695917, 927855및 을 찾습니다 3, 7966741, 15933479, 23900217, 31866955. 그리고 추가을 사용하여 다른 유효한 정규 표현식이 있는지 확신합니다 +.
Martin Ender

죄송합니다. 테스트 문자열을 엉망으로 생각합니다. 고유 인수 분해를 사용하는 정규 표현식은 하나만 있어야합니다.
histocrat

문제를 해결하려면 소유 수량자를 고려해야합니다. 삽입 ()하거나 이와 비슷한 방식 으로 더 큰 등가 정규식을 만들 수도 있습니다 .
Martin Ender

1

CJam, 49 자

"腕옡裃䃬꯳널֚樂律ࡆᓅ㥄뇮┎䔤嬣ꑙ䘿휺ᥰ籃僾쎧諯떆Ἣ餾腎틯"2G#b[1q~]8H#b%!

온라인으로 사용해보십시오.

작동 원리

" Push a string representing a base 65536 number and convert it to an integer.            ";

"腕옡裃䃬꯳널֚樂律ࡆᓅ㥄뇮┎䔤嬣ꑙ䘿휺ᥰ籃僾쎧諯떆Ἣ餾腎틯"2G#b

" Prepend 1 to the integers read from STDIN and collect them into an array.               ";

[1q~]

" Convert that array into an integer by considering it a base 2**51 number.               ";

8H#b

" Push the logical NOT of the modulus of both computed integers.                          ";

%!

두 번째 정수가 첫 번째 요소 인 경우에만 결과는 1이되는데, 이는 두 개의 소수 (비밀 순서에 해당하는 것과 다른 올바른 순서에 해당하지 않는 것)의 곱입니다. 따라서 솔루션은 고유합니다.

512 비트 정수를 인수 분해하는 것은 그리 어렵지 않지만 72 시간 안에 아무도 할 수 없기 바랍니다. 320 비트 정수를 사용하는 이전 버전 이 손상되었습니다 .

예제 실행

$ echo $LANG
en_US.UTF-8
$ base64 -d > flock512.cjam <<< IuiFleyYoeijg+SDrOqvs+uEkNaa76a/5b6L4KGG4ZOF76Gi46WE64eu4pSO5JSk5ayj6pGZ5Ji/7Zy64aWw57GD5YO+7I6n6Kuv65aG7qK04byr6aS+6IWO7rSn7YuvIjJHI2JbMXF+XThII2IlIQ==
$ wc -m flock512.cjam
49 flock512.cjam
$ cjam flock512.cjam < flock512.secret; echo
1
$ cjam flock512.cjam <<< "1 2 3 4 5"; echo
0

나는 24 시간 이상 msieve를 실행했지만 자체 부과 시간 제한은 276.51 CPU 시간이므로 낙관적이지 않은 하나의 CPU 만 부여했습니다.
피터 테일러

0

자바 스크립트 958

입력을 여러 데이터 유형으로 변환하고 각 데이터 유형과 관련된 조작을 수행합니다. 시간이 걸리는 사람에게는 상당히 쉽게 되돌릴 수 있습니다.

function encrypt(num)
{
    var dateval = new Date(num ^ (1024-1) << 10);

    dateval.setDate(dateval.getDate() + 365);

    var dateString = (dateval.toUTCString() + dateval.getUTCMilliseconds()).split('').reverse().join('');

    var result = "";

    for(var i = 0; i < dateString.length; i++)
        result += dateString.charCodeAt(i);

    return result;
}

function unlock(int1, int2, int3, int4, int5)
{
    return encrypt(int1) == "5549508477713255485850495848483249555749321109774324948324410511470" && encrypt(int2) == "5756568477713252485848495848483249555749321109774324948324410511470" && encrypt(int3) == "5149538477713248485856485848483249555749321109774324948324410511470" && encrypt(int4) == "5356498477713256535853485848483249555749321109774324948324410511470" && encrypt(int5) == "5748568477713251535851485848483249555749321109774324948324410511470" ? 1 : 0;
}

5
Brute 강요 :320689, 444121, 567553, 690985, 814417
Tyilo

@Tyilo 지금 멈 추면 크래커가 점수를 이길 수 없다고 생각합니다. ;)
Martin Ender

2
@ MartinBüttner 이것이 OP 당 512 미만으로 골프를 타지 않는 한, 그것이 중요하다고 생각하지 않습니다.
Geobits

0

C, 239 (데니스에 의해 파쇄 됨)

업데이트 된 제출물을 보려면 여기 로 이동 하십시오 .

아마도 좀 더 철저하게 골프를 칠 수있을 것입니다. 분명히, 나는 키가 독특하다는 것을 증명하는 데 시간을 들이지 않았지만 (해당하지 않을 수도 있음) 확실히 해시 충돌 순서에 있습니다. 당신이 그것을 부 수면, 방법을 공유하십시오 :)

p(long long int x){long long int i;x=abs(x);
for (i=2;i<x;i++) {if ((x/i)*i==x) return 0;}return 1;}
f(a,b,c,d,e){char k[99];long long int m;sprintf(k,"%d%d%d%d%d",e,d,c,b,a);
sscanf(k,"%lld",&m);return p(a)&&p(b)&&p(c)&&p(d)&&p(e)&&p(m);}

1
그래서 0 0 0 0 0?
Dennis

한숨 이 버그 였지만 그래도 효과가 있습니다.
Orby

좀 더 흥미로운 수정 버전으로 업데이트했습니다.;)
Orby

여기 에서 수정 된 버전을 참조 하십시오 .
Orby

0

C, 212 Orby-금이

Orby의 https://codegolf.stackexchange.com/a/36810/31064 에는 최소한 두 개의 키가 있습니다.

13 103 193 283 373
113 173 233 293 353

Orby는 내가 그것을 해독하는 데 사용한 방법을 물었다. 함수 p는 x%i==02와 x 사이의 모든 i 를 확인 하여 x가 소수인지 확인합니다 ( (x/i)*i==x대신에 대신 사용함 )x%i==0 경우 true를 리턴합니다. 함수 f는 a, b, c, d 및 e가 모두 소수인지 확인합니다. 또한 숫자 m, e, d, c, b의 10 진수 표현의 연결 (순서대로)이 소수인지 확인합니다. 핵심은 a, b, c, d, e 및 m이 모두 소수입니다.

Green and Tao (2004)는 임의의 길이 k에 대해 소수의 소수의 소수가 존재한다는 것을 보여 주므로, 우리는 m이 소수임을 만족하는 이들 시퀀스를 찾아야합니다. -9.223372037e + 18 및 9.223372037e + 18에 의해 제한되는 데 오래 걸리면 연결된 문자열이 오랫동안 길게 맞으면 숫자의 상한이 9999임을 알 수 있습니다. 따라서 파이썬 스크립트를 사용하여 모두 생성 모든 소수 <10000 내의 산술 시퀀스와 그 역 연결이 소수인지 여부를 확인하면 가능한 많은 솔루션을 찾을 수 있습니다.

어떤 이유로 든 거짓 긍정을 생각해 냈지만 위의 두 가지는 프로그램에 따라 유효합니다. 또한 e가 음수이고 나머지가 양수인 솔루션이있을 수 있지만 (p는 x의 계수를 사용합니다), 나는 찾지 못했습니다.

내가 준 키는 모두 산술 시퀀스이지만 Orby의 스크립트는 실제로 입력이 산술 시퀀스 일 것을 요구하지 않는 것처럼 보이므로 유효하지 않은 키도있을 수 있습니다.


0

MATLAB : 분명히 유효하지 않습니다

매우 간단합니다. 올바른 난수를 생성하면됩니다.

function ans=t(a,b,c,d,e)
rng(a)
r=@(x)rng(rand*x)
r(b)
r(c)
r(d)
r(e)
rand==0.435996843156676

여전히 오류가 발생할 수 있지만 문제가되지는 않습니다.


1
이 접근법은 주석에서 금지되어 있습니다. 질문에 언급되지 않은 경우 수정을 제안하십시오. 죄송합니다.
피터 테일러

@PeterTaylor 나는 그때 나가는 것 같아요. 누군가 약점을 찾을 수 있는지 궁금해서 점수없이 여기에 남겨 둘 것입니다.
Dennis Jaheruddin

0

MATLAB (Symbolic Toolbox 포함), 173 자

이것은 공식 출품작이 아니며 다른 사람의 크래킹 점수에는 포함되지 않지만 미친 자랑 권리를 얻을 수 있습니다. ;)

function b=L(S),c=sprintf('%d8%d',S(1),S(2)-S(1));b=numel(unique(diff(S)))==1&&numel(c)==18&&all(c([8,9])==c([18,17]))&&isequal(c,char(sym(sort(c,'descend'))-sym(sort(c))));

기호 도구 상자는 큰 정수의 빼기를 처리하는 데만 필요합니다.

무차별 대견은 개이어야하지만, 시리즈에 익숙하다면 해결책은 사소한 것입니다.


0

파이썬 2 (91)

편집 : 고유성에 대한 주장이 확률 적이므로 허용되지 않습니다. 나는 포기한다.


s=3
for n in input():s+=pow(n,s,7**58)
print s==0x8b5ca8d0cea606d2b32726a79f01adf56f12aeb6e

다음과 같이 정수 목록을 입력으로 사용합니다. [1,2,3,4,5] 받습니다.

루프는 입력에 대해 성가신 방식으로 작동하여 합계와 지수가 남습니다. 이 아이디어는 이산 로그와 비슷하지만 수학적으로 단순하지 않고 복잡한 합병증이 있습니다. 어쩌면 모듈러스의 합성이 취약한 것 같습니다.이 경우에는 다음과 같이 만들 수 있습니다7**58+8 . .

내 키가 유일한 키라는 것을 어떻게 알 수 있는지 모르겠지만 출력 범위는 입력 범위보다 적어도 10 배 더 큽니다. 비록 잠재적 인 출력의 작은 부분 만이 달성 될 수 있지만. 문자 비용으로 항상 자릿수를 늘릴 수 있습니다. 공정한 것을 결정하기 위해 당신에게 맡길 것입니다.

행복한 크래킹!


0

매스 매 티카-72

내 버전 1에 사용 된 것과 동일한 키를 가진 스크립트 버전 2

기본적으로에 대한 음의 소수를 제거합니다 NextPrime.

f=Boole[(p=Abs[NextPrime/@#])-#=={18,31,6,9,2}&&BitXor@@#~Join~p==1000]&

달리는:

f[{1,2,3,4,5}] (* => 0 *)

코드가 무엇을 올바르게 이해하고 있다고 가정하면, 가장 작은 용어 9244115인 델타 몇 가지 솔루션을 얻습니다 25.
피터 테일러

@ PetetTaylor 하나가 유효한지 확인할 수 있습니다.
Martin Ender

@PeterTaylor 맞습니다. 또 다른 열쇠는1073743739, 1073886396, 1074029053, 1074171710, 1074314367
Tyilo

0

파이썬, 86 자

a,b,c,d,e=input()
print 1if(a*c^b*e)*d==0xd5867e26a96897a2f80 and b^d==48891746 else 0

같은 숫자를 입력하십시오 1,2,3,4,5.

> python 36768.py <<< "1,2,3,4,5"
0
> python 36768.py <<< "[REDACTED]"
1

이것은 유효한 제출물이 아닙니다. 입력을 받아들 1,0,1,63021563418517255630720,0입니다.
Dennis

@ 데니스 수정. 나는 그것이 지금 유효하기를 바랍니다.
스낵

1
19960211, 31167202, 42374193, 53581184, 64788175
Dennis

@Dennis 정확하고 굉장합니다. 나는 수학에 매우 가난하다고 생각합니다.
스낵

2
@Dennis 63021563418517255630720는 32 비트 숫자가 아닙니다.
피터 테일러


0

CJam, 37 자 (파손)

"煷➻捬渓类ⶥ땙ዶ꾫㞟姲̷ᐂ㵈禙鰳쥛忩蔃"2G#b[1q~]4G#b%!

온라인으로 사용해보십시오.

작동 원리

내 새로운 답변을 참조하십시오.

예제 실행

$ echo $LANG
en_US.UTF-8
$ base64 -d > flock.cjam <<< IueFt+Keu+aNrOa4k+exu+K2peuVmeGLtuq+q+Oen+Wnsu6AhMy34ZCC47WI56aZ6bCz7KWb5b+p6JSDIjJHI2JbMXF+XTRHI2IlIQ==
$ wc -m flock.cjam
37 flock.cjam
$ cjam flock.cjam < flock.secret; echo
1
$ cjam flock.cjam <<< "1 2 3 4 5"; echo
0

1
737262825 208413108 3974530688 3445680972 2916831257작동하지만 산술 진행이 아닙니다. 3 시간 20 분으로 계산. 2 년 전 EC2에서 512 비트 숫자는 72 시간 동안 75 달러에 가능했던 것 같습니다.
피터 테일러

@PeterTaylor : 1을 반환하지만 마지막 세 정수는 MAX_INT보다 커서 유효한 키가 아닙니다. 즉, 3 시간 20 분은 꽤 인상적입니다. 내가 사용했던 알고리즘은 256 비트 세미 프라임에 16 시간이 걸렸다.
Dennis

델타가 거의 옳았지만 그다지 좋지 않았기 때문에 어딘가에 음수가 있어야한다고 생각했습니다. 나는 그것에 갈 것이다.
피터 테일러

1
737262825 208413109 -320436607 -849286323 -1378136039
피터 테일러

@PeterTaylor : 그 중 하나입니다. 512 비트 버전이 더 오래 지속되기를 바랍니다.
Dennis

-2

C, 212 (분쇄 됨)

이것은 내 이전 제출 과 동일한 아이디어 이며, 더 철저하게 골프를 치고 버그를 수정하여 0,0,0,0,0 (버그를 지적 해 주신 데니스에게 감사드립니다). -std = c99로 컴파일하십시오.

#define L long long
p(L x){x=abs(x);for(L i=2;i<x;i++){if((x/i)*i==x)return 0;}return(x>1);}
f(a,b,c,d,e){char k[99];L m;sprintf(k,"%d%d%d%d%d",e,d,c,b,a);sscanf(k,"%lld",&m);
return p(a)&p(b)&p(c)&p(d)&p(e)&p(m);}

음수 소수의 모든 시퀀스 (산술 또는 비 연산)가 작동합니다. 두 가지 예 : -7 -37 -67 -97 -127,-157 -127 -97 -67 -37
데니스

예, 내 코드에는 버그가 가득합니다. 대답 질소 준 내가 찾던의 라인을 따라입니다. 그러나 더 분명한 답변을 지적하는 좋은 직업.
Orby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.