Tulis Kode Buggy [ditutup]

17

Sekarang saatnya memamerkan kemampuan Anda untuk menulis kode yang buruk. Saya mencoba jenis baru teka-teki pemrograman, paling mirip, saya pikir, dengan kontes C curang. Perbedaan utama adalah bahwa ini hampir tidak jahat: itu hanya beberapa kesenangan bersih yang bagus. Tujuan dari teka-teki ini adalah untuk mengemas bug sebanyak mungkin ke dalam suatu program. Pemenang kontes ini adalah yang menulis program dengan bug paling banyak per karakter.

Untuk menghindari utas komentar yang meminta klarifikasi, sekarang saya harus mendefinisikan apa yang saya anggap sebagai bug yang memenuhi syarat.

Pertama, bug bukan kesalahan . Jika itu adalah masalah yang dapat dideteksi oleh penerjemah sebagai kesalahan (mis pembatas yang tidak cocok, sintaks yang terbentuk dengan buruk, mengakses properti dari objek nol, dll.) Atau jika itu mencegah program untuk mengeksekusi atau melanjutkan, itu bukan sebuah bug. Jika tidak, Anda bisa mengetikkan empat karakter dan penerjemah dapat membuat daftar delapan kesalahan sintaks dan Anda dapat mengklaim rasio bug-karakter 2.

Kedua, bug tidak boleh salah dan bug bukan telur paskah . Ini tentu saja merupakan kriteria subyektif, tetapi saya pikir penting untuk jenis kontes ini. Ini berarti Anda tidak dapat memiliki kode kondisional yang secara spesifik mengubah kode dengan cara yang jelas. (Baca: gunakan bahasa lubang turing, karena tidak ada yang akan tahu bedanya).

Ketiga, bug harus masuk akal . Ini subjektif, seperti yang di atas, tetapi bug tersebut harus terlihat seperti ditulis oleh orang yang kurang teliti atau mungkin tidak tahu, atau seseorang yang baru saja membuat kesalahan. Ini termasuk, misalnya, kesalahan satu per satu atau sintaks yang valid dan terlihat benar tetapi menyebabkan perilaku yang tidak diinginkan (misalnya, menggunakan tanda kurung siku alih-alih tanda kurung).

Bug dapat menyebabkan segala jenis perilaku yang tidak diinginkan pada program, termasuk, tetapi tentu saja tidak terbatas pada, output yang tidak diinginkan untuk beberapa kasus luar biasa, memiliki perilaku yang berbeda berdasarkan pada sesuatu yang tampaknya tidak terkait (mis. Tampilan menampilkan berbeda tergantung pada apakah waktu saat ini berakhir dengan jumlah ganjil atau genap detik), memori bocor, kehilangan data, dan sebagainya.

Contoh Masalah:

Buat program yang menampilkan semua karakter ASCII dengan urutan naik dari nilai numeriknya.

Contoh jawaban:

Brainf ***, 5 karakter, 1 bug, rasio bug-char 0,2

+[+.]

Bug: tidak menampilkan karakter ASCII untuk 1. Dapat diperbaiki dengan mengubah ke .+[.+].

Ok, saya pikir Anda seharusnya sudah mendapatkannya sekarang, inilah teka-teki Anda:

Decode Cipher Caesar dan Sortir Kata-kata Menurut Abjad

Sebuah cipher caesar dibuat dengan mengambil serangkaian huruf dan pergeseran mereka n huruf lebih dalam alfabet. Jika sampai ke awal atau akhir alfabet, A muncul setelah Z, dan Z muncul sebelum A. Misalnya:

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

Anda akan diberikan dua input (Anda bisa mendapatkan input namun yang paling nyaman bagi Anda, masuk akal). Input pertama adalah kata-kata, dan input kedua adalah nilai yang digeser. Tugas Anda adalah untuk mengeluarkan kata-kata yang diterjemahkan, dan kemudian mengeluarkan kata-kata yang sudah diterjemahkan itu setelah diurutkan secara alfabet.

Contoh (jangan tersinggung anak nakal, itu hanya contoh):

