태그 보관물: cryptography

cryptography

버기 코드 작성

이제 나쁜 코드를 작성하는 능력을 과시 할 때입니다. 나는 언더 핸드 C 콘테스트와 비슷한 새로운 종류의 프로그래밍 퍼즐을 시도하고 있습니다. 가장 큰 차이점은 이것이 거의 사악하지 않다는 것입니다. 그것은 단지 아주 좋은 재미입니다. 퍼즐의 목표는 가능한 많은 버그를 프로그램에 넣는 것입니다. 이 콘테스트의 우승자는 캐릭터 당 버그가 가장 많은 프로그램을 작성하는 사람입니다.

설명을 요구하는 많은 주석이 발생하지 않도록 지금 당장 버그로 간주되는 것을 정의해야합니다.

첫째, 버그는 오류가 아닙니다 . 인터프리터가 오류 (예 : 불일치 한 델리 미터, 형식이 잘못된 구문, 널 (null) 오브젝트의 특성 초과 등)로 감지 할 수있는 문제점이거나 프로그램의 실행 또는 계속을 방해하는 경우에는 그렇지 않습니다. 버그. 그렇지 않으면, 네 개의 문자를 입력 할 수 있고 인터프리터는 8 개의 구문 오류를 나열하고 2의 버그 문자 비율을 주장 할 수 있습니다.

둘째, 버그는 분명히 잘못이 아니어야 하고 버그가 부활절 달걀하지 않습니다 . 이것은 분명 주관적인 기준이지만, 나는 이런 종류의 경쟁에 필수적이라고 생각합니다. 이는 명백한 방식으로 코드를 구체적으로 조작하는 조건부 코드를 가질 수 없음을 의미합니다. (읽기 : 아무도 차이를 알지 못하므로 튜링 피트 언어를 사용하십시오).

셋째, 버그는 그럴듯해야합니다 . 이것은 위와 같은 주관적이지만 버그는 꼼꼼하지 않거나 무지한 사람이나 실수를 한 사람이 작성한 것일 수 있습니다. 예를 들어, 유효하고 올바르게 보이지만 바람직하지 않은 동작 (예 : 괄호 대신 대괄호 사용)을 유발하는 개별 오류 또는 구문이 포함됩니다.

이 버그는 예외적 인 경우를 위해 원치 않는 출력을 포함하여 원치 않는 동작을 프로그램에 발생시킬 수 있습니다. 예를 들어 현재 시간이 종료되었는지 여부에 따라 출력이 다르게 표시됩니다 홀수 또는 짝수 초), 메모리 누수, 데이터 손실 등이 있습니다.

문제 예 :

모든 ASCII 문자를 숫자 값의 오름차순으로 표시하는 프로그램을 만드십시오.

답변 예 :

Brainf ***, 5 문자, 1 버그, 0.2 버그 문자 비율

+[+.]

버그 : 1의 ASCII 문자를 표시하지 않습니다 .+[.+]. 로 변경하여 수정할 수 있습니다 .

좋아, 나는 지금까지 대부분 그것을 얻었어야한다고 생각한다.

시저 암호 해독 및 알파벳순으로 단어 정렬

시저 암호는 일련의 문자를 취하고 알파벳에서 n 문자 위로 이동하여 생성됩니다 . 알파벳의 처음이나 끝까지 가면 A는 Z 다음에, Z는 A 앞에옵니다. 예를 들면 다음과 같습니다.

Mannequin
Nboofrvjo //Shifted over 1 or -25
Wkxxoaesx //Shifted over 10 -16
Ftggxjnbg //Shifted over -7 or 19

두 가지 입력이 제공됩니다 (이유 내에서 가장 편리한 입력을 얻을 수 있습니다). 첫 번째 입력은 단어이고 두 번째 입력은 이동 된 값입니다. 당신의 임무는 디코딩 된 단어를 출력 한 다음 알파벳순으로 정렬 된 후 디코딩 된 단어를 출력하는 것입니다.

예 (나쁜 남자에게 불쾌하지 않으며 단지 예일뿐입니다) :

첫 번째 입력 : gtdx wjbfwiji. ljy Gfi hfssty

두 번째 입력 : 5

첫 번째 결과 : 소년들은 보상을 받았다. 나쁜 것을 얻을 수 없다

두 번째 결과 : 나쁜 소년은 보상을받을 수 없습니다.

행운을 빕니다!



답변

루비, 136 자, 버그 7 개, 비율 = 0.051

