Viết mã lỗi [đã đóng]


17

Bây giờ là lúc để thể hiện khả năng của bạn để viết mã xấu. Tôi đang thử một loại câu đố lập trình mới, tương tự như tôi nghĩ, với cuộc thi C ngầm. Sự khác biệt chính là điều này gần như không bất chính: đó chỉ là một niềm vui sạch đẹp. Mục tiêu của câu đố là đóng gói càng nhiều lỗi càng tốt vào một chương trình. Người chiến thắng trong cuộc thi này là người viết chương trình có nhiều lỗi nhất cho mỗi nhân vật.

Để tránh một luồng ý kiến ​​khổng lồ yêu cầu làm rõ, tôi nên xác định ngay những gì tôi cho là lỗi đủ điều kiện.

Đầu tiên, một lỗi không phải là một lỗi . Nếu đó là một vấn đề mà trình thông dịch có thể phát hiện là một lỗi (ví dụ: các dấu phân cách không khớp, cú pháp được tạo sai, lấy một thuộc tính của một đối tượng null, v.v.) hoặc nếu nó ngăn chương trình thực thi hoặc tiếp tục, thì đó không phải là một lỗi. Mặt khác, bạn có thể nhập bốn ký tự và trình thông dịch có thể liệt kê tám lỗi cú pháp và bạn có thể yêu cầu tỷ lệ lỗi-ký tự là 2.

Thứ hai, lỗi rõ ràng không phải là sailỗi không phải là trứng Phục sinh . Đây chắc chắn là một tiêu chí chủ quan, nhưng tôi nghĩ cần thiết cho loại cuộc thi này. Điều này có nghĩa là bạn không thể có mã có điều kiện cụ thể xé mã theo những cách rõ ràng. (Đọc: sử dụng ngôn ngữ pit turing, bởi vì không ai sẽ biết sự khác biệt).

Thứ ba, lỗi phải hợp lý . Điều này là chủ quan, giống như ở trên, nhưng lỗi phải trông giống như nó có thể được viết bởi một người ít quan tâm hoặc có lẽ không biết gì, hoặc một người chỉ mắc lỗi. Điều này bao gồm, ví dụ, lỗi hoặc cú pháp ngoại lệ hợp lệ và có vẻ đúng nhưng gây ra hành vi không mong muốn (giả sử sử dụng dấu ngoặc vuông thay vì dấu ngoặc đơn).

Lỗi này có thể gây ra bất kỳ loại hành vi không mong muốn nào đối với chương trình, bao gồm, nhưng chắc chắn không giới hạn, đầu ra không mong muốn đối với một số trường hợp ngoại lệ, có hành vi khác nhau dựa trên thứ gì đó dường như không liên quan (ví dụ: đầu ra hiển thị khác nhau tùy thuộc vào thời gian hiện tại kết thúc với số giây lẻ hoặc chẵn), rò rỉ bộ nhớ, mất dữ liệu, v.v.

Vấn đề mẫu:

Tạo một chương trình hiển thị tất cả các ký tự ASCII theo thứ tự tăng dần của giá trị số của chúng.

Ví dụ trả lời:

Brainf ***, 5 ký tự, 1 lỗi, tỷ lệ 0,2 lỗi

+[+.]

Lỗi: không hiển thị ký tự ASCII cho 1. Có thể sửa bằng cách thay đổi thành .+[.+].

Ok, tôi nghĩ bạn nên nhận được nó ngay bây giờ, đây là câu đố của bạn:

Giải mã một mật mã Caesar và sắp xếp các từ theo thứ tự abc

Một mật mã caesar được tạo ra bằng cách lấy một loạt các chữ cái và chuyển chúng n chữ cái trong bảng chữ cái. Nếu nó đi đến đầu hoặc cuối của bảng chữ cái, A đến sau Z và Z đến trước A. Ví dụ:

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

Bạn sẽ được cung cấp hai đầu vào (bạn có thể nhận đầu vào tuy nhiên thuận tiện nhất cho bạn, theo lý do). Đầu vào đầu tiên là các từ và đầu vào thứ hai là giá trị nó được dịch chuyển qua. Nhiệm vụ của bạn là xuất ra các từ được giải mã, và sau đó xuất các từ được giải mã sau khi chúng được sắp xếp theo thứ tự abc.

Ví dụ (không xúc phạm đến những chàng trai xấu, đó chỉ là một ví dụ):

Đầu vào đầu tiên: gtdx wjbfwiji. ljy Gfi hfssty

Đầu vào thứ hai: 5

