99 Fehler im Code
Die Adaption von "99 Flaschen Bier an der Wand" für die Informatik, bei der die Bugs zunehmen, anstatt die Flaschen abzunehmen, wird häufig im Internet erneut veröffentlicht. Beispiel T-Shirt hier .
Ich denke, es wird interessant sein, mögliche Rekursionen und die Generierung von Zufallszahlen in einer Vielzahl von Sprachen zu sehen und die effizientesten Wege zu finden, dies zu tun.
Es gibt ein paar andere Herausforderungen, die mit 99 Flaschen Bier zu tun haben, aber keine scheint eine zunehmende und abnehmende Anzahl zu haben!
Herausforderung
Ihr Programm oder Ihre Funktion sollte keine Eingaben machen und dann drucken
99 Fehler im Code
99 Fehler im Code
Nehmen Sie einen runter und flicken Sie ihn herum
X Fehler im Code
(Leerzeile)
Dabei ist X die vorherige Ganzzahl minus 1 plus eine zufällige Ganzzahl im Bereich [-15,5].
Sie können das Minus 1 in die zufällige Ganzzahl einfügen und so den Bereich [-16,4] zulassen.
Bereiche können exklusiv sein, also minus eins plus (-16,6) oder (-17,5).
Die Zufallszahlen müssen nicht gleichmäßig verteilt sein, sondern müssen alle möglich sein.
Das Programm startet immer mit 99 Bugs.
Sie können den grammatikalischen Fehler von "1 Bugs" ignorieren.
Das Programm sollte angehalten werden, wenn die Anzahl der Fehler 0 oder negativ ist, und gedruckt werden
0 Fehler im Code
Es sollte niemals eine negative Anzahl von Fehlern geben. Das Ende sollte so aussehen
Y Fehler im Code
Y Fehler im Code
Nehmen Sie einen runter und flicken Sie ihn herum
0 Fehler im Code
(Leerzeile)
0 Fehler im Code
Eine abschließende neue Zeile ist akzeptabel.
- Ihr Code kann ein vollständiges Programm oder eine Funktion sein.
- Es erfolgt keine Eingabe.
- Die Ausgabe sollte stdout oder return sein.
- Warnungen / Fehler in Protokollen / STDERR sind in Ordnung, solange STDOUT den erforderlichen Text enthält. Sehen Sie hier für weitere Informationen.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
Beispielausgabe
Beispielausgabe für das Einfügen von Behältern, jedes Mal mit -11 Fehlern
Antworten:
R ,
182140138135 BytesProbieren Sie es online!
Während R bei der Erzeugung von Zufallszahlen einigermaßen gut ist, ist es bei Strings und Drucken furchtbar.JayCe hat ungefähr eine Milliarde Bytes gefunden und findet immer wieder neue Wege, um Golf zu spielen!quelle
+5
kostet Sie noch 2 Bytes? warum nicht einfachsample(26,6))
?sample
Java 8,
161160 Bytes-1 Byte danke an @JonathanAllan .
Probieren Sie es online aus.
Erläuterung:
quelle
r
für nichts verwenden?,r
scheint immer noch zu funktionieren: Probieren Sie es online aus!PowerShell ,
137135133131 ByteProbieren Sie es online!
Der Abschnitt "Fehler im Code" wird
$b
zur späteren Verwendung gespeichert . Setzt$a
auf99
, tritt in einefor
Schleife ein$a
. Zuerst erstellen wir ein Array aus zwei Zeichenketten," "*2
, wobei die Zeichenkette die ist"X bugs in the code"
.Weiter ist nur die Zeichenfolge
"Take one down and patch it around"
. Dann inkrementieren wir,$a
indem wir eineRandom
ganze Zahl aus dem Bereich auswählen[-16,4]
. Danach klemmen wir$a
mit einem if auf Minimum Nullif($a-lt0){$a=0}
. Dann die Saite"Y bugs in the code"
.Nachdem die Schleife beendet ist, setzen wir den String
"0 bugs in the code"
in die Pipeline. Alle diese Zeichenfolgen werden aus der Pipeline gesammelt, und ein implizitesWrite-Output
gibt uns kostenlos Zeilenumbrüche zwischen ihnen.Zwei Bytes mit einer
for
Schleife anstelle einerwhile
Schleife gespeichert .Durch Verschieben
$b
in einen eigenen Bereich wurden zwei Bytes gespart .Dank Adrian Blackburn zwei Bytes gespart.
quelle
JavaScript (Node.js) , 127 Byte
Probieren Sie es online!
Erklärung:
Danke an @tsh für die Idee der Rekursion und Implementierung (einige Bytes gespart)
Anregungen zum Golfspielen hierzu sind jederzeit willkommen.
quelle
0+
entfernt? Es scheint eine erforderliche Ausgabe zu sein.05AB1E , 59 Bytes
Probieren Sie es online!
quelle
Python 2 , 151 Bytes
Schöner Trick
j=i+max(-i,randint(-16,4))
von Jo King, der die erlaubte ungleichmäßige Verteilung ausnutztPaar Bytes dank Mnemonic gespeichert
Probieren Sie es online!
quelle
j=max(0,i+randint(-16,4))
.Kohle , 81 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Beginnen Sie mit 99 Fehlern im Code.
Speichern Sie die komprimierte Zeichenfolge "% d Bugs im Code \ n".
Wiederholen, solange noch eine positive Anzahl von Fehlern vorhanden ist.
Gib die Anzahl der Fehler im Code zweimal aus.
Drucken Sie "Nehmen Sie ein und flicken Sie es herum".
Fügen Sie eine zufällige Anzahl von Fehlern zwischen -17 (exklusiv) und 4 (inklusive) hinzu.
Gib die Anzahl der verbleibenden Bugs aus oder 0, falls negativ.
Lassen Sie eine Leerzeile zwischen den Versen.
Geben Sie nach dem letzten Vers erneut 0 Fehler im Code aus.
quelle
JavaScript,
189176168162 BytesProbieren Sie es online!
Vielen Dank an Muhammad Salman für den fehlenden
console.log
Ersatz und an Oliver für die Verbesserung des x-TestsVielen Dank für l4m2 für das Golfen um 8 Bytes
quelle
x<=0?console.log("\n"+0+a):f(x)
am Ende benötigen .f
Erklärung. Abgestimmt, bis aktualisiert, um das zu beheben. (Auch mein Link braucht ein Update auch)f
, was Sie nicht annehmen können.Python 3 ,
156138 BytesDank Jonathans Python 2 Antwort für den
id
TrickProbieren Sie es online!
Erläuterung:
quelle
Oktave ,
149148 Bytes1 Byte durch Ändern von
randi(21)
und%i
nach21*rand
und gespeichert%.f
.%.f
Stellt sicher, dass die Ausgabe ein Gleitkomma mit null Dezimalstellen (dh und Ganzzahl) ist.Es wurden ein paar Zeilenumbrüche anstelle von Kommas und Semikolons eingefügt, um die Lesbarkeit zu verbessern. Es fühlt sich falsch an, aber es ist nicht länger als der Einzeiler.
Probieren Sie es online!
Erläuterung:
Mit
p((x+=21*rand-17)*(x>0)
anstelle von wirdmax
ein Byte gespeichert, aber die letzte Zeile wird-0 bugs ...
anstelle von ausgegeben0 bugs
. Es funktioniert mitrandi(21)-17
, aber dann ist es die gleiche Länge wie oben. Probieren Sie es online!quelle
COBOL (GnuCOBOL),
317294279270 BytesProbieren Sie es online!
Ungolfed
Hinweis: Der letzte Satz wird noch gedruckt, da COBOL das gesamte Programm ausführt und nach der
perform until
Schleife das Label a " durchfällt" und seine Anweisungen ausführt. Dieses Verhalten ähnelt einemswitch case
ohnebreak
.PS: Die Zahlen werden nicht genau nach Bedarf angezeigt, aber COBOL ist nicht so gut darin, Zahlen automatisch in eine hübsche Textdarstellung umzuwandeln.
quelle
-=
ini-=Math.random()*21-4
), der den gesamten rechten Operanden in Klammern einschließt. Ich habe vergessen, sie explizit zu machen, aber es ist jetzt behoben, denke ich.VBA:
212163 BytesDiese Lösung basiert auf der von Chronocidal, die gestern veröffentlicht wurde. Dies ist mein erster Beitrag und ich habe nicht genug Reputation, um seinen Beitrag zu kommentieren.
Diese Revision enthält zwei Verbesserungen.
While/Wend
stattFor/Next
spart ein paar Zeichen.GoSub
und die dazu erforderlichen ZeilenExit Sub
undReturn
.Edit:
. 3. Entfernt Leerzeichen und Zeichen , dass der VBA - Editor wird automatisch wieder hinzufügen Sehen Tipps für den Golfsport in VBA
4.em Hinzugefügt Vorschläge von @EricF, sahen dann seine Paste ist Algorithmus war noch kleiner , damit ich meinen Algorithmus mit seinem ersetzt und entfernt Leerzeichen. Eine Schlüsseländerung wurde
vbLF
an die Ausgabezeichenfolge angehängt, sodassDebug.Print
sie nicht so oft aufgerufen werden musste. Ein großes Lob an EricF .Das war eine lustige Herausforderung. Wenn Sie einen Online-Dolmetscher wie TIO für VB6 / VBScript / VBA kennen, hinterlassen Sie bitte einen Kommentar.
Wenn Sie diesen Code testen möchten und Microsoft Excel, Word, Access oder Outlook installiert haben (nur Windows), drücken Sie Alt + F11, um die VBA-IDE zu öffnen. Fügen Sie ein neues Codemodul ein (Alt + I, M) und löschen Sie es
Option Explicit
. Fügen Sie dann den Code ein und drücken Sie F5, um ihn auszuführen. Die Ergebnisse sollten im Direktfenster angezeigt werden (drücken Sie Strg + G, wenn Sie es nicht sehen).quelle
c
stattc>0
als While Bedingung, und verwenden Siec=Iif(c<0,0,c)
stattIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 BytesObwohl ich im Vergleich zu den anderen Programmen in Bezug auf Bytes nicht wirklich konkurrenzfähig war, wollte ich nur sehen, wie dies in LaTeX gemacht wird.
Besser lesbar:
Verbesserungen (pro Bearbeitung):
\if
Klausel für\repeat
as a wurde umgeschrieben\else
\value{b}=x
zur Initialisierung, aber nicht in der Schleife (statt\setcounter{b}{x}
)\relax
sollte für Punkt 3 verwendet werden, aber das kann auch durch Einfügen eines Leerzeichens erreicht werden. Die\else
verwendeten TeX-Befehle anstelle von LaTeX wurden entfernt, da diese kürzer sind und durch ersetzt\'
werden~
.quelle
\ifnum\value{b}<1
eher sein als<0
?C,
169165 BytesVielen Dank an @ceilingcat für das Speichern von vier Bytes!
Probieren Sie es online!
quelle
SAS, 210 Byte
Ungolfed:
Kann einige Bytes sparen, wenn Warnungen im Protokoll zulässig sind (setzen Sie das
&a
in die&b
Makrovariable, aber dies erzeugt eine erste Warnung).quelle
PHP, 126 Bytes
Führen Sie in der Befehlszeile Folgendes aus
php -r 'code here'
:quelle
ABAP , 295 Bytes
... denn warum zum Teufel nicht!
Es ist sicherlich nicht konkurrenzfähig im Vergleich zu anderen Sprachen, aber ich habe es sogar geschafft, es von 330 Bytes, die ich ursprünglich geschrieben habe, zu verkleinern, also zähle ich es als persönlichen Gewinn.
Da ABAP keine Zeilen mit mehr als 255 Zeichen zulässt, musste ich ein Leerzeichen durch einen Zeilenumbruch ersetzen. Unter Windows wurde die Größe aufgrund von CRLF zunächst auf 296 Byte erhöht, aber es funktioniert einwandfrei, wenn nur die LF vorhanden ist. ABAP benötigt allerdings viele Leerzeichen, so dass dies keine große Sache ist.
WRITE schreibt einfach Text in die GUI, also denke ich, das ist irgendwie wie stdout? Ich könnte hier wahrscheinlich einige Bytes einsparen, indem ich eine Struktur oder Tabelle verwende, aber aufgrund der Art und Weise, wie SAP gemischte Strukturen (die Zeichen und Zahlen enthalten) handhabt, funktioniert der Ansatz, den ich mir vorgestellt habe, nur auf Nicht-Unicode-Systemen ... gehen Sie, obwohl Sie Zugriff auf beide haben.
Der Funktionsbaustein für Zufallszahlen ist der einzige, den ich in unserem System finden kann. Es könnte einen mit einem kürzeren Namen oder kürzeren Parametern geben. Keine Ahnung!
Mehr oder weniger lesbarer Code, einschließlich Kommentaren:
Danke für die Herausforderung!
An meinen Chef: Bitte feuere mich nicht, ich bilde mich nur selbst aus!
quelle
Sauber ,
245234 BytesProbieren Sie es online!
quelle
C #,
184181 BytesMeine erste Code Golf Antwort!
(Basierend auf der Java-Antwort von Kevin Cruijssen)
Probieren Sie es online!
quelle
C (GCC) ,
141137 BytesIch habe Präprozessor-Makros aus Gründen der Gerechtigkeit verwendet (Warnung: TV Tropes)
Probieren Sie es online!
quelle
T-SQL, 188 Bytes
SQL erlaubt Rückgaben innerhalb von String-Literalen, das hilft.
CONCAT()
führt eine implizite Konvertierung in Text durch, damit ich mich nicht umCAST
oder kümmern mussCONVERT
.quelle
JavaScript, 138 Bytes
Code-Snippet anzeigen
quelle
QB64 , 134 Bytes
Von meinem Bruder.
quelle
Pyth ,
9492 BytesProbieren Sie es online aus
Vorherige Version: 94 Bytes
quelle
Jelly , 61 Bytes
Ein Niladic-Link, der auch als vollständiges Programm funktioniert.
Probieren Sie es online! (Die Ausgabe wird nach Abschluss der Ausführung gelöscht, aber Absatz für Absatz gedruckt.)
Wie?
quelle
Perl, 132 Bytes
quelle
VBA:
225233 Bytes{EDIT} Die fehlenden hinzugefügt
rnd()*
Hinweise:
Wird
GoSub
zum Drucken der dreifachen Zeile verwendet, da sie etwas kürzer ist, als die Zeile einer VariablenDebug.Print
zuzuweisen und zuzuweisen.Debug.Print
Ohne Argumente wird eine leere Zeile ausgegeben (Null oder leere Zeichenfolge sind nicht erforderlich). EineWorksheetFunction.Max
Zeile wäre zu lang, daher habe ich ein "wenn kleiner als" verwendet, um Negative zu vermeiden.Mit Einrückung und Kommentaren
quelle
rnd() *
dort einzubeziehen - ich glaube, ich war damit beschäftigt, zu zählen , ob es weniger Zeichen gabDim c%
(dh "c ist eine Ganzzahl") und dieInt()
Python 2 ,
138 134 133 131127 Bytes-1 Dank an Jo King (neu anordnen, um die Logik zu verwenden,
bugs-=min(bugs,randomNumber)
anstattbugs=max(0,bugs-randomNumber)
). Dies ermöglichte das erzwungene Beenden mit einer Division durch Null, wodurch weitere 6 Bytes gespart wurden !Probieren Sie es online!
quelle
Ruby: 149 Bytes
Sollte in so ziemlich jeder Version von Ruby> = 1.8 funktionieren
Ich denke, es könnte möglich sein, die Zeichenfolgen ein wenig weiter zu optimieren, aber im Allgemeinen bin ich ziemlich zufrieden damit - insbesondere mit der Anweisung für die Zuweisung / den Vergleich / die Unterbrechung und dem Missbrauch optionaler Klammern.
Hinweis: Die Ausgabe enthält technisch gesehen zwei nachgestellte Zeilenumbrüche. Wenn dies berücksichtigt werden muss, wird es um 4 Zeichen erhöht.
quelle
\n
(Nein\r
) zählen.Zsh , 133 Bytes
Probieren Sie es online!
Dies nutzt einige zsh-Funktionen aus.
while list; do list; done
kann geschrieben werden alswhile list {list}
printf
numerisch ist, wird das entsprechende Argument als arithmetischer Ausdruck ausgewertet. Damit:n
kostenlos ohne Verwendung von a$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
wird nochmal ausgewertet ohne verwenden zu$((...))
müssen$[...]
oder ähnliches. Die>
und?
mussten entkommen.printf $b
Ende wird ein leeres Argument als 0 für ausgewertet%d
.$b
nirgendwo zitieren muss .$b$b"Take..."
statt schreiben"$b${b}Take..."
.\n
, indem aktuelle Zeilenumbrüche anstelle von undfor((n=99;n;))
anstelle von verwendet wurdenn=99;while ((n))
.quelle