Buggy Code schreiben [geschlossen]


17

Jetzt ist die Zeit gekommen, Ihre Fähigkeiten zum Schreiben von schlechtem Code unter Beweis zu stellen. Ich probiere eine neue Art von Programmierrätsel aus, die meiner Meinung nach dem hinterhältigen C-Wettbewerb am ähnlichsten ist. Der Hauptunterschied besteht darin, dass dies bei weitem nicht so ruchlos ist: Es ist nur ein guter, sauberer Spaß. Das Ziel des Puzzles ist es, so viele Bugs wie möglich in ein Programm zu packen. Der Gewinner dieses Wettbewerbs ist derjenige, der das Programm mit den meisten Fehlern pro Charakter schreibt.

Um eine Vielzahl von Kommentaren zu vermeiden, die um Klärung bitten, sollte ich jetzt definieren, was ich als qualifizierende Bugs betrachte.

Erstens ist ein Fehler kein Fehler . Wenn es sich um ein Problem handelt, das vom Interpreter als Fehler erkannt werden kann (z. B. nicht übereinstimmende Begrenzungszeichen, falsch geformte Syntax, Zugreifen auf eine Eigenschaft eines Nullobjekts usw.), oder wenn es die Ausführung oder Fortsetzung des Programms verhindert, ist dies nicht der Fall ein Käfer. Andernfalls könnten Sie vier Zeichen eingeben und der Interpreter könnte acht Syntaxfehler auflisten und Sie könnten ein Fehler-Zeichen-Verhältnis von 2 angeben.

Zweitens darf der Fehler nicht offensichtlich falsch sein und ein Fehler ist kein Osterei . Dies ist sicherlich ein subjektives Kriterium, aber ich denke wesentlich für diese Art von Wettbewerb. Dies bedeutet, dass Sie keinen bedingten Code haben können, der den Code auf offensichtliche Weise spezifisch manipuliert. (Lies: benutze eine turing pit Sprache, weil niemand den Unterschied kennt).

Drittens muss der Fehler plausibel sein . Dies ist subjektiv, wie das obige, aber der Fehler muss so aussehen, als ob er von einer weniger akribischen oder vielleicht ignoranten Person oder von jemandem geschrieben worden wäre, der gerade einen Fehler gemacht hat. Dies umfasst beispielsweise Fehler oder eine Syntax, die gültig ist und korrekt aussieht, jedoch unerwünschtes Verhalten verursacht (z. B. Verwendung eckiger Klammern anstelle von Klammern).

Der Fehler kann zu unerwünschtem Verhalten des Programms führen, einschließlich, aber nicht beschränkt auf unerwünschte Ausgaben in bestimmten Ausnahmefällen, die auf scheinbar nicht miteinander in Zusammenhang stehenden Ereignissen beruhen (z. B. werden die Ausgaben unterschiedlich angezeigt, je nachdem, ob die aktuelle Zeit endet) mit einer ungeraden oder geraden Anzahl von Sekunden), Speicherlecks, Datenverlust usw.

Beispiel Problem:

Erstellen Sie ein Programm, das alle ASCII-Zeichen in aufsteigender Reihenfolge ihres numerischen Werts anzeigt.

Beispielantwort:

Brainf ***, 5 Zeichen, 1 Bug, 0,2 Bug-Char-Ratio

+[+.]

Fehler: zeigt das ASCII-Zeichen für 1 nicht an. Konnte durch Ändern auf behoben werden .+[.+].

Ok, ich denke du hättest es jetzt meistens haben sollen, hier ist dein Rätsel:

Dekodiere eine Caesar-Chiffre und sortiere die Wörter alphabetisch

Eine Caesar-Chiffre wird erstellt, indem eine Reihe von Buchstaben genommen und n Buchstaben im Alphabet verschoben werden . Wenn es bis zum Anfang oder Ende des Alphabets reicht, steht A nach Z und Z vor A. Zum Beispiel:

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

Sie erhalten zwei Eingaben (Sie können Eingaben erhalten, die jedoch aus vernünftigen Gründen für Sie am bequemsten sind). Die erste Eingabe sind die Wörter und die zweite Eingabe ist der Wert, um den verschoben wird. Ihre Aufgabe ist es, die decodierten Wörter und anschließend die decodierten Wörter auszugeben, nachdem sie alphabetisch sortiert wurden.

Beispiel (keine Beleidigung für böse Jungs, es ist nur ein Beispiel):

Erste Eingabe: gtdx wjbfwiji. ljy Gfi hfssty

Zweiter Eingang: 5

