Buggy Kodu Yaz [kapalı]


17

Şimdi kötü kod yazma yeteneklerinizi gösterme zamanı. Bence el yapımı C yarışmasına benzeyen yeni bir tür programlama bulmacası deniyorum. Temel fark, bunun neredeyse hain olmadığıdır: sadece iyi bir temiz eğlence. Bulmacanın amacı, bir programa olabildiğince çok hata toplamaktır. Bu yarışmanın galibi, programı karakter başına en fazla hata ile yazan kişidir.

Açıklama isteyen büyük bir yorum dizisinden kaçınmak için, şu anda niteleyici hatalar olarak düşündüğüm şeyi tanımlamalıyım.

İlk olarak, hata bir hata değildir . Yorumlayıcı tarafından bir hata olarak algılanabilen bir sorunsa (örneğin, eşleşmeyen sınırlayıcılar, hatalı biçimlendirilmiş sözdizimi, boş bir nesnenin özelliğine erişim, vb.) Veya programın yürütülmesini veya devam etmesini önlüyorsa, bir böcek. Aksi takdirde, dört karakter yazabilirsiniz ve yorumlayıcı sekiz sözdizimi hatası listeleyebilir ve hata karakter oranı 2 olabilir.

İkincisi, böcek açıkça yanlış olmamalı ve böcek bir paskalya yumurtası değildir . Bu kesinlikle öznel bir kriter ama bence bu tür bir yarışma için gerekli. Bu, kodu belirgin şekilde yöneten koşullu kodlara sahip olamayacağınız anlamına gelir. (Oku: bir turing çukuru dili kullanın, çünkü kimse farkı bilmeyecek).

Üçüncüsü, hatanın makul olması gerekir . Bu, yukarıdaki gibi özneldir, ancak hata, daha az titiz veya belki de cahil bir kişi veya sadece bir hata yapan biri tarafından yazılmış gibi görünmelidir. Bu, örneğin, geçerli olan ve doğru görünen ancak istenmeyen davranışlara neden olan tek tek hataları veya sözdizimini içerir (örneğin, parantez yerine köşeli parantez kullanarak).

Hata, bazı istisnai durumlar için istenmeyen çıktılar da dahil olmak üzere, ancak bunlarla sınırlı olmamak üzere, programda istenmeyen davranışlara neden olabilir, görünüşte ilgisiz görünen bir şeye göre farklı davranışlara sahiptir (örneğin, mevcut zamanın sona ermesine bağlı olarak çıktı farklı görüntüler. tek veya çift saniye ile), bellek sızıntıları, veri kaybı vb.

Örnek Problem:

Tüm ASCII karakterlerini sayısal değerlerine göre artan sırada görüntüleyen bir program yapın.

Örnek cevap:

Brainf ***, 5 karakter, 1 hata, 0.2 hata oranı oranı

+[+.]

Hata: 1 için ASCII karakteri görüntülenmiyor .+[.+]. Olarak değiştirilerek düzeltilebilir .

Tamam, sanırım şimdi şimdiye kadar almış olmalısınız, işte bulmacanız:

Bir Sezar Şifresini Çözün ve Kelimeleri Alfabetik Olarak Sıralayın

Bir Sezar şifreleme harflerin bir dizi alıp onları kaydırarak oluşturulur n alfabesinde üzerinde harfleri. Alfabenin başına veya sonuna kadar giderse, A Z'den sonra gelir ve Z A'dan önce gelir. Örneğin:

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

Size iki giriş verilecektir (giriş alabilirsiniz, ancak sizin için en uygun olanıdır). İlk girdi kelimelerdir, ikinci girdi ise kaydırıldığı değerdir. Göreviniz kodu çözülen sözcükleri ve sonra da alfabetik olarak sıralandıktan sonra kodu çözülen sözcükleri çıktılamaktır.

Örnek (kötü çocuklara suç yok, bu sadece bir örnek):

İlk girdi: gtdx wjbfwiji. ljy Gfi Instagram Hesabındaki Resim ve Videoları hfssty

İkinci giriş: 5