o=gets[/\d+/].to_i
$,='\s'
a=gets.split(/ /).map{|w|w.gsub(/[^.,:;?!]/){(97+($&.ord-97-o)%26).chr}}
print a.join,a.sort_by{|a|a[0]}.join
  1. [/\d+/]: 음수는 부호가 제거되었습니다 (입력 유효성 검사 시도)

  2. '\s': 백래시 이스케이프는 큰 따옴표로 묶인 문자열 내에서만 해석되므로 공백이 아닌 리터럴을 생성합니다. \s

  3. split(/ /): 평범한 것과 달리 split, 이것은 개행으로 나뉘 지 않습니다 (그래서 마지막 단어는 개행을 유지합니다)

  4. /[^.,:;?!]/:이 정규 표현식은 문장 부호는 제외하지만 대문자, 숫자 또는 밑줄 및 가장 중요한 줄 바꿈은 제외합니다.

  5. 97: 문장 부호 나 소문자 이외의 다른 문자는 왜곡됩니다

  6. sort_by{|a|a[0]}: 분명히 프로그래머는에 대해 알지 못했고 sort대신 같은 말로 시작하는 단어를 정렬하지 않는이 어리석은 방법을 사용했습니다.

  7. print:와 달리 puts각 인수 사이에 개행 문자를 인쇄하지 않습니다 (따라서 문자열이 서로 붙어 있음)


답변

나는 내 자신의 대답을 받아들이지 않을 것이지만, 나는 당신에게 최고의 버기 분류 해독기를 보여줄 것이라고 생각했습니다. 그것에 대한 좋은 점은 대부분의 버그를 계획하지 않았다는 것입니다.

Brainf *** : 483 자, 11 개 버그