Input pertama: gtdx wjbfwiji. ljy Gfi hfssty

Input kedua: 5

Output pertama: anak laki-laki dihargai. menjadi buruk tidak bisa

Keluaran kedua: Anak laki-laki nakal tidak bisa mendapatkan hadiah.

Semoga berhasil!

Peter Olson
sumber
Input kedua contoh Anda bukan -5?
KAMU
@ S.Mark: Inputnya adalah 5 karena tugasnya adalah memecahkan kode sandi.
Nabb
Ah, begitu. @Nabb, terima kasih!
KAMU
Apakah kita harus mendukung huruf besar dan kecil?
Joey Adams
1
@ Peter: Saya sudah membuka diskusi baru tentang meta yang menyangkut pertanyaan ini (antara lain). Mungkin Anda ingin berkomentar.
dmckee

Jawaban:

14

Ruby, 136 karakter, 7 bug, rasio = 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+/]: angka negatif telah dihapus tandanya (upaya yang tampak pada validasi input)

  2. '\s': serangan backlash hanya ditafsirkan dalam string yang dikutip ganda, jadi ini tidak akan menghasilkan spasi melainkan literal \s

  3. split(/ /): tidak seperti dataran split, ini tidak akan terpecah pada baris baru (jadi kata terakhir akan mempertahankan baris baru)

  4. /[^.,:;?!]/: regex ini mengecualikan tanda baca, tetapi tidak huruf besar, angka atau garis bawah, dan, yang paling penting, baris baru

  5. 97: apa pun selain tanda baca atau huruf kecil akan kacau

  6. sort_by{|a|a[0]}: ternyata programmer tidak tahu sort, dan malah menggunakan metode konyol ini, yang tidak mengurutkan kata-kata dimulai dengan huruf yang sama

  7. print: tidak seperti puts, tidak mencetak baris baru di antara setiap argumen (jadi senar keluar terpaku bersama)

Lowjacker
sumber
9

Saya tidak akan menerima jawaban saya sendiri, tetapi saya pikir saya akan menunjukkan kepada Anda pemecah sortir kereta yang paling rumit. Hal yang hebat tentang itu adalah saya bahkan tidak merencanakan sebagian besar bug.

Brainf ***: 483 karakter, 11 bug

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

Memasukkan:

5 gtdx wjbfwiji. ljy Gfi hfssty 

Keluaran:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

Daftar bug :

Input / Display bug:

  1. Angka nonpositif atau angka yang lebih dari satu digit mematahkan program.

  2. Pengurai tidak membuat Z muncul sebelum A. Itu hanya mengurangi nilai karakter ASCII.

  3. Spaces muncul sebagai karakter ASCII ESC (27).

  4. Jika input tidak diakhiri oleh tab, program tidak akan melanjutkan setelah instruksi input.

  5. Program harus diakhiri secara manual. Ini akan terus menampilkan karakter ESC sampai berhenti.

  6. Program akan rusak jika file input tidak dikodekan ASCII.

  7. Program tidak menampilkan karakter pertama dari output yang diurutkan.

Bug penyortiran:

Saya menerapkan penyortiran dengan sangat naif.

  1. Program rusak ketika jumlah kata tidak sama 5.

  2. Program rusak jika jumlah byte input melebihi 60.

  3. Program hanya dapat mengurutkan dengan benar jika urutan abjad identik dengan contoh input.

  4. Program menambahkan ruang ekstra jika ada kata yang lebih kecil dari input contoh dan menimpa karakter jika ada kata yang lebih panjang.

Saya memiliki rasio bug-char 0,0228 . Memang, Joey mengalahkan saya , tetapi saya bangga dengan fakta bahwa saya hanya menggunakan 8 karakter berbeda dalam program saya, dan bug saya jauh lebih kritis.

Peter Olson
sumber
2
re]arded? Kedengarannya serius.
Joe Z.
7

C - 224 karakter, 2 bug, 7 kasus perilaku tidak terdefinisi

