Napisz kod błędu [zamknięty]

17

Nadszedł czas, aby pochwalić się umiejętnościami pisania złego kodu. Próbuję nowego rodzaju łamigłówki programistycznej, najbardziej podobnej, jak sądzę, do podstępnego konkursu C. Główną różnicą jest to, że nie jest to tak nikczemne: to tylko dobra czysta zabawa. Celem układanki jest spakowanie jak największej liczby błędów do programu. Zwycięzcą tego konkursu jest ten, który pisze program z największą liczbą błędów na postać.

Aby uniknąć ogromnego wątku komentarzy z prośbą o wyjaśnienia, powinienem teraz zdefiniować, co uważam za kwalifikujące się błędy.

Po pierwsze, błąd nie jest błędem . Jeśli jest to problem, który może zostać wykryty przez interpretera jako błąd (np. Niedopasowane ograniczniki, źle sformułowana składnia, dostęp do właściwości obiektu zerowego itp.) Lub jeśli uniemożliwia on wykonanie lub kontynuację programu, nie jest błąd. W przeciwnym razie możesz wpisać cztery znaki, a tłumacz może wymienić osiem błędów składniowych i możesz zgłosić stosunek liczby błędów do 2.

Po drugie, błąd nie może być oczywiście zły, a błąd nie jest pisanką . Jest to z pewnością subiektywne kryterium, ale uważam, że jest to niezbędne w tego rodzaju konkursach. Oznacza to, że nie możesz mieć kodu warunkowego, który wyraźnie zmienia kod w oczywisty sposób. (Przeczytaj: użyj języka Turing Pit, ponieważ nikt nie pozna różnicy).

Po trzecie, błąd musi być wiarygodny . Jest to subiektywne, jak powyższy, ale błąd musi wyglądać tak, jakby mógł zostać napisany przez osobę mniej niż drobiazgową lub być może ignorancką lub przez kogoś, kto właśnie popełnił błąd. Obejmuje to na przykład błędy i składnie off-by-one, które są poprawne i wyglądają poprawnie, ale powodują niepożądane zachowanie (np. Użycie nawiasów kwadratowych zamiast nawiasów).

Błąd może powodować wszelkiego rodzaju niepożądane zachowanie programu, w tym między innymi niepożądane wyjście w niektórych wyjątkowych przypadkach, ma różne zachowanie oparte na czymś, co wydaje się niezwiązane (np. Wyjście wyświetla się inaczej w zależności od tego, czy kończy się bieżący czas z nieparzystą lub parzystą liczbą sekund), wycieki pamięci, utrata danych i tak dalej.

Przykładowy problem:

Stwórz program, który wyświetla wszystkie znaki ASCII w porządku rosnącym według ich wartości liczbowej.

Przykładowa odpowiedź:

Brainf ***, 5 znaków, 1 błąd, współczynnik błędu-0,2

+[+.]

Błąd: nie wyświetla znaku ASCII dla 1. Można go naprawić, zmieniając na .+[.+].

Ok, myślę, że powinieneś już to zdobyć, oto Twoja łamigłówka:

Dekoduj szyfr Cezara i sortuj słowa alfabetycznie

Szyfr Cezara powstaje poprzez pobranie serii liter i przesunięcie ich n liter w alfabecie. Jeśli ciągnie się aż do początku lub końca alfabetu, A następuje po Z, a Z występuje przed A. Na przykład:

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

Otrzymasz dwa dane wejściowe (możesz uzyskać dane wejściowe, ale jest to dla ciebie najwygodniejsze, z rozsądku). Pierwsze wejście to słowa, a drugie wejście to wartość, o którą się przesuwa. Twoim zadaniem jest wyprowadzenie zdekodowanych słów, a następnie wyodrębnienie zdekodowanych słów po ich posortowaniu alfabetycznym.

Przykład (bez obrazy dla złych chłopców, to tylko przykład):

Pierwsze wejście: gtdx wjbfwiji. ljy Gfi hfssty

Drugie wejście: 5

Pierwszy wynik: chłopcy nagrodzeni. dostać Bad nie może

Drugi wynik: Bad Boys nie mogą zostać nagrodzeni.