Đầu ra đầu tiên: con trai thưởng. bị xấu không thể

Đầu ra thứ hai: Những chàng trai xấu không thể nhận được phần thưởng.

Chúc may mắn!


Đầu vào thứ hai của ví dụ của bạn không phải là -5?
BẠN

@ S.Mark: Đầu vào là 5 vì nhiệm vụ là giải mã mật mã.
Nabb

Ah tôi thấy. @Nabb, Cảm ơn!
BẠN

Chúng ta có phải hỗ trợ cả chữ in hoa và chữ thường không?
Joey Adams

1
@Peter: Tôi đã mở một cuộc thảo luận mới về meta liên quan đến câu hỏi này (trong số những người khác). Có lẽ bạn muốn bình luận.
dmckee

Câu trả lời:


14

Ruby, 136 ký tự, 7 lỗi, tỷ lệ = 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+/]: các số âm bị xóa dấu hiệu của chúng (một nỗ lực dường như xác thực đầu vào)

  2. '\s': thoát backlash chỉ được diễn giải trong các chuỗi được trích dẫn kép, vì vậy điều này sẽ không tạo ra một khoảng trắng mà thay vào đó là một nghĩa đen \s

  3. split(/ /): không giống như một đồng bằng split, điều này sẽ không phân chia trên các dòng mới (vì vậy từ cuối cùng sẽ giữ dòng mới)

  4. /[^.,:;?!]/: regex này không bao gồm dấu chấm câu, nhưng không ký tự viết hoa, chữ số hoặc dấu gạch dưới và, hầu hết các dòng mới, quan trọng nhất

  5. 97: bất cứ điều gì khác ngoài dấu chấm câu hoặc chữ thường sẽ bị cắt xén

  6. sort_by{|a|a[0]}: rõ ràng là lập trình viên không biết sortvà thay vào đó đã sử dụng phương pháp lố bịch này, không sắp xếp các từ bắt đầu bằng cùng một chữ cái

  7. print: không giống như puts, không in một dòng mới giữa mỗi đối số (để các chuỗi được dán lại với nhau)


9

Tôi sẽ không chấp nhận câu trả lời của riêng tôi, nhưng tôi nghĩ rằng tôi sẽ cho bạn thấy bộ giải mã sắp xếp lỗi cuối cùng. Điều tuyệt vời là tôi thậm chí còn không lên kế hoạch cho hầu hết các lỗi.

Brainf ***: 483 ký tự, 11 lỗi

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

Đầu vào:

5 gtdx wjbfwiji. ljy Gfi hfssty 

Đầu ra:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

Danh sách các lỗi :

Lỗi nhập / hiển thị:

  1. Các số không cố ý hoặc các số có nhiều hơn một chữ số sẽ phá vỡ chương trình.

  2. Bộ giải mã không làm cho Z đến trước A. Nó chỉ trừ giá trị ký tự ASCII.

  3. Dấu cách xuất hiện dưới dạng ký tự ASCII ESC (27).

  4. Nếu đầu vào không bị chấm dứt bởi một tab, chương trình sẽ không tiếp tục sau các hướng dẫn đầu vào.

  5. Chương trình phải được chấm dứt bằng tay. Nó sẽ liên tục hiển thị ký tự ESC cho đến khi dừng lại.

  6. Chương trình sẽ bị hỏng nếu tệp đầu vào không được mã hóa ASCII.

  7. Chương trình không hiển thị ký tự đầu tiên của đầu ra được sắp xếp.

Sắp xếp lỗi:

Tôi thực hiện việc sắp xếp vô cùng ngây thơ.

  1. Chương trình nghỉ khi số lượng từ không bằng 5.

  2. Chương trình bị hỏng nếu số byte đầu vào vượt quá 60.

  3. Chương trình chỉ có thể sắp xếp chính xác nếu thứ tự chữ cái giống hệt với đầu vào ví dụ.

  4. Chương trình thêm không gian bổ sung nếu bất kỳ từ nào nhỏ hơn đầu vào ví dụ và ghi đè các ký tự nếu bất kỳ từ nào dài hơn.

Tôi có tỷ lệ lỗi-char là 0,0228 . Phải thừa nhận rằng Joey đã đánh bại tôi , nhưng tôi tự hào vì thực tế tôi chỉ sử dụng 8 nhân vật khác nhau trong chương trình của mình và lỗi của tôi nghiêm trọng hơn nhiều.


2
re]arded? Nghe có vẻ nghiêm trọng.
Joe Z.

7

