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!
źródło
Odpowiedzi:
Rubin, 136 znaków, 7 błędów, współczynnik = 0,051
[/\d+/]
: liczby ujemne mają usunięty znak (pozorna próba walidacji danych wejściowych)'\s'
: znaki ucieczki luzu są interpretowane tylko w ciągach cudzysłowów, więc nie wygeneruje to spacji, ale dosłownie\s
split(/ /)
: w przeciwieństwie do zwykłegosplit
, to nie będzie się dzielić na nowe wiersze (więc ostatnie słowo zachowa nowy wiersz)/[^.,:;?!]/
: ten regex wyklucza znaki interpunkcyjne, ale nie wielkie litery, cyfry lub podkreślenia, a co najważniejsze, nowe znaki97
: cokolwiek innego niż interpunkcja lub małe litery zostaną zniekształconesort_by{|a|a[0]}
: najwyraźniej programista nie wiedział o tymsort
i zamiast tego zastosował tę niedorzeczną metodę, która nie sortuje słów zaczynających się od tej samej literyprint
: w przeciwieństwie doputs
, nie drukuje nowego wiersza między każdym argumentem (więc ciągi znaków są sklejone)źródło
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:
Wynik:
Lista błędów :
Błędy wejścia / wyświetlania:
Liczby niepodatne lub liczby, które są więcej niż jedną cyfrą, niszczą program.
Deszyfrator nie powoduje, że Z występuje przed A. Po prostu odejmuje wartość znaku ASCII.
Spacje pojawiają się jako znak ASCII ESC (27).
Jeśli wprowadzanie danych nie jest zakończone kartą, program nie kontynuuje działania po otrzymaniu instrukcji wprowadzania.
Program musi zostać ręcznie zakończony. Będzie stale wyświetlać znak ESC, aż do zatrzymania.
Program się zepsuje, jeśli plik wejściowy nie jest zakodowany w ASCII.
Program nie wyświetla pierwszego znaku posortowanego wyjścia.
Sortowanie błędów:
Bardzo naiwnie zastosowałem sortowanie.
Program pęka, gdy liczba słów nie jest równa 5.
Program ulega awarii, jeśli liczba bajtów danych wejściowych przekracza 60.
Program może poprawnie sortować tylko wtedy, gdy kolejność alfabetyczna jest identyczna z przykładowym wejściem.
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.
źródło
re]arded
? Brzmi poważnie.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.
Stosowanie:
Awaria:
źródło
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 ).
I + H
jest łączeniem łańcuchów, a nie dodawaniem:undefinedundefinedundefined...
!I
nie jest poprawnym sposobem sprawdzenia zwracanej wartości.indexOf()
, która zwraca -1 dla niezgodności:boysVrewardedVV...
else
słowa kluczowe:boys Vrewarded.V Vget...
...cannotundefinedundefined...
boys rebwoayrsd erde.w agredte dB.a dg ecta nBnaodt cannot
.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.
źródło
Python3 184 znaki, 4 błędy. Współczynnik błędów 0,0217
degolfed:
Przykładowe dane wejściowe: gtdx wjbfwiji. ljy Gfi hfssty
Przykład danych wejściowych: -5
Przykład danych wyjściowych: G
canxrb
mmnsfdsqdv`qcdc.Znane błędy:
Nie jestem zbyt dobry w celowym wymyślaniu błędów.
źródło