이제 나쁜 코드를 작성하는 능력을 과시 할 때입니다. 나는 언더 핸드 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
-
[/\d+/]
: 음수는 부호가 제거되었습니다 (입력 유효성 검사 시도) -
'\s'
: 백래시 이스케이프는 큰 따옴표로 묶인 문자열 내에서만 해석되므로 공백이 아닌 리터럴을 생성합니다.\s
-
split(/ /)
: 평범한 것과 달리split
, 이것은 개행으로 나뉘 지 않습니다 (그래서 마지막 단어는 개행을 유지합니다) -
/[^.,:;?!]/
:이 정규 표현식은 문장 부호는 제외하지만 대문자, 숫자 또는 밑줄 및 가장 중요한 줄 바꿈은 제외합니다. -
97
: 문장 부호 나 소문자 이외의 다른 문자는 왜곡됩니다 -
sort_by{|a|a[0]}
: 분명히 프로그래머는에 대해 알지 못했고sort
대신 같은 말로 시작하는 단어를 정렬하지 않는이 어리석은 방법을 사용했습니다. -
print
:와 달리puts
각 인수 사이에 개행 문자를 인쇄하지 않습니다 (따라서 문자열이 서로 붙어 있음)
답변
나는 내 자신의 대답을 받아들이지 않을 것이지만, 나는 당신에게 최고의 버기 분류 해독기를 보여줄 것이라고 생각했습니다. 그것에 대한 좋은 점은 대부분의 버그를 계획하지 않았다는 것입니다.
Brainf *** : 483 자, 11 개 버그
,------------------------------------------------[>,---------]<[<]>[>[
->]<[<]>-]>[+++++++++.>]<[---------------------------<]>>[[>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>]>[[>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<-]>]>[[>>>>>>>>>>>+<<<<<<<<<<<-]>]++++++++++.>[[>>>>>>
>>>>>>>>>>+<<<<<<<<<<<<<<<<-]>]>[>+++++++++++++++++++++++++++.]
입력:
5 gtdx wjbfwiji. ljy Gfi hfssty
산출:
bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)
버그 목록 :
입력 / 디스플레이 버그 :
-
양수가 아닌 숫자 또는 숫자는 프로그램을 중단시킵니다.
-
암호 해독기는 Z가 A보다 먼저 오게하지 않습니다. ASCII 문자 값만 뺍니다.
-
공백은 ASCII ESC (27) 문자로 나타납니다.
-
입력이 탭으로 종료되지 않으면 입력 명령 후에 프로그램이 계속되지 않습니다.
-
프로그램을 수동으로 종료해야합니다. 중지 될 때까지 ESC 문자가 계속 표시됩니다.
-
입력 파일이 ASCII로 인코딩되지 않으면 프로그램이 중단됩니다.
-
프로그램은 정렬 된 출력의 첫 문자를 표시하지 않습니다.
정렬 버그 :
정렬을 매우 순진하게 구현했습니다.
-
단어 수가 5가 아닌 경우 프로그램이 중단됩니다.
-
입력 바이트 수가 60을 초과하면 프로그램이 중단됩니다.
-
알파벳 순서가 입력 예제와 동일한 경우에만 프로그램이 올바르게 정렬 될 수 있습니다.
-
프로그램은 단어가 예제 입력보다 작 으면 여분의 공백을 추가하고 단어가 더 길면 문자를 덮어 씁니다.
버그 숯 비율은 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('');
I + H
추가가 아닌 문자열 연결입니다.undefinedundefinedundefined...
!I
.indexOf()
일치하지 않는 경우 -1을 반환하는 의 반환 값을 확인하는 올바른 방법이 아닙니다 .boysVrewardedVV...
- 누락 된
else
키워드 :boys Vrewarded.V Vget...
- 입력이 끝날 때 멈추지 않습니다.
...cannotundefinedundefined...
- 제로 시프트를 올바르게 처리하지 않습니다 (예 : 프로그램을 사용하여 단어 정렬)
- 부정적인 변화를 다룰 것인가? 정확하지 않습니다.
- 버튼을 두 번 클릭하면 두 번째 시간 초과가 시작되어 잘못된 출력이 발생합니다 ( 이전 버그 대부분이 수정 된 데모 ) :
boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot
. - 버튼을 클릭하면 출력 텍스트 상자가 비어 있어야합니다
또한 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.
알려진 버그 :
- 대문자를 변환하지 않습니다
- `를 포함하고 그것과 변환합니다.
- ASCII가 아닌 문자를 변환하지 않습니다 (åäö)
- 공백을 인쇄하지 않습니다.
- 구두점을 처리 할 수는 있지만 무시할 수 있습니다.이 계산은 포함하지 않지만 비율을 0.027로 설정하면
나는 의도적으로 버그를 만들어내는 데 능숙하지 않습니다.