C - 224 ký tự, 2 lỗi, 7 trường hợp hành vi không xác định

Chỉnh sửa: Đánh giá của tôi ở đây là không chính xác. Tràn một số nguyên unsigned là, trên thực tế, rõ ràng trong C . Hơn nữa, so sánh giữa ký và không dấu cũng được xác định rõ, nhưng trình biên dịch cảnh báo bởi vì cách nó được xác định có thể không như bạn nghĩ.

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++]));}

Sử dụng:

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

Phá vỡ:

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++]));
}

Tốt công việc để phá vỡ băng. Tôi sẽ nói rằng bạn có tỷ lệ lỗi-0,02.
Peter Olson

@Peter Có bao gồm nhận xét và khoảng trắng / CRLF không?
Mateen Ulhaq

@muntoo số. Đó là 9/224.
Peter Olson

Nhưng nó không nên xuất văn bản chưa sắp xếp?
Lowjacker

5

JavaScript: 403 ký tự, 8 lỗi, tỷ lệ = 0,0199

Mặc dù không tệ như C, nhưng JavaScript có các lỗi thiết kế có thể dẫn đến lỗi, ít nhất là khi được người mới sử dụng ( bản demo với tất cả các lỗi không được trộn lẫn ).

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 là nối chuỗi, không thêm: undefinedundefinedundefined...
  2. !Ikhông phải là cách chính xác để kiểm tra giá trị trả về của .indexOf(), giá trị trả về -1 cho không khớp:boysVrewardedVV...
  3. Thiếu elsetừ khóa:boys Vrewarded.V Vget...
  4. Sẽ không dừng lại ở cuối đầu vào: ...cannotundefinedundefined...
  5. Không xử lý chính xác ca 0 (ví dụ: chỉ cố gắng sử dụng chương trình để sắp xếp các từ)
  6. Nó sẽ xử lý một sự thay đổi tiêu cực? Không chính xác.
  7. Nhấp đúp vào nút khiến thời gian chờ thứ hai bắt đầu, dẫn đến đầu ra không chính xác ( bản demo với hầu hết các lỗi trước đó đã được sửa ) :
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Các hộp văn bản đầu ra phải trống khi nhấp vào nút

Cũng lưu ý rằng điều này sẽ không hoạt động trên các phiên bản IE cũ hơn vì nó sử dụng phần mở rộng cho ECMAScript 3 chỉ được chuẩn hóa trong ES5.


2
Gọi tốt không bao gồm thiếu hỗ trợ IE trong danh sách các lỗi của bạn, tôi đã rất muốn thêm nó và tôi gần như đã đề xuất nó vì đây là một "lỗi" rất phổ biến trong phát triển web, cho đến khi tôi nghĩ về việc có hay không thiếu hỗ trợ cho Netscape 4 (hoặc bất kỳ trình duyệt tùy ý nào) sẽ thực sự là một lỗi.
Peter Olson

Chà, thiếu sự hỗ trợ cho một trình duyệt lỗi thời chắc chắn không làm tổn thương ai, nhưng thiếu sự hỗ trợ cho một trình duyệt hiện tại . Trừ khi bạn là một công ty Web 2.0 hoàn toàn sáng tạo và tạo ra công cụ cho đến khi nó bị chảy máu cho đến khi nó bị chảy ra thì tôi mới nói đó một lỗi. (Đọc lại câu trả lời; thiếu hỗ trợ cho các phiên bản cũ hơn có thể không có lỗi, vì vậy, XP không còn hỗ trợ chính và tất cả các phiên bản Windows được hỗ trợ đều có phiên bản IE phù hợp để chạy qua các bản cập nhật tự động).
Joey

1

Python3 184 ký tự, 4 lỗi. Tỷ lệ lỗi 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())))

suy đồi:

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

Ví dụ đầu vào: gtdx wjbfwiji. ljy Gfi hfssty
Ví dụ đầu vào: -5
Đầu ra ví dụ: G canxrbmmnsfdsqdv`qcdc.

Lỗi đã biết:

  1. Không chuyển đổi ký tự chữ hoa
  2. Bao gồm `và chuyển đổi thành / từ nó.
  3. Không chuyển đổi các ký tự không phải mã ascii (åäö)
  4. Không in dấu cách.
  5. Có thể xử lý, nhưng bỏ qua, chấm câu - Tôi chọn không tính số này, nhưng nếu tôi làm thì tỷ lệ của tôi sẽ là 0,027)

Tôi không giỏi trong việc đưa ra các lỗi cố ý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.