Powodzenia!

Peter Olson
źródło
Drugie wejście twojego przykładu nie jest -5?
TY
@ S. Mark: Dane wejściowe to 5, ponieważ zadaniem jest odkodowanie szyfru.
Nabb,
O, rozumiem. @Nabb, Thanks!
TY
Czy musimy obsługiwać zarówno wielkie, jak i małe litery?
Joey Adams
1
@Peter: Otworzyłem nową dyskusję na temat meta dotyczącą tego pytania (między innymi). Być może chciałbyś skomentować.
dmckee

Odpowiedzi:

14

Rubin, 136 znaków, 7 błędów, współczynnik = 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+/]: liczby ujemne mają usunięty znak (pozorna próba walidacji danych wejściowych)

  2. '\s': znaki ucieczki luzu są interpretowane tylko w ciągach cudzysłowów, więc nie wygeneruje to spacji, ale dosłownie \s

  3. split(/ /): w przeciwieństwie do zwykłego split, to nie będzie się dzielić na nowe wiersze (więc ostatnie słowo zachowa nowy wiersz)

  4. /[^.,:;?!]/: ten regex wyklucza znaki interpunkcyjne, ale nie wielkie litery, cyfry lub podkreślenia, a co najważniejsze, nowe znaki

  5. 97: cokolwiek innego niż interpunkcja lub małe litery zostaną zniekształcone

  6. sort_by{|a|a[0]}: najwyraźniej programista nie wiedział o tym sorti zamiast tego zastosował tę niedorzeczną metodę, która nie sortuje słów zaczynających się od tej samej litery

  7. print: w przeciwieństwie do puts, nie drukuje nowego wiersza między każdym argumentem (więc ciągi znaków są sklejone)

Lowjacker
źródło
9

Nie przyjmuję mojej własnej odpowiedzi, ale pomyślałem, że pokażę ci ostateczny deszyfrator sortujący buggy. Wspaniałą rzeczą jest to, że nawet nie planowałem większości błędów.

Brainf ***: 483 znaków, 11 błędów

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

Wejście:

5 gtdx wjbfwiji. ljy Gfi hfssty 

Wynik:

bo_sre]arded)getBadcannot
adbo_scannotgetre]arded)

Lista błędów :

Błędy wejścia / wyświetlania:

  1. Liczby niepodatne lub liczby, które są więcej niż jedną cyfrą, niszczą program.

  2. Deszyfrator nie powoduje, że Z występuje przed A. Po prostu odejmuje wartość znaku ASCII.

  3. Spacje pojawiają się jako znak ASCII ESC (27).

  4. Jeśli wprowadzanie danych nie jest zakończone kartą, program nie kontynuuje działania po otrzymaniu instrukcji wprowadzania.

  5. Program musi zostać ręcznie zakończony. Będzie stale wyświetlać znak ESC, aż do zatrzymania.

  6. Program się zepsuje, jeśli plik wejściowy nie jest zakodowany w ASCII.

  7. Program nie wyświetla pierwszego znaku posortowanego wyjścia.

Sortowanie błędów:

Bardzo naiwnie zastosowałem sortowanie.

  1. Program pęka, gdy liczba słów nie jest równa 5.

  2. Program ulega awarii, jeśli liczba bajtów danych wejściowych przekracza 60.

  3. Program może poprawnie sortować tylko wtedy, gdy kolejność alfabetyczna jest identyczna z przykładowym wejściem.

  4. Program dodaje dodatkowe spacje, jeśli którekolwiek ze słów są mniejsze niż przykładowe wejście, i zastępuje znaki, jeśli którekolwiek ze słów są dłuższe.

Mam współczynnik błędu-char wynoszący 0,0228 . Wprawdzie Joey mnie pokonał , ale jestem dumny z tego, że użyłem tylko 8 różnych postaci w moim programie, a moje błędy są znacznie bardziej krytyczne.

Peter Olson
źródło
2
re]arded? Brzmi poważnie.
Joe Z.
7

C - 224 znaki, 2 błędy, 7 przypadków nieokreślonego zachowania