,------------------------------------------------[>,---------]<[<]>[>[
->]<[<]>-]>[+++++++++.>]<[---------------------------<]>>[[>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>]>[[>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>+<<<<<<<<<<<-]>]++++++++++.>[[>>>>>>
>>>>>>>>>>+<<<<<<<<<<<<<<<<-]>]>[>+++++++++++++++++++++++++++.]

입력:

5 gtdx wjbfwiji. ljy Gfi hfssty

산출:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

버그 목록 :

입력 / 디스플레이 버그 :

  1. 양수가 아닌 숫자 또는 숫자는 프로그램을 중단시킵니다.

  2. 암호 해독기는 Z가 A보다 먼저 오게하지 않습니다. ASCII 문자 값만 뺍니다.

  3. 공백은 ASCII ESC (27) 문자로 나타납니다.

  4. 입력이 탭으로 종료되지 않으면 입력 명령 후에 프로그램이 계속되지 않습니다.

  5. 프로그램을 수동으로 종료해야합니다. 중지 될 때까지 ESC 문자가 계속 표시됩니다.

  6. 입력 파일이 ASCII로 인코딩되지 않으면 프로그램이 중단됩니다.

  7. 프로그램은 정렬 된 출력의 첫 문자를 표시하지 않습니다.

정렬 버그 :

정렬을 매우 순진하게 구현했습니다.

  1. 단어 수가 5가 아닌 경우 프로그램이 중단됩니다.

  2. 입력 바이트 수가 60을 초과하면 프로그램이 중단됩니다.

  3. 알파벳 순서가 입력 예제와 동일한 경우에만 프로그램이 올바르게 정렬 될 수 있습니다.

  4. 프로그램은 단어가 예제 입력보다 작 으면 여분의 공백을 추가하고 단어가 더 길면 문자를 덮어 씁니다.

버그 숯 비율은 0.0228 입니다. 분명히 Joey는 나를 이겼지 만 프로그램에 8 개의 다른 문자 만 사용했다는 사실에 자부심을 느낍니다. 그리고 내 버그는 훨씬 더 중요합니다.


답변

C-224 자, 2 개의 버그, 7 가지 정의되지 않은 동작

편집 : 여기에 내 평가가 잘못되었습니다. 부호없는 정수의 오버플로는 실제로 C에 잘 정의되어 있습니다. 또한 부호있는 것과 부호없는 것의 비교도 잘 정의되어 있지만 컴파일러는 정의 된 방식이 생각하지 않을 수 있으므로 경고합니다.

m(char**a,char**b){return strcmp(*a,*b);}main(int c,char*v[]){unsigned i,j
,o;o=atoi(v[1])+19;for(i=2;i<c;i++)for(j=0;j<=strlen(v[i])-1;j++)v[i][j]=(
tolower(v[i][j])-o)%26+97;qsort(v,c,sizeof(v),m);for(i=2;i<c;puts(v[i++]));}

용법:

$ ./a.out 5 gtdx wjbfwiji ljy Gfi hfssty
bad
boys
cannot
get
rewarded

고장:

m(char**a,char**b){return strcmp(*a,*b);}
main(int c,char*v[])
{
    unsigned i,j,o;

    // Undefined behavior if o is assigned negative value.
    o=atoi(v[1])+19;

    // Comparison between signed and unsigned integer.
    for(i=2;i<c;i++)
        // * Bug: if strlen(v[i]) is zero, subtraction will overflow
        //        unsigned value, and loop will have extra iterations.
        // * strlen is implicitly declared.
        //   Undefined behavior if sizeof(void*) != sizeof(int)
        for(j=0;j<=strlen(v[i])-1;j++)
            // tolower expects either an unsigned char casted to an int, or EOF.
            // Thus, undefined behavior if v[i][j] is non-ASCII.
            v[i][j]=(tolower(v[i][j])-o)%26+97;

    // * Bug: Program name and offset are included in the sort.
    //        "./a.out" and "5" both happen to be less than lowercase strings.
    // * qsort is implicitly declared.
    //   Undefined behavior if sizeof(void*) != sizeof(int)
    qsort(v,c,sizeof(v),m);

    // Comparison between signed and unsigned integer.
    for(i=2;i<c;puts(v[i++]));
}


답변

자바 스크립트 : 403 자, 8 개 버그, 비율 = 0.0199

C만큼 나쁘지는 않지만 JavaScript에는 최소한 초보자가 사용할 때 버그가 발생할 수있는 디자인 결함이 있습니다 ( 모든 버그가 수정되지 않은 데모 ).

function W(v){D.write("<input value="+v+">");return D.body.lastChild}function R(J){I=S.indexOf(C=i.value[J]);H=s.value;if(!I){o.value+=C}if(H>0){o.value+=S[I+H]}if(H<0){o.value+=S[I-26-H]}p.value=o.value.split(" ").sort().join(" ");setTimeout("R("+(J+1)+")",99)}D=document;S="ZYXWVUTSRQPONMLKJIHGFEDCBA";S+=S;S+=S.toLowerCase();i=W("input");s=W("shift");W("run type=button onclick=R(0)");o=W("");p=W("")

function W(v) {
    D.write('<input value=' + v + '>');
    return D.body.lastChild;
}

function R(J) {
    I = S.indexOf(C = i.value[J]);
    H = s.value;
    if(!I) o.value += C;
    if(H > 0) o.value += S[I + H];
    if(H < 0) o.value += S[I - 26 - H];
    p.value = o.value.split(' ').sort().join(' ');
    setTimeout('R(' + (J + 1) + ')', 99);
}

D = document;

S = 'ZYXWVUTSRQPONMLKJIHGFEDCBA';
S += S;
S += S.toLowerCase();

i = W('input');
s = W('shift');
W('run type=button onclick=R(0)');
o = W('');
p = W('');

  1. I + H 추가가 아닌 문자열 연결입니다. undefinedundefinedundefined...
  2. !I.indexOf()일치하지 않는 경우 -1을 반환하는 의 반환 값을 확인하는 올바른 방법이 아닙니다 .boysVrewardedVV...
  3. 누락 된 else키워드 :boys Vrewarded.V Vget...
  4. 입력이 끝날 때 멈추지 않습니다. ...cannotundefinedundefined...
  5. 제로 시프트를 올바르게 처리하지 않습니다 (예 : 프로그램을 사용하여 단어 정렬)
  6. 부정적인 변화를 다룰 것인가? 정확하지 않습니다.
  7. 버튼을 두 번 클릭하면 두 번째 시간 초과가 시작되어 잘못된 출력이 발생합니다 ( 이전 버그 대부분이 수정 된 데모 ) :
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. 버튼을 클릭하면 출력 텍스트 상자가 비어 있어야합니다

또한 ES5에서만 표준화 된 ECMAScript 3에 대한 확장을 사용하므로 이전 버전의 IE에서는 작동하지 않습니다.


답변

Python3 184 자, 버그 4 개. 버그 비율 0,0217

import string
d=input()
y=int(input())
print("".join(sorted(d.translate(str.maketrans("".join([chr(x)for x in range(96,123)]),"".join([chr(96+(x+y)%26)for x in range(26)]))).split())))

디고 프드 :

data = input() #string to convert
y = int(input()) #value to shift
print("".join(
    sorted(
        data.translate(
            str.maketrans(
                "".join([chr(x) for x in range(96,123)]),
                "".join([chr(96+(x+y)%26) for x in range(26)]))
            ).split()
        )))

입력 예 : gtdx wjbfwiji. ljy Gfi hfssty
입력 예 : -5
출력 예 : Gcanxrb mmnsfdsqdv`qcdc.

알려진 버그 :

  1. 대문자를 변환하지 않습니다
  2. `를 포함하고 그것과 변환합니다.
  3. ASCII가 아닌 문자를 변환하지 않습니다 (åäö)
  4. 공백을 인쇄하지 않습니다.
  5. 구두점을 처리 할 수는 있지만 무시할 수 있습니다.이 계산은 포함하지 않지만 비율을 0.027로 설정하면

나는 의도적으로 버그를 만들어내는 데 능숙하지 않습니다.


답변