İlk çıktı: erkekler ödüllendirildi. kötüye gidemem

İkinci çıktı: Kötü çocuklar ödüllendirilemez.

İyi şanslar!


Örneğinizin ikinci girdisi -5 değil mi?
SİZ

@ S.Mark: Girdi 5, çünkü görev şifreyi çözmek.
Nabb

Ah, anlıyorum. @ Nab, Teşekkürler!
SİZ

Hem büyük hem de küçük harfleri desteklememiz gerekir mi?
Joey Adams

1
@Peter: Meta hakkında bu soruyla ilgili (diğerleri arasında) yeni bir tartışma açtım . Belki yorum yapmak istersiniz.
dmckee --- eski moderatör kedi yavrusu

Yanıtlar:


14

Ruby, 136 karakter, 7 hata, oran = 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+/]: negatif sayıların işaretleri kaldırıldı (giriş doğrulamasında görünen bir deneme)

  2. '\s': boşluk kaçışları yalnızca çift tırnaklı dizgiler içinde yorumlanır, bu nedenle bu bir boşluk oluşturmaz, bir değişmez \s

  3. split(/ /): bir ovanın aksine split, bu yeni satırlara bölünmez (bu yüzden son kelime yeni satırı tutacaktır)

  4. /[^.,:;?!]/: bu normal ifade noktalama işaretini içermez, ancak büyük harfli karakterleri, rakamları veya alt çizgileri ve en önemlisi yeni satırları içermez

  5. 97: noktalama işaretleri veya küçük harfler dışında herhangi bir şey bozulacak

  6. sort_by{|a|a[0]}: Görünüşe göre programcı bilmiyordu sortve bunun yerine aynı harfle başlayan kelimeleri sıralamayan bu gülünç yöntemi kullandı.

  7. print: aksine puts, her bir argüman arasında yeni satır yazdırmaz (böylece dizeler birbirine yapıştırılmış olarak gelir)


9

Kendi cevabımı kabul etmeyeceğim, ama size en büyük hata ayıklama şifresini göstereceğimi düşündüm. Bu konuda en iyi şey, hataların çoğunu bile planlamamıştım.

Brainf ***: 483 karakter, 11 böcek

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

Giriş:

5 gtdx wjbfwiji. ljy Gfi hfssty 

Çıktı:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

Hataların listesi :

Giriş / Ekran hataları:

  1. Pozitif olmayan sayılar veya birden fazla rakam olan sayılar programı bozar.

  2. Şifre çözücü Z'nin A'dan önce gelmesini sağlamaz. Sadece ASCII karakter değerini çıkartır.

  3. Boşluklar ASCII ESC (27) karakteri olarak görünür.

  4. Giriş bir sekme tarafından sonlandırılmazsa, giriş talimatlarından sonra program devam etmez.

  5. Program manuel olarak sonlandırılmalıdır. Durdurulana kadar sürekli olarak ESC karakterini görüntüler.

  6. Giriş dosyası ASCII kodlu değilse program kırılır.

  7. Program sıralanan çıktının ilk karakterini görüntülemez.

Hataları sıralama:

Sıralamayı son derece saf bir şekilde uyguladım.

  1. Kelime sayısı 5'e eşit olmadığında program kırılır.

  2. Girdi bayt sayısı 60'ı aşarsa program kesilir.

  3. Program, yalnızca alfabetik sıra, örnek girişle aynı ise doğru şekilde sıralayabilir.

  4. Program, kelimelerden herhangi biri örnek girişten küçükse fazladan boşluk ekler ve sözcüklerden herhangi biri daha uzunsa karakterlerin üzerine yazar.

0.0228 hata-karakter oranım var . Kuşkusuz, Joey beni dövdü , ama programımda sadece 8 farklı karakter kullandığımla gurur duyuyorum ve böceklerim çok daha kritik.


2
re]arded? Kulağa ciddi geliyor.
Joe Z.

7

C - 224 karakter, 2 hata, 7 tanımlanmamış davranış vakası