Edycja: Moja ocena tutaj jest nieprawidłowa. Przepełnione liczbę całkowitą bez znaku jest, w rzeczywistości, dobrze zdefiniowane w C . Co więcej, porównanie podpisanego i niepodpisanego jest również dobrze zdefiniowane, ale kompilator ostrzega, ponieważ sposób, w jaki jest zdefiniowany, może nie być taki, jak myślisz.

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

Stosowanie:

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

Awaria:

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
źródło
Dobra robota do przełamywania lodów. Powiem, że masz 0,0402 błędu na błąd.
Peter Olson,
@Peter Czy obejmuje to komentarze i białe znaki / CRLF?
Mateen Ulhaq,
@muntoo Nie. Jest 9/224.
Peter Olson,
Ale czy nie powinno to również generować nieposortowanego tekstu?
Lowjacker
5

JavaScript: 403 znaków, 8 błędów, współczynnik = 0,0199

Chociaż nie jest tak zły jak C, JavaScript ma wady projektowe, które mogą prowadzić do błędów, przynajmniej gdy są używane przez początkującego ( demo z usuniętymi wszystkimi błędami ).

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 jest łączeniem łańcuchów, a nie dodawaniem: undefinedundefinedundefined...
  2. !Inie jest poprawnym sposobem sprawdzenia zwracanej wartości .indexOf(), która zwraca -1 dla niezgodności:boysVrewardedVV...
  3. Brakujące elsesłowa kluczowe:boys Vrewarded.V Vget...
  4. Nie zatrzymuje się na końcu wprowadzania: ...cannotundefinedundefined...
  5. Nie obsługuje poprawnie przesunięcia zera (np. Po prostu próbuje użyć programu do sortowania słów)
  6. Czy poradzi sobie z przesunięciem ujemnym? Niepoprawnie
  7. Dwukrotne kliknięcie przycisku powoduje drugi czas oczekiwania na początek, co prowadzi do niewłaściwego wyjścia ( demo z większością poprzednich błędów stałych )
    boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot.
  8. Wyjściowe pola tekstowe muszą być puste po kliknięciu przycisku

Zauważ też, że to nie zadziała w starszych wersjach IE, ponieważ używa rozszerzenia do ECMAScript 3, który został ustandaryzowany tylko w ES5.

Proszę wstać
źródło
2
Dobre wezwanie do niewłączania braku obsługi IE do twojej listy błędów, byłbym skłonny do dodania go i prawie zasugerowałem, ponieważ jest to bardzo częsty „błąd” w rozwoju sieci, dopóki nie pomyślałem o tym, czy nie brak wsparcia dla Netscape 4 (lub dowolnej dowolnej przeglądarki) byłby naprawdę błędem.
Peter Olson
Cóż, brak wsparcia dla przestarzałej przeglądarki z pewnością nikogo nie krzywdzi, ale brak wsparcia dla obecnej . Chyba że jesteś modną i całkowicie radosną firmą Web 2.0 tworzącą rzeczy z najnowocześniejszej technologii, dopóki nie wykrwawi się, powiedziałbym, że to błąd. (Ponownie przeczytaj odpowiedź; brak wsparcia dla starszych wersji prawdopodobnie nie jest błędem, wtedy. XP jest daleko poza głównym wsparciem, a wszystkie obsługiwane wersje systemu Windows mają przyzwoitą wersję IE do uruchomienia, która nawet pochodzi z automatycznych aktualizacji).
Joey,
1

Python3 184 znaki, 4 błędy. Współczynnik błędów 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()
        )))

Przykładowe dane wejściowe: gtdx wjbfwiji. ljy Gfi hfssty
Przykład danych wejściowych: -5
Przykład danych wyjściowych: Gcanxrb mmnsfdsqdv`qcdc.

Znane błędy:

  1. Nie konwertuje wielkich liter
  2. Obejmuje `i konwertuje do / z niego.
  3. Nie konwertuje znaków innych niż ascii (åäö)
  4. Nie drukuje spacji.
  5. Potrafię sobie poradzić, ale ignoruje interpunkcję - nie liczę tego, ale jeśli to zrobię, mój stosunek wyniesie 0,027)

Nie jestem zbyt dobry w celowym wymyślaniu błędów.

Robert S.
źródło