Erster Output: Jungs belohnt. schlecht werden kann nicht

Zweite Ausgabe: Böse Jungs können nicht belohnt werden.

Viel Glück!


Der zweite Eingang Ihres Beispiels ist nicht -5?
SIE

@ S.Mark: Die Eingabe ist 5, da die Aufgabe darin besteht, die Chiffre zu entschlüsseln.
Nabb

Ah ich sehe. @Nabb, Danke!
SIE

Müssen wir sowohl Groß- als auch Kleinbuchstaben unterstützen?
Joey Adams

1
@ Peter: Ich habe eine neue Diskussion über Meta eröffnet , die diese Frage betrifft (unter anderem). Vielleicht möchten Sie einen Kommentar abgeben.
dmckee

Antworten:


14

Ruby, 136 Zeichen, 7 Bugs, Ratio = 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+/]: negative Zahlen haben ein entferntes Vorzeichen (ein scheinbarer Versuch der Eingabevalidierung)

  2. '\s': Backlash-Escapes werden nur in Strings in doppelten Anführungszeichen interpretiert, sodass kein Leerzeichen, sondern ein Literal generiert wird \s

  3. split(/ /): im Gegensatz zu einer Ebene splitwird dies nicht in Zeilenumbrüchen aufgeteilt (so dass das letzte Wort die Zeilenumbrüche beibehält)

  4. /[^.,:;?!]/: Diese Regex schließt Interpunktion aus, jedoch keine Großbuchstaben, Ziffern oder Unterstriche und vor allem Zeilenumbrüche

  5. 97: alles andere als Interpunktion oder Kleinbuchstaben wird verstümmelt

  6. sort_by{|a|a[0]}: Anscheinend wusste der Programmierer nichts davon sortund verwendete stattdessen diese lächerliche Methode, bei der Wörter, die mit demselben Buchstaben beginnen, nicht sortiert werden

  7. print: Im Gegensatz putsdazu wird zwischen den einzelnen Argumenten kein Zeilenumbruch ausgegeben (daher werden die Zeichenfolgen zusammengeklebt).


9

Ich werde meine eigene Antwort nicht akzeptieren, aber ich dachte, ich würde Ihnen den ultimativen Buggy-Sortier-Entschlüsseler zeigen. Das Tolle daran ist, dass ich nicht einmal die meisten Bugs geplant habe.

Brainf ***: 483 Zeichen, 11 Bugs

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

Eingang:

5 gtdx wjbfwiji. ljy Gfi hfssty 

Ausgabe:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

Liste der Fehler :

Eingabe- / Anzeigefehler:

  1. Nicht positive Zahlen oder Zahlen mit mehr als einer Ziffer unterbrechen das Programm.

  2. Der Entschlüsseler lässt Z nicht vor A kommen. Er subtrahiert nur den ASCII-Zeichenwert.

  3. Leerzeichen werden als ASCII-ESC-Zeichen (27) angezeigt.

  4. Wenn die Eingabe nicht durch einen Tabulator beendet wird, wird das Programm nach den Eingabeanweisungen nicht fortgesetzt.

  5. Das Programm muss manuell beendet werden. Es wird kontinuierlich das ESC-Zeichen angezeigt, bis es gestoppt wird.

  6. Das Programm bricht ab, wenn die Eingabedatei nicht ASCII-codiert ist.

  7. Das Programm zeigt nicht das erste Zeichen der sortierten Ausgabe an.

Fehler sortieren:

Die Sortierung habe ich äußerst naiv umgesetzt.

  1. Das Programm bricht ab, wenn die Anzahl der Wörter nicht 5 beträgt.

  2. Das Programm bricht ab, wenn die Anzahl der eingegebenen Bytes 60 überschreitet.

  3. Das Programm kann nur dann richtig sortieren, wenn die alphabetische Reihenfolge mit der Beispieleingabe identisch ist.

  4. Das Programm fügt zusätzliche Leerzeichen hinzu, wenn eines der Wörter kleiner als die Beispieleingabe ist, und überschreibt Zeichen, wenn eines der Wörter länger ist.

Ich habe ein Bug-Char-Verhältnis von 0,0228 . Zugegeben, Joey hat mich geschlagen , aber ich bin stolz darauf, dass ich nur 8 verschiedene Charaktere in meinem Programm verwendet habe und meine Bugs viel kritischer sind.


2
re]arded? Hört sich ernst an.
Joe Z.

7

C - 224 Zeichen, 2 Bugs, 7 Fälle von undefiniertem Verhalten