Sunting: Penilaian saya di sini salah. Meluap unsigned integer, pada kenyataannya, yang didefinisikan di C . Selain itu, perbandingan antara ditandatangani dan tidak ditandatangani juga didefinisikan dengan baik, tetapi kompiler memperingatkan karena cara itu didefinisikan mungkin bukan apa yang Anda pikirkan.

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

Pemakaian:

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

Kerusakan:

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++]));
}
Joey Adams
sumber
Pekerjaan bagus untuk memecahkan kebekuan. Saya akan mengatakan Anda memiliki rasio bug-char 0,0402.
Peter Olson
@ Peter Apakah itu termasuk komentar dan spasi / CRLF?
Mateen Ulhaq
@muntoo Tidak. Ini 9/224.
Peter Olson
Tapi bukankah seharusnya menghasilkan teks yang tidak disortir juga?
Lowjacker
5

JavaScript: 403 karakter, 8 bug, rasio = 0,0199

Meskipun tidak seburuk C, JavaScript memang memiliki kekurangan desain yang dapat menyebabkan bug, setidaknya saat digunakan oleh pemula ( demo dengan semua bug yang tidak diperbaiki ).

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 adalah rangkaian string, bukan tambahan: undefinedundefinedundefined...
  2. !Ibukan cara yang benar untuk memeriksa nilai pengembalian .indexOf(), yang mengembalikan -1 untuk ketidakcocokan:boysVrewardedVV...
  3. Hilang elsekata kunci:boys Vrewarded.V Vget...
  4. Tidak akan berhenti di akhir input: ...cannotundefinedundefined...
  5. Tidak akan menangani nol shift dengan benar (mis. Hanya mencoba menggunakan program untuk mengurutkan kata)
  6. Apakah ini akan menangani perubahan negatif? Tidak benar
  7. Mengklik dua kali tombol menyebabkan batas waktu kedua untuk memulai, sehingga pendapatan yang salah ( demo dengan sebagian besar bug sebelumnya tetap ):
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Kotak teks keluaran harus kosong ketika tombol diklik

Perhatikan juga bahwa ini tidak akan berfungsi pada versi IE yang lebih lama karena menggunakan ekstensi ke ECMAScript 3 yang hanya distandarisasi dalam ES5.

Mohon berdiri
sumber
2
Panggilan yang bagus untuk tidak memasukkan kurangnya dukungan IE dalam daftar bug Anda, saya akan tergoda untuk menambahkannya, dan saya hampir menyarankannya karena itu adalah "bug" yang sangat umum dalam pengembangan web, sampai saya memikirkan apakah atau tidak kurangnya dukungan untuk Netscape 4 (atau browser apa pun) akan benar-benar menjadi bug.
Peter Olson
Yah, kurangnya dukungan untuk browser yang usang tentu tidak ada salahnya, tetapi kurangnya dukungan untuk yang saat ini akan. Kecuali jika Anda adalah perusahaan Web 2.0 yang benar-benar hebat dan benar-benar menciptakan hal-hal di ujung teknologi sampai berdarah saya akan mengatakan itu adalah bug. (Baca kembali jawabannya; kurangnya dukungan untuk versi yang lebih lama kemungkinan tidak ada bug, maka. XP sudah lama tidak mendukung mainstream dan semua versi Windows yang didukung memiliki versi IE yang layak untuk dijalankan yang bahkan datang melalui pembaruan otomatis).
Joey
1

Python3 184 karakter, 4 bug. Rasio bug 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())))

degolfed:

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

Input contoh: gtdx wjbfwiji. ljy Gfi hfssty
Contoh input: -5
Contoh output: G canxrbmmnsfdsqdv`qcdc.

Bug yang dikenal:

  1. Tidak mengonversi karakter huruf besar
  2. Termasuk `dan mengkonversi ke / dari itu.
  3. Tidak mengonversi karakter non-ascii (åäö)
  4. Tidak mencetak spasi.
  5. Dapat menangani, tetapi mengabaikan, tanda baca - Saya memilih untuk tidak menghitung ini, tetapi jika saya melakukan rasio saya pergi ke 0,027)

Saya tidak pandai membuat bug dengan sengaja.

Robert S.
sumber