Düzenleme: Buradaki değerlendirmem yanlış. İşaretsiz bir tamsayıyı taşmak aslında C'de iyi tanımlanmıştır . Dahası, imzalı ve imzasız arasındaki karşılaştırma da iyi tanımlanmıştır, ancak derleyici uyarır çünkü tanımlanma şekli sizin düşündüğünüz olmayabilir.

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

Kullanımı:

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

Yıkmak:

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

Buzu kırmak için iyi bir iş. 0.0402 hata-char oranınız olduğunu söyleyeceğim.
Peter Olson

@Peter Yorumlar ve boşluk / CRLF'leri içeriyor mu?
Mateen Ulhaq

@muntoo Hayır. 9/224.
Peter Olson

Ama ayrıştırılmamış metni de çıkarmamalı mı?
Lowjacker

5

JavaScript: 403 karakter, 8 hata, oran = 0.0199

C kadar kötü olmasa da, JavaScript en azından bir acemi tarafından kullanıldığında hatalara yol açabilecek tasarım kusurlarına sahiptir ( tüm hatalar düzeltilmemiş demo ).

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 dize birleştirme, toplama değil: undefinedundefinedundefined...
  2. !I, .indexOf()eşleşme olmayan bir öğe için -1 döndüren dönüş değerini kontrol etmenin doğru yolu değildir :boysVrewardedVV...
  3. Eksik elseanahtar kelimeler:boys Vrewarded.V Vget...
  4. Giriş sonunda durmayacak: ...cannotundefinedundefined...
  5. Sıfır kaydırmayı doğru işlemeyecek (örneğin, kelimeleri sıralamak için programı kullanmaya çalışmak)
  6. Olumsuz bir kaymayı idare edecek mi? Doğru değil.
  7. Çift tıklayarak düğmeyi yanlış çıkışına (lider, başlamak için ikinci bir zaman aşımı neden demo sabit önceki hataların çoğu ile ):
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Düğme tıklandığında çıktı metin kutuları boş olmalıdır

Ayrıca, yalnızca ES5'te standartlaştırılmış ECMAScript 3 için bir uzantı kullandığından, IE'nin eski sürümlerinde çalışmayacağını unutmayın.


2
Hata listesinde IE desteği eksikliği dahil değil iyi bir çağrı, ben eklemek için oldukça cazip olurdu, ve ben hemen hemen bunu önerdi çünkü ben web geliştirme çok yaygın bir "hata" olduğunu, ben olup olmadığını düşündüm kadar Netscape 4 (veya herhangi bir keyfi tarayıcı) için destek eksikliği gerçekten bir hata olacaktır.
Peter Olson

Eh, bir destek eksikliği eskimiş kesinlikle kimse acıyor tarayıcısı, ancak bir destek eksikliği cari olur biri. Dışarı kanamaları kadar teknolojinin kanama kenarında şeyler yaratan bir kalça ve tamamen rad Web 2.0 şirketi olmadıkça bunu söyleyebilirim olan bir hata. (Cevabı tekrar okuyun; eski sürümler için destek eksikliği muhtemelen bir hata değildir, o zaman XP ana akım desteğinden çok uzaktır ve desteklenen tüm Windows sürümleri, otomatik güncellemelerle bile gelen iyi bir IE sürümüne sahiptir).
Joey

1

Python3 184 karakter, 4 böcek. Hata oranı 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()
        )))

Örnek giriş: gtdx wjbfwiji. ljy Gfi Instagram Hesabındaki Resim ve Videoları hfssty
Örnek giriş: -5
Örnek çıktı: Gcanxrb mmnsfdsqdv`qcdc.

Bilinen hatalar:

  1. Büyük harf karakterleri dönüştürmez
  2. İçerir` ve ona / dan dönüşür.
  3. Ascii olmayan karakterleri dönüştürmez (åäö)
  4. Boşluk yazdırmaz.
  5. Noktalamalarla başa çıkabilir, ancak yok sayar - Bunu saymamayı seçerim, ancak yaparsam oranım 0.027'ye gider)

Kasten böcek bulmakta pek iyi değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.