Edit: Meine Einschätzung hier ist falsch. Das Überlaufen einer Ganzzahl ohne Vorzeichen ist in C genau definiert . Darüber hinaus ist der Vergleich zwischen vorzeichenbehafteten und nicht vorzeichenbehafteten Elementen ebenfalls genau definiert. Der Compiler warnt jedoch, da die Art und Weise, wie sie definiert ist, möglicherweise nicht Ihren Vorstellungen entspricht.

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

Verwendung:

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

Nervenzusammenbruch:

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

Gute Arbeit, um das Eis zu brechen. Ich sage, Sie haben ein Bug-Char-Verhältnis von 0,0402.
Peter Olson

@Peter Enthält das Kommentare und Leerzeichen / CRLFs?
Mateen Ulhaq

@ muntoo Nein. Es ist 9/224.
Peter Olson

Aber sollte es nicht auch den unsortierten Text ausgeben?
Lowjacker

5

JavaScript: 403 Zeichen, 8 Bugs, Ratio = 0,0199

Obwohl nicht so schlimm wie C, hat JavaScript Designfehler, die zu Fehlern führen können, zumindest wenn sie von einem Anfänger verwendet werden ( Demo mit allen nicht behobenen Fehlern ).

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 ist Zeichenkettenverkettung, nicht Addition: undefinedundefinedundefined...
  2. !Iist nicht die richtige Methode, um den Rückgabewert von zu überprüfen .indexOf(), der -1 für eine Nichtübereinstimmung zurückgibt:boysVrewardedVV...
  3. Fehlende elseKeywords:boys Vrewarded.V Vget...
  4. Stoppt nicht am Ende der Eingabe: ...cannotundefinedundefined...
  5. Wird die Nullpunktverschiebung nicht korrekt verarbeiten (z. B. nur versuchen, das Programm zum Sortieren von Wörtern zu verwenden)
  6. Wird es eine negative Verschiebung bewältigen? Nicht richtig
  7. Ein Doppelklick auf die Taste bewirkt , dass ein zweites Timeout zu starten, zu einer unkorrekten Ausgabe führt ( Demo mit den meisten der vorherigen Fehler behoben ):
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Ausgabetextfelder müssen leer sein, wenn auf die Schaltfläche geklickt wird

Beachten Sie auch, dass dies in älteren IE-Versionen nicht funktioniert, da eine Erweiterung von ECMAScript 3 verwendet wird, die nur in ES5 standardisiert wurde.


2
Guter Ruf, nicht den Mangel an IE-Unterstützung in Ihre Liste der Fehler aufzunehmen. Ich wäre sehr versucht gewesen, ihn hinzuzufügen, und ich hätte ihn fast vorgeschlagen, weil er ein sehr häufiger "Fehler" in der Webentwicklung ist, bis ich darüber nachdachte, ob oder nicht Fehlende Unterstützung für Netscape 4 (oder einen beliebigen Browser) wäre wirklich ein Fehler.
Peter Olson

Nun, die mangelnde Unterstützung eines veralteten Browsers schadet sicherlich niemandem, aber die mangelnde Unterstützung eines aktuellen Browsers würde es tun . Es sei denn, Sie sind ein angesagtes und absolut radikales Web 2.0-Unternehmen, das sich auf dem neuesten Stand der Technik befindet, bis es ausblutet. Ich würde sagen, es ist ein Fehler. (Lesen Sie die Antwort noch einmal durch. Wenn ältere Versionen nicht mehr unterstützt werden, ist dies wahrscheinlich kein Problem. XP wird nicht mehr vom Mainstream unterstützt, und alle unterstützten Windows-Versionen verfügen über eine anständige IE-Version, die auch über automatische Updates ausgeführt werden kann.)
Joey

1

Python3 184 Zeichen, 4 Bugs. Fehlerrate 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())))

entgolfet:

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

Beispiel Eingabe: gtdx wjbfwiji. ljy Gfi hfssty
Beispieleingabe: -5
Beispielausgabe: Gcanxrb mmnsfdsqdv`qcdc.

Bekannte Fehler:

  1. Konvertiert keine Großbuchstaben
  2. Schließt `ein und konvertiert zu / von ihm.
  3. Konvertiert keine Nicht-ASCII-Zeichen (åäö)
  4. Druckt keine Leerzeichen.
  5. Kann mit Interpunktion umgehen, aber ignoriert sie - ich zähle das nicht, aber wenn ich das tue, geht mein Verhältnis auf 0,027)

Ich bin nicht sehr gut darin, absichtlich Fehler zu finden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.