99 błędów w kodzie
Adaptacja „99 butelek piwa na ścianie” dla informatyki, w której błędy rosną zamiast spadać, jest często publikowana w Internecie. Przykładowa koszulka tutaj .
Myślę, że będzie interesujące zobaczyć potencjalną rekurencję i generowanie liczb losowych w wielu różnych językach i znaleźć najbardziej efektywne sposoby na zrobienie tego.
Istnieje 99 innych wyzwań związanych z 99 butelkami piwa, ale żadna z nich nie wydaje się mieć coraz większej liczby!
Wyzwanie
Twój program lub funkcja nie powinny pobierać żadnych danych wejściowych, a następnie drukować
99 błędów w kodzie
99 błędów w kodzie
Zdejmij jedną i załataj ją
X błędów w kodzie
(pusta linia)
Gdzie X to poprzednia liczba całkowita minus 1 plus losowa liczba całkowita z zakresu [-15,5].
Możesz scalić minus 1 z losową liczbą całkowitą, umożliwiając w ten sposób zakres [-16,4].
Zakresy mogą być wyłączne, więc minus jeden plus (-16,6) lub (-17,5).
Losowe liczby całkowite nie muszą być równomiernie rozmieszczone, muszą być wszystkie możliwe.
Program zawsze zaczyna się od 99 błędów.
Możesz zignorować błąd gramatyczny „1 błędów”.
Program powinien zatrzymać się, gdy liczba błędów wynosi 0 lub jest ujemna, i wydrukować
0 błędów w kodzie
Nigdy nie powinno być ujemnej liczby błędów. Zakończenie powinno wyglądać
Błędy Y w kodzie
Błędy Y w kodzie
Zdejmij jedną i załataj ją
0 błędów w kodzie
(pusta linia)
0 błędów w kodzie
Końcowa nowa linia jest dopuszczalna.
- Twój kod może być pełnym programem lub funkcją.
- Brak danych wejściowych.
- Wyjście powinno być standardowe lub zwrócone.
- Ostrzeżenia / błędy w logach / STDERR są w porządku, o ile STDOUT ma wymagany tekst. Zobacz tutaj, aby uzyskać więcej informacji.
To jest code-golf, więc wygrywa najkrótszy kod w bajtach.
Przykładowy wynik
Przykładowy wynik wklejania pojemnika za każdym razem poprawiany dla błędów -11
Odpowiedzi:
R ,
182140138135 bajtówWypróbuj online!
chociaż jest dość dobry w generowaniu liczb losowych, R jest straszny w przypadku ciągów i drukowania.JayCe znalazł około miliarda bajtów i wciąż szuka nowych sposobów na golfa!źródło
+5
kosztuje jeszcze 2 bajty? dlaczego niesample(26,6))
?sample
Java 8,
161160 bajtów-1 bajt dzięki @JonathanAllan .
Wypróbuj online.
Wyjaśnienie:
źródło
r
do niczego?,r
Wydaje się, że usuwanie nadal działa: Wypróbuj online!PowerShell ,
137135133131 bajtówWypróbuj online!
Sekcja „błędy w kodzie” jest zapisywana do
$b
późniejszego wykorzystania. Ustawia$a
na99
, włączafor
pętlę$a
. Najpierw tworzymy tablicę dwóch ciągów znaków," "*2
, przy czym ciąg znaków to"X bugs in the code"
.Dalej jest tylko ciąg
"Take one down and patch it around"
. Następnie zwiększamy$a
, wybierającRandom
liczbę całkowitą z zakresu[-16,4]
. Następnie ograniczamy się$a
do minimum zero za pomocą ifif($a-lt0){$a=0}
. Następnie ciąg"Y bugs in the code"
.Na koniec, po zakończeniu pętli, umieszczamy ciąg
"0 bugs in the code"
na rurociągu. Wszystkie te ciągi znaków są zbierane z potoku, a domniemanyWrite-Output
daje nam nowe linie między nimi za darmo.Zapisano dwa bajty za pomocą
for
pętli zamiastwhile
pętli.Zaoszczędzono dwa bajty, przechodząc
$b
do własnej sekcji.Zaoszczędził dwa bajty dzięki Adrianowi Blackburnowi.
źródło
JavaScript (Node.js) , 127 bajtów
Wypróbuj online!
Objaśnienie:
Dzięki @tsh za pomysł rekursji i implementacji (zapisano niektóre bajty)
Wszelkie sugestie dotyczące gry w golfa są mile widziane.
źródło
0+
usunięty? Wydaje się, że jest to wymagane wyjście.05AB1E , 59 bajtów
Wypróbuj online!
źródło
Python 2 , 151 bajtów
Niezła sztuczka
j=i+max(-i,randint(-16,4))
Jo Kinga, wykorzystująca dozwoloną nierównomierną dystrybucjęZaoszczędzono kilka bajtów dzięki Mnemonic
Wypróbuj online!
źródło
j=max(0,i+randint(-16,4))
.Węgiel drzewny , 81 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Zacznij od 99 błędów w kodzie.
Zapisz skompresowany ciąg „% d błędów w kodzie \ n”.
Powtarzaj, dopóki pozostanie dodatnia liczba błędów.
Wydrukuj dwukrotnie liczbę błędów w kodzie.
Wydrukuj „Zdejmij i załataj”.
Dodaj losową liczbę błędów od -17 (wyłączne) do 4 (włącznie).
Wydrukuj liczbę pozostałych błędów lub 0, jeśli jest ujemna.
Pozostaw pustą linię między wierszami.
Po ostatnim wierszu wydrukuj ponownie 0 błędów w kodzie.
źródło
JavaScript,
189176168162 bajtówWypróbuj online!
Dziękujemy Muhammadowi Salmanowi za brakujący
console.log
zamiennik i Oliverowi za ulepszenie testu X.Dzięki za l4m2 za grę w golfa o 8 bajtów
źródło
x<=0?console.log("\n"+0+a):f(x)
na końcu.f
deklaracji. Zagłosowano aż do aktualizacji, aby to naprawić. (Również mój link wymaga aktualizacji)f
, czego nie możesz założyć.Python 3 ,
156138 bajtówDzięki odpowiedzi Jonathana na Python 2 za
id
podstępWypróbuj online!
Wyjaśnienie:
źródło
Oktawa ,
149148 bajtówZapisano jeden bajt, zmieniając
randi(21)
i%i
do21*rand
i%.f
.%.f
zapewnia, że wyjście jest zmiennoprzecinkowe z zerowymi liczbami dziesiętnymi (tj. i liczbami całkowitymi).Wstawiono kilka podziałów linii zamiast przecinków i średników, aby ułatwić czytelność. Czuje się źle, ale nie trwa dłużej niż jedna linijka.
Wypróbuj online!
Wyjaśnienie:
Korzystanie
p((x+=21*rand-17)*(x>0)
zamiastmax
zapisuje bajt, ale ostatni wiersz wyjścia-0 bugs ...
zamiast0 bugs
. Działa zrandi(21)-17
, ale wtedy ma taką samą długość jak powyższa. Wypróbuj online!źródło
COBOL (GnuCOBOL),
317294279270 bajtówWypróbuj online!
Bez golfa
Uwaga: ostatnie zdanie jest nadal drukowane, ponieważ COBOL wykonuje cały program, a po
perform until
pętli „przewraca” etykietę a , wykonując swoje instrukcje. To zachowanie jest podobne doswitch case
bezbreak
.PS: Liczby nie są wyświetlane dokładnie tak, jak jest to wymagane, ale COBOL nie jest tak dobry w automatycznej konwersji liczb do ładnej reprezentacji tekstowej.
źródło
-=
ini-=Math.random()*21-4
), co oznacza nawias wokół całego operandu po prawej stronie. Zapomniałem wyrazić je wyraźnie, ale myślę, że teraz jest to naprawione.VBA:
212163 bajtówTo rozwiązanie jest oparte na rozwiązaniu opublikowanym wczoraj przez Chronocidal. To mój pierwszy post i nie mam wystarczającej reputacji, aby skomentować jego post.
Ta wersja zawiera dwa ulepszenia.
While/Wend
zamiastFor/Next
zapisuje kilka znaków.GoSub
aExit Sub
iReturn
przewody potrzebne do jego obsługi.Edycja:
3. Usunięto białe znaki i znaki, które edytor VBA automatycznie doda z powrotem. Zobacz Wskazówki dotyczące gry w golfa w VBA
4. Dodałem sugestie @EricF, a następnie zobaczyłem, że jego algorytm bin wklejania był jeszcze mniejszy, więc zastąpiłem mój algorytm jego i usunąłem Biała przestrzeń. Kluczową zmianą było dołączanie
vbLF
do ciągu wyjściowego, więcDebug.Print
nie trzeba było go tak często wywoływać. Uznanie dla EricF .To było zabawne wyzwanie. Jeśli znasz tłumacza internetowego, takiego jak TIO dla VB6 / VBScript / VBA, zostaw komentarz.
Jeśli chcesz przetestować ten kod i mieć zainstalowany program Microsoft Excel, Word, Access lub Outlook (tylko Windows), naciśnij klawisze Alt + F11, aby otworzyć VBA IDE. Wstaw nowy moduł kodu (Alt + I, M) i wyczyść
Option Explicit
. Następnie wklej kod i naciśnij F5, aby go uruchomić. Wyniki powinny pojawić się w oknie natychmiastowym (naciśnij Ctrl + G, jeśli go nie widzisz).źródło
c
zamiastc>0
jako warunek While i użyjc=Iif(c<0,0,c)
zamiastIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 bajtówChociaż nie bardzo konkurencyjny w porównaniu do innych programów pod względem bajtów, chciałem tylko zobaczyć, jak to zrobić w LaTeX.
Bardziej czytelny:
Ulepszenia (na edycję):
\if
klauzulę\repeat
jako\else
\value{b}=x
działa przy inicjalizacji, ale nie w pętli (zamiast\setcounter{b}{x}
)\relax
należy użyć punktu 3, ale można to również osiągnąć wstawiając spację. Usunięto\else
używane polecenia TeX zamiast LaTeX, ponieważ są one krótsze i zastąpione\'
przez~
.źródło
\ifnum\value{b}<1
zamiast<0
?C,
169165 bajtówDzięki @ceilingcat za zapisanie czterech bajtów!
Wypróbuj online!
źródło
SAS, 210 bajtów
Nie golfowany:
Można zapisać kilka bajtów, jeśli ostrzeżenia w dzienniku są dozwolone (wstawić
&a
do&b
makrozmiennej, ale generuje to wstępne ostrzeżenie).źródło
PHP, 126 bajtów
Uruchom w wierszu polecenia, używając
php -r 'code here'
:źródło
ABAP , 295 bajtów
... bo dlaczego, u licha, nie!
Z pewnością nie jest konkurencyjny w porównaniu do innych języków, ale udało mi się nawet zmniejszyć go z 330 bajtów, które napisałem na początku, więc liczę to jako osobistą wygraną.
Ponieważ ABAP nie zezwala na wiersze dłuższe niż 255 znaków, musiałem zastąpić spację podziałem wiersza. W systemie Windows początkowo zwiększyło to rozmiar do 296 bajtów z powodu CRLF, ale działa dobrze tylko z LF. ABAP z pewnością wymaga wielu spacji, więc to nie jest wielka sprawa.
WRITE po prostu zrzuca tekst GUI, więc myślę, że to coś w stylu stdout? Prawdopodobnie mógłbym tutaj zaoszczędzić trochę bajtów, używając struktury lub tabeli, ale ze względu na to, jak SAP obsługuje struktury mieszane (zawierające znaki i liczby), moje wyobrażenie działało tylko w systemach innych niż Unicode ... Które osobiście uważam za nie- idź, pomimo dostępu do obu.
Moduł funkcyjny dla liczb losowych jest jedynym, który udało mi się znaleźć w naszym systemie, przypuszczam, że mógłby istnieć taki o krótszej nazwie lub parametrach. Brak pomysłu!
Mniej lub bardziej czytelny kod, w tym komentarze:
Dzięki za wyzwanie!
Do mojego szefa: Proszę, nie zwalniaj mnie, tylko się uczę!
źródło
Czysty ,
245234 bajtówWypróbuj online!
źródło
C #,
184181 bajtówMoja pierwsza odpowiedź na Code Golf!
(Na podstawie odpowiedzi Java @ Kevin Cruijssen)
Wypróbuj online!
źródło
C (gcc) ,
141137 bajtówUżyłem makr preprocesora dla wielkiej sprawiedliwości (ostrzeżenie: TV Tropes)
Wypróbuj online!
źródło
T-SQL, 188 bajtów
SQL pozwala na zwroty wewnątrz literałów łańcuchowych, więc to pomaga.
CONCAT()
dokonuje niejawnej konwersji na tekst, więc nie muszę się martwićCAST
aniCONVERT
.źródło
JavaScript, 138 bajtów
Pokaż fragment kodu
źródło
QB64 , 134 bajty
Od mojego brata.
źródło
Pyth ,
9492 bajtyWypróbuj online
Poprzednia wersja: 94 bajty
źródło
Galaretka , 61 bajtów
Łącze niladyczne, które działa również jako pełny program.
Wypróbuj online! (dane wyjściowe są opróżniane po zakończeniu wykonywania, ale drukuje akapit po akapicie)
W jaki sposób?
źródło
Perl, 132 bajty
źródło
VBA:
225233 bajtów{EDIT} Dodano brakujące
rnd()*
Uwagi:
Używa
GoSub
do wydrukowania trzykrotnej linii, ponieważ jest ona nieco krótsza niż przypisanie linii do zmiennej iDebug.Print
jej wstawienie.Debug.Print
bez żadnych argumentów wypisuje pustą linię (nie potrzeba Null ani pustego łańcucha)WorksheetFunction.Max
Linia byłaby za długa, więc użyłem „jeśli mniej niż”, aby zapobiec negatywom.Z wcięciami i komentarzami
źródło
rnd() *
tam - myślę, że byłem zajęty liczeniem, jeśli było mniej znakówDim c%
(tj. „C jest liczbą całkowitą”) i upuszczamInt()
Python 2 ,
138 134 133 131127 bajtów-1 Dzięki Jo King (przearanżuj, aby użyć logiki
bugs-=min(bugs,randomNumber)
zamiastbugs=max(0,bugs-randomNumber)
). Pozwoliło to na wymuszenie wyjścia za pomocą błędu dzielenia przez zero, co pozwoliło zaoszczędzić kolejne 6 bajtów!Wypróbuj online!
źródło
Rubin: 149 bajtów
Powinien działać w prawie każdej wersji Ruby> = 1.8
Wydaje mi się, że można nieco zoptymalizować ciągi, ale ogólnie jestem z tego bardzo zadowolony - w szczególności kombi przypisanie / porównanie / instrukcja break i nadużywanie nawiasów opcjonalnych.
Uwaga: wyjście ma technicznie dwa końcowe znaki nowej linii; jeśli trzeba to uwzględnić, zwiększa się o 4 znaki.
źródło
\n
(nie\r
).Zsh , 133 bajty
Wypróbuj online!
Wykorzystuje to kilka funkcji Zsh.
while list; do list; done
można zapisaćwhile list {list}
printf
jest liczbowy, odpowiedni argument jest oceniany jako wyrażenie arytmetyczne. Więc:n
za darmo bez użycia$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
jest obliczana ponownie, bez konieczności stosowania$((...))
,$[...]
lub podobne. The>
i?
musiał być uciekł.printf $b
końcu ocenia pusty argument jako 0 dla%d
.$b
nigdzie .$b$b"Take..."
zamiast"$b${b}Take..."
.\n
ifor((n=99;n;))
zamiastn=99;while ((n))
.źródło