99 Fehler im Code

47

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

Sam Dean
quelle
1
Verwandt: 1 2 (Unterschied: In dieser Herausforderung kann die Ausgabe beliebig lang sein).
user202729
16
Ein realistischeres Szenario wäre, wenn das Vorzeichen der Zufallszahl umgedreht würde!
Stewie Griffin
9
Ich bin enttäuscht, dass die Anforderungen nicht beinhalten, dass das Programm einen Fehler haben muss, sobald eine negative Zahl auftritt, wie z. B. Absturz, Überlauf auf max int oder ähnliches;).
allo
3
"Die Zufallszahlen müssen nicht gleichmäßig verteilt sein, sondern müssen alle möglich sein." erinnerte mich an xkcd.com/221
Ivo Beckers
2
Es ist eine Schande, 99 hat keine Zufallszahlengenerierung.
Jonathan Allan

Antworten:

18

R , 182 140 138 135 Bytes

n=99;while(n)cat(n,b<-" bugs in the code
",n,b,"take one down and patch it around
",n<-max(0,n-sample(21,1)+5),b,"
",c(n,b)[!n],sep="")

Probieren 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!

Giuseppe
quelle
1
Wo hat JayCe all diese Bytes gefunden? War es nur Zufall oder suchte JayCe aktiv nach ihnen?
Stewie Griffin
Ist das nicht die +5kostet Sie noch 2 Bytes? warum nicht einfach sample(26,6))?
theforestecologist
2
@theforestecologist Willkommen bei PPCG! Ich schlage vor, Sie werfen einen genaueren Blick auf die Frage ... davor steht ein Minuszeichensample
JayCe
11

Java 8, 161 160 Bytes

v->{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=Math.random()*21+4)<0?0:i)+t+"\n");return s+0+t;}

-1 Byte danke an @JonathanAllan .

Probieren Sie es online aus.

Erläuterung:

v->{                   // Method with empty unused parameter and String return-type
  String s="",         //  Result-String, starting empty
         t=" bugs in the code\n";
                       //  Temp-String we use multiple times
  for(int i=99;i>0;    //  Start `i` at 99, and loop as long as it's larger than 0
    s+=                //   Append to the result-String:
       i+t             //    The first line of the verse
       +i+t            //    The second (duplicated) line of the verse
       +"Take one down and patch it around\n"
                       //    The third line of the verse
       +((i-=Math.random()*21-4)
                       //    Decrease `i` by a random integer in the range [-16, 4]
         <0?0:i)       //    If `i` is now negative, set it to 0
        +t+"\n");      //    And append the fourth line of the verse
  return s             //  Return the result,
         +0+t;}        //  appended with an additional line for 0 at the very end
Kevin Cruijssen
quelle
Scheint, dass Sie rfür nichts verwenden?
OOBalance
1
Das Entfernen ,rscheint immer noch zu funktionieren: Probieren Sie es online aus!
Kamil Drakari
@OOBalance Hoppla .. Ich bin mir nicht sicher, warum ich das hierher gebracht habe ..>.> Danke, dass Sie es bemerkt haben.
Kevin Cruijssen
1
i - = ... + 5 speichert eine (obwohl ich denke, der Bereich sollte [-16 4] nicht [-15,5] sein)
Jonathan Allan
1
@ OOBalance ja r wird nicht verwendet, weil er Java verwendet ;-)
Anand Rockzz
10

PowerShell , 137 135 133 131 Byte

$b=' bugs in the code';for($a=99;$a){,"$a$b"*2;"Take one down and patch it around";$a+=-16..4|Random;if($a-lt0){$a=0}"$a$b`n"}"0$b"

Probieren Sie es online!

Der Abschnitt "Fehler im Code" wird $bzur späteren Verwendung gespeichert . Setzt $aauf 99, tritt in eine forSchleife 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, $aindem wir eine Randomganze Zahl aus dem Bereich auswählen [-16,4]. Danach klemmen wir $amit einem if auf Minimum Null if($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 implizites Write-Outputgibt uns kostenlos Zeilenumbrüche zwischen ihnen.

Zwei Bytes mit einer forSchleife anstelle einer whileSchleife gespeichert .
Durch Verschieben $bin einen eigenen Bereich wurden zwei Bytes gespart .
Dank Adrian Blackburn zwei Bytes gespart.

AdmBorkBork
quelle
Sie könnten $ a = (0, $ a) [$ a-gt0] ersetzen; mit If ($ a-lt0) {$ a = 0} für ein paar Bytes
Adrian
@ AdrianBlackburn Danke!
AdmBorkBork
9

JavaScript (Node.js) , 127 Byte

f=(i=99,t=` bugs in the code
`)=>i>0?i+t+`Take one down and patch it around
`+((i+=0|Math.random()*21-15)<0?0:i)+t+`
`+f(i):0+t

Probieren Sie es online!


Erklärung:

f = (                                          // start of our recursive function
    i=99,t=` bugs in the code                 // parameters, 1. num bugs , 2. text
`)                                           // using string literal end text with \n
=>                                          // start function
    i > 0 ?                                // if i is greater than 0
        i + t +                           // return value of i, value of t and  
    `Take one down and patch it around   // and this text 
    `                                   // + new line
    + (( i +=                          // and add 
        0|Math.random()*21-15) < 0 ?  // remove decimal from value obtained by multiplying
                                     // random number (between 0 and 1) multiplied by 21 
                                    // and then subtracting 15 from it
                                   // if that value is less than 0
        0 :                       // add 0 to i
        i                        // otherwise add value of i  
        )                       // end the parenthesis 
    + t                        // add value of t to that
    + `\n`                    // along with a new line 
    + f(i)                   // and repeat the process (this is recursive)
    :                       // if i > 0 condition not met then
        0 + t              // return 0 + t. Zero is there so the last line can be 
                          // repeated

Danke an @tsh für die Idee der Rekursion und Implementierung (einige Bytes gespart)

Anregungen zum Golfspielen hierzu sind jederzeit willkommen.

Muhammad Salman
quelle
1
Warum wurde 0+entfernt? Es scheint eine erforderliche Ausgabe zu sein.
Dienstag,
@tsh: Ist es das? Ich habe diesen Teil nicht gelesen.
Muhammad Salman
6

Python 2 , 151 Bytes

Schöner Trick j=i+max(-i,randint(-16,4))von Jo King, der die erlaubte ungleichmäßige Verteilung ausnutzt

Paar Bytes dank Mnemonic gespeichert

from random import*
i,s=99,'bugs in the code\n'
while i:j=max(0,i+randint(-16,4));print i,s,i,s,'Take one down and patch it around\n',j,s;i=j
print i,s

Probieren Sie es online!

Totes Opossum
quelle
1
Sie können ein Byte mit speichern j=max(0,i+randint(-16,4)).
Mnemonik
Außerdem ist es ‚Fehler in dem Code‘.
Mnemonik
Der Vergleich mit 0 ermöglicht nicht alle Zahlen. Danke für nichts "the": D
Dead Possum
Gleicher Trick wie meine Antwort, 151 Bytes
Jo King
Sie sind sowieso nicht möglich. Du darfst nicht unter 0 gehen.
Mnemonic
6

Kohle , 81 Bytes

≔⁹⁹θ≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζW›θ⁰«×²﹪ζθ”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”≧⁺⁻⁴‽²¹θ﹪ζ×θ›θ⁰¶»﹪ζ⁰

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔⁹⁹θ

Beginnen Sie mit 99 Fehlern im Code.

≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζ

Speichern Sie die komprimierte Zeichenfolge "% d Bugs im Code \ n".

W›θ⁰«

Wiederholen, solange noch eine positive Anzahl von Fehlern vorhanden ist.

ײ﹪ζθ

Gib die Anzahl der Fehler im Code zweimal aus.

”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”

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.

Neil
quelle
Benötigen Sie das letzte wiederholte "0 Fehler im Code"!
Sam Dean
1
@ SamDean Sorry, ich hatte das übersehen, behoben.
Neil
6

JavaScript, 189 176 168 162 Bytes

f=(x=99)=>{c=console.log;m=Math;a=` bugs in the code
`;c(x+a+x+a+"Take one down and patch it around"+(x=m.max(x+m.ceil(m.random()*21-15),0))+a)
x?f(x):c(`
`+x+a)}

Probieren Sie es online!

Vielen Dank an Muhammad Salman für den fehlenden console.logErsatz und an Oliver für die Verbesserung des x-Tests

Vielen Dank für l4m2 für das Golfen um 8 Bytes

Der zufällige Typ
quelle
Ich bin kein Knotenexperte, aber ich glaube, "Das Programm sollte anhalten, wenn die Anzahl der Fehler 0 oder negativ ist", bedeutet, dass Sie x<=0?console.log("\n"+0+a):f(x)am Ende benötigen .
NoOneIsHere
1
Ok, tut mir Leid. Eine weitere Sache: Wenn Sie eine anonyme Funktion erneut aufrufen müssen, müssen Sie sie explizit benennen (+2 Byte)
NoOneIsHere
1
kann das letzte "console.log" nicht durch "c" ersetzt werden?
Sam Dean
1
Auch @NoOneIsHere ist richtig. Sie brauchen diese fErklärung. Abgestimmt, bis aktualisiert, um das zu beheben. (Auch mein Link braucht ein Update auch)
Muhammad Salman
2
Der Punkt, den ich hier machen möchte, ist, dass Ihr Code nicht funktioniert, wenn die Funktion nicht aufgerufen wird f, was Sie nicht annehmen können.
NoOneIsHere
6

Python 3 , 156 138 Bytes

Dank Jonathans Python 2 Antwort für den idTrick

r=n=99
z='%d bugs in the code\n'
while n:x=n;r+=id(r);n-=min(n,r%21-4);print((z%x)*2+'Take one down and patch it around\n'+z%n)
print(z%n)

Probieren Sie es online!

Erläuterung:

r=n=99       #Initialise r and n to 99
z='%d bugs in the code\n'  #Save n
while n:     #Loop while n is not 0
    x=n      #Save value of n
    r+=id(r) #Modify value of r, which changes the hash value
    n-=min(n,r%21-4)  #Change n's value by a random number between 4 and -16
    print((z%x)*2+'Take one down and patch it around\n'+z%n)   #Print the message
print(z%n)  #And print the final line
Scherzen
quelle
5

Oktave , 149 148 Bytes

1 Byte durch Ändern von randi(21)und %inach 21*randund gespeichert %.f. %.fStellt 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.

x=99;do(p=@(i)printf('%.f bugs in the code\n',i))(x)
p(x)
disp('Take one down and patch it around')
p(max([0,x+=21*rand-17]))
disp('')until x<1
p(0)

Probieren Sie es online!

Erläuterung:

x=99;               % Initialize the number of bugs to 99
do ...  until x<1   % Loop until the number of bugs is less than 1
 (p=@(i)printf('%.f bugs in the code\n',i))(x)  % Create a function handle p that takes
                                                % the number of bugs as input and outputs
                                                % the string x bugs ... \n
 p(x)                % Call that function with the same number of bugs to get two lines
 ,disp('Take on down and patch it around')       % Outputs that line, including a newline
 ,p(max([0,x+=21*rand-17]))                    % Call p again, while updating the number
                                                 % of bugs. The number of bugs will be 
                                                 % the old one plus the random number, or 0
                                                 % if it would have turned negative
 ,disp('')        % A newline
p(0)              % Finally, the last single line.

Mit p((x+=21*rand-17)*(x>0)anstelle von wird maxein Byte gespeichert, aber die letzte Zeile wird -0 bugs ...anstelle von ausgegeben 0 bugs. Es funktioniert mit randi(21)-17, aber dann ist es die gleiche Länge wie oben. Probieren Sie es online!

Stewie Griffin
quelle
5

COBOL (GnuCOBOL), 317 294 279 270 Bytes

data division.working-storage section. 1 i pic S99 value 99.procedure division.perform until i=0 perform a 2 times display"Take one down and patch it around"compute i=i-(random*21- 4)if i<0 compute i=0 end-if perform a display""end-perform.a.display i" bugs in the code"

Probieren Sie es online!

Ungolfed

data division.                     <-- Define the variables we want to use
working-storage section.           <-- Define global variables used in this
                                       program

1 i pic S99 value 99.              <-- Define variable i with datatype signed
                                       numeric and with two digits

procedure division.                <-- Define our program

perform until i = 0                <-- Perform the following code until i = 0
    perform a 2 times              <-- Execute the procedure called 'a' twice,
                                       see below

    display "Take one down and patch it around"   <-- Display this sentence
    compute i = i -                <-- Subtract from i some random value
        (random * 21 - 4)

    if i < 0                       <-- if i < 0
        compute i=0                <-- then assign 0 to i
    end-if
    perform a                      <-- Execute the procedure 'a'
    display ""                     <-- Display an empty string; needed because
                                       of the blank line
end-perform.

a.                                 <-- Define procedure called 'a'.
    display i " bugs in the code"  <-- Display the value of i and then the
                                       given string literal

Hinweis: Der letzte Satz wird noch gedruckt, da COBOL das gesamte Programm ausführt und nach der perform untilSchleife das Label a " durchfällt" und seine Anweisungen ausführt. Dieses Verhalten ähnelt einem switch caseohne break.

PS: Die Zahlen werden nicht genau nach Bedarf angezeigt, aber COBOL ist nicht so gut darin, Zahlen automatisch in eine hübsche Textdarstellung umzuwandeln.

MC Kaiser
quelle
1
Hallo. Willkommen bei PPCG.
Muhammad Salman
Ich denke, dass minus 4 plus 4 sein sollte. Ich vermute, Sie haben (i- (rand-4) == (i-rand + 4) gewählt. Aber es gibt keine Klammern, sodass sich das Vorzeichen ändern muss von den Zahlen entfernt werden oder ist das ein Merkmal der Sprache? Aber gute Arbeit mit einer nicht Gold freundlichen Sprache!
Sam Dean
1
@ SamDean Danke! Ich habe diesen Fehler behoben. Ich muss zugeben, dass der tatsächlich berechnete Zufall von Kevin Cruijsens Antwort inspiriert war . Er verwendet jedoch einen zusammengesetzten Zuweisungsoperator ( -=in i-=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.
MC Kaiser
@MCEmperor sieht jetzt gut für mich aus!
Sam Dean
Kannst du nicht +4 benutzen und die Klammern speichern?
Raznagul
4

VBA: 212 163 Bytes

Diese 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.

  1. Verwenden While/Wendstatt For/Nextspart ein paar Zeichen.
  2. Das Aufrufen eines mit einem einzelnen Zeichen benannten Unterzeichens ist kürzer als GoSubund die dazu erforderlichen Zeilen Exit Subund Return.

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 vbLFan die Ausgabezeichenfolge angehängt, sodass Debug.Printsie nicht so oft aufgerufen werden musste. Ein großes Lob an EricF .


Sub b()
s=" bugs in the code"&vbLf
c=99
While c
Debug.? c &s &c &s &"Take one down and patch it around
c=c+5-Int(Rnd()*20)
c=IIf(c<0,0,c)
Debug.? c &s
Wend
End Sub

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

Ben
quelle
4
Willkommen auf der Seite!
Wheat Wizard
1
Sie können es auf 197 Zeichen runter , wenn Sie Strings kombinieren, verwenden Sie cstatt c>0als While Bedingung, und verwenden Sie c=Iif(c<0,0,c)statt If c<0 [...]: pastebin.com/nFGtGqdE
ErikF
4

LaTeX , 368 304 293 287 245 240 Bytes

Obwohl 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.

\documentclass{proc}\newcount\b\b99\usepackage[first=-16,last=5]{lcg}\def~{\the\b\ bugs in the code\\}\def\|{\loop~~Take one down and patch it around\\\rand\advance\b\value{rand}\ifnum\b>0 ~\\\repeat\b0 ~\\~}\begin{document}\|\end{document}

Besser lesbar:

\documentclass{proc}               %shortest document class
\newcount\b                        %short variable name
\b 99                              %set the value to 99
\usepackage[first=-16,last=5]{lcg} %random number generator
%\the prints the value of the variable behind it
%\def is shorter than \newcommand and can redefine commands
\def~{\the\b\ bugs in the code\\}
\def\|{                            %the function
    \loop
        ~
        ~
        Take one down and patch it around\\
        %\rand creates a counter named rand and                                        
        %stores the random value in it
        \rand \advance\b\value{rand} 
        %if the counter is smaller than 0, it becomes 0
        \ifnum\b>0 
            ~ \\                  %extra newline as required
    \repeat
    %if b is equal or smaller than 0, set it to 0
    \b 0 
    ~ \\                          %then print like normal
    %extra print at the end
    ~
}
\begin{document}
    \|                             %calling the function
\end{document}

Verbesserungen (pro Bearbeitung):

  1. "x Fehler im Code" ist jetzt eine Funktion anstelle von 4 Zeilen
  2. Die \ifKlausel für \repeatas a wurde umgeschrieben\else
  3. Funktioniert anscheinend \value{b}=xzur Initialisierung, aber nicht in der Schleife (statt \setcounter{b}{x})
  4. Anscheinend \relaxsollte für Punkt 3 verwendet werden, aber das kann auch durch Einfügen eines Leerzeichens erreicht werden. Die \elseverwendeten TeX-Befehle anstelle von LaTeX wurden entfernt, da diese kürzer sind und durch ersetzt \'werden ~.
  5. Einige Codes mussten aus irgendeinem Grund nicht gelockert werden.
Simon Klaver
quelle
1
Willkommen bei PPCG.
Muhammad Salman
Willkommen bei PPCG! Ich habe Ihren Code nicht ausgeführt, aber sollte es nicht \ifnum\value{b}<1eher sein als <0?
JayCe
@ JayCe: Es ist eigentlich egal, wenn b 0 ist, verlässt es die Schleife trotzdem. Es mag weniger intuitiv sein, dass wenn b 0 ist, der else-Fall tatsächlich gedruckt wird, aber effektiv gibt es keinen Unterschied, denke ich.
Simon Klaver
@ JayCe verkürzt den Code, jetzt spielt es keine Rolle mehr;)
Simon Klaver
4

C,  169  165 Bytes

Vielen Dank an @ceilingcat für das Speichern von vier Bytes!

*s=" bugs in the code";f(i,j){for(i=99;i>0;i=j)printf("%d%s\n%d%s\nTake one down and patch it around\n%d%s\n\n",i,s,i,s,(j=i+rand()%19-15)<0?0:j,s);printf("0%s",s);}

Probieren Sie es online!

Steadybox
quelle
3

SAS, 210 Byte

%macro t;%let b=bugs in the code;%let a=99;%do%until(&a<=0);%put&a &b;%put&a &b;%put Take one down, pass it around;%let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);%if &a<0%then%let a=0;%put&a &b;%put;%end;%mend;%t

Ungolfed:

%macro t;
%let b=bugs in the code;
%let a=99;
%do%until(&a<=0);
  %put &a &b;
  %put &a &b;
  %put Take one down, pass it around;    
  %let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);
  %if &a<0%then%let a=0;
  %put &a &b; 
  %put;
%end;
%mend;
%t

Kann einige Bytes sparen, wenn Warnungen im Protokoll zulässig sind (setzen Sie das &ain die &bMakrovariable, aber dies erzeugt eine erste Warnung).

Joe
quelle
Einige andere haben Warnungen, also werde ich mitgehen, sie sind erlaubt.
Sam Dean
3

PHP, 126 Bytes

Führen Sie in der Befehlszeile Folgendes aus php -r 'code here':

$b=" bugs in the code
";for($x=99;print$x.$b,$x;)echo"$x{$b}Take one down and patch it around
",$x-=min($x,rand(-4,16)),"$b
";
PleaseStand
quelle
3

ABAP , 295 Bytes

... denn warum zum Teufel nicht!

REPORT z.DATA:a(16),c TYPE qfranint.a = 'bugs in the code'.data(b) = 99.WRITE:/ b,a.WHILE b > 0.WRITE:/ b,a,/'Take one down and patch it around'.CALL FUNCTION
'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 21 IMPORTING ran_int = c.b = b + c - 17.IF b < 1.b = 0.ENDIF.WRITE:/ b,a,/,/ b,a.ENDWHILE.

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:

REPORT z.
  "Define a (text) and c (random)
  DATA: a(16),
        c TYPE qfranint. "A stupid data type for a random INT

  "This is shorter than using VALUE (saves 3 bytes)
  a = 'bugs in the code'.
  "This is slightly shorter than doing ',b TYPE i' and 'b = 99'. (saves 2 bytes)
  data(b) = 99.

  "first line has to be outside of loop due to our exit condition (saved me ~5 bytes)
  WRITE: / b,a. "\n xx bugs in the code

  WHILE b > 0.
    WRITE: / b,a, "\n xx bugs in the code
    /'Take one down and patch it around'.

    "This ridiculous function for random numbers...
    "To save some bytes, I leave ran_int_min at it's default
    "of 1, and set the max to 21 instead, from which I remove
    "17 later on, resulting in a range of [-16,4]
    "Compare:
    "   ' - 17'              =  5 bytes
    "   ' ran_int_min = -16' = 18 bytes
    "(saves 13 bytes)

    CALL FUNCTION 'QF05_RANDOM_INTEGER'
        EXPORTING ran_int_max = 21
        IMPORTING ran_int = c.

    "Maximum number of bugs added:     4 = 21 - 17
    "Maximum number of bugs removed: -16 =  1 - 17
    b = b + c - 17.

    IF b <= 0.
        b = 0.
    ENDIF.

    WRITE: / b,a,/,/ b,a. "\nxx bugs in the code\n\nxx bugs in the code
  ENDWHILE.

Danke für die Herausforderung!
An meinen Chef: Bitte feuere mich nicht, ich bilde mich nur selbst aus!

Maz
quelle
3

Sauber , 245 234 Bytes

import StdEnv,Math.Random,System.Time,System._Unsafe,Text
f[n,v:l]b|n>0=n<+b<+n<+b+"Take one down and patch it around\n"<+max 0v<+b+"\n"+f[v:l]b=0<+b

f(scan(+)99[n rem 20-16\\n<-genRandInt(toInt(accUnsafe time))])" bugs in the code\n"

Probieren Sie es online!

Οurous
quelle
Gibt es eine Chance, dass Sie die Anführungszeichen am Anfang und am Ende entfernen können?
Sam Dean
1
@ SamDean Oh, das ist nur eine Compiler-Option, die ich vergessen habe. Ich werfe das
rein
3

C #, 184 181 Bytes

Meine erste Code Golf Antwort!

(Basierend auf der Java-Antwort von Kevin Cruijssen)

Func<String>c=()=>{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=new Random().Next(21)-4)<0?0:i)+t+"\n");return s+0+t;};

Probieren Sie es online!

Ben Noble
quelle
1
Willkommen bei PPCG :)
Shaggy
2

T-SQL, 188 Bytes

DECLARE @ INT=99,@b CHAR(18)=' bugs in the code
'a:PRINT CONCAT(@,@b,@,@b,'Take one down and patch it around
')SET @+=5-22*RAND()IF @<0SET @=0PRINT CONCAT(@,@b,'
')IF @>0GOTO a;PRINT '0'+@b

SQL erlaubt Rückgaben innerhalb von String-Literalen, das hilft.

CONCAT()führt eine implizite Konvertierung in Text durch, damit ich mich nicht um CASToder kümmern muss CONVERT.

BradC
quelle
2

JavaScript, 138 Bytes

_=>(I=i=>`Take one down and patch it around
${l=(i>0?i:0)+` bugs in the code
`}
`+l+l+(i>0&&I(i+Math.random()*21-15|0)))(99).slice(55,-25)

darrylyeo
quelle
2

QB64 , 134 Bytes

Von meinem Bruder.

S$="bugs in the code":I=99:WHILE I>0:?I;S$:?I;S$:?"Take one down and patch it around":I=I+INT(RND*21)-15:I=-(I>0)*I:?I;S$:?:WEND:?I;S$
ErikF
quelle
2

Pyth , 94 92 Bytes

J99WJ%jb[K"%d bugs in the code"K"Take one down and patch it around"Kk)[JJ=JeS,Z+J-O21 16;%KZ

Probieren Sie es online aus


Vorherige Version: 94 Bytes

J99WJp%jb[K"%d bugs in the code"K"Take one down and patch it around"K)[JJ=JeS,Z+J-O21 16)b;%KZ
Sok
quelle
2

Jelly , 61 Bytes

;“,Ȥm46Ṛṛ⁽eɼḞF»
ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®?
99Ç

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?

;“,Ȥm46Ṛṛ⁽eɼḞF» - Link 1, helper to construct count-text: number
 “,Ȥm46Ṛṛ⁽eɼḞF» - compressed string (list of characters) = " bugs in the code\n"
;               - concatenate the number with that list of characters

ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®? - Link 2, print stuff: number
Ç                                         - call the last Link (1) as a monad
 Ȯ                                        - print and yield that
                                          - ...at this point that is then printed again
                                          -    implicitly due to the start of a new leading
                                          -    constant chain below
  “"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»                  - compressed string (list of characters)
                                          -     = "Take one down and patch it around\n"
                                          - ...once again an implicit print, same reason
                        20                - twenty
                          X               - random int from [1,20] 
                           +              - add the left argument, the number
                                17        - seventeen
                              ¥           - last two links as a dyad:
                             «            -   minimum (of rand[1,20]+n and 17) 
                            _             -   subtract
                               ©          - copy this newNumber to the register
                                  Ç       - call last Link (1) as a monad = f(newNumber)
                                          - here we get another implicit print, same reason
                                   ⁷      - a new line character
                                          - yet another implicit print, same reason
                                    ®     - recall newNumber from the register
                                        ? - if... 
                                       ®  - ...condition: recall from register again
                                          -               (i.e. if non-zero)
                                     ß    - ...then: call this Link (2) as a monad
                                          -          = Link 2(newNumber)
                                      Ç   - ...else: call the last Link (1) as a monad
                                          -          = Link 1(0) (since newNumber=0)

99Ç - Main Link: no arguments
99  - yep, you guessed it, ninety nine
  Ç - call the last Link (2) as a monad
Jonathan Allan
quelle
2

Perl, 132 Bytes

$c=" bugs in the code
";for($i=99;$i>0;$i+=~~rand(21)-16){print$t.$/,($t=$i.$c)x2,"Take one down and patch it around
"}print"0$c
"x2
Trenton Trama
quelle
2

VBA: 225 233 Bytes

Sub b()
For c = 99 To 0 Step -1
GoSub d
GoSub d
Debug.Print "Take one down and patch it around"
c = c + 5 - Int(rnd() * 20)
If c < 0 Then c = 0
GoSub d
Debug.Print
Next c
Exit Sub
d:
Debug.Print c & " bugs in the code"
Return
End Sub

{EDIT} Die fehlenden hinzugefügtrnd()*

Hinweise:
Wird GoSubzum Drucken der dreifachen Zeile verwendet, da sie etwas kürzer ist, als die Zeile einer Variablen Debug.Printzuzuweisen und zuzuweisen.
Debug.PrintOhne Argumente wird eine leere Zeile ausgegeben (Null oder leere Zeichenfolge sind nicht erforderlich). Eine WorksheetFunction.MaxZeile wäre zu lang, daher habe ich ein "wenn kleiner als" verwendet, um Negative zu vermeiden.

 

Mit Einrückung und Kommentaren

Sub b()
    For c = 99 To 0 Step -1
        GoSub d '"# bugs in the code"
        GoSub d '"# bugs in the code"
        Debug.Print "Take one down and patch it around"
        c = c + 5 - Int(rnd() * 20)
        If c < 0 Then c = 0 'Non-negative
        GoSub d '"# bugs in the code"
        Debug.Print
    Next c
    Exit Sub
d: 'This is our GoSub bit
    Debug.Print c & " bugs in the code"
    Return
End Sub
Chronozid
quelle
1
Das ist ein sehr effizienter Weg, um Zufallszahlen zu machen!
Sam Dean
@ SamDean Ich bin mir nicht sicher, wie ich vergessen habe, die rnd() * dort einzubeziehen - ich glaube, ich war damit beschäftigt, zu zählen , ob es weniger Zeichen gab Dim c%(dh "c ist eine Ganzzahl") und dieInt()
Chronocidal
haha keine sorge! Schön, eine VBA-Antwort zu sehen, da ich sie seit Jahren nicht mehr verwendet habe!
Sam Dean
2

Python 2 ,  138 134 133 131  127 Bytes

-1 Dank an Jo King (neu anordnen, um die Logik zu verwenden, bugs-=min(bugs,randomNumber)anstatt bugs=max(0,bugs-randomNumber)). Dies ermöglichte das erzwungene Beenden mit einer Division durch Null, wodurch weitere 6 Bytes gespart wurden !

r=n=99
t="bugs in the code\n"
while 1:r+=id(r);b=n;n-=min(n,r%21-4);print b,t,1/b|b,t,"Take one down and patch it around\n",n,t

Probieren Sie es online!

Jonathan Allan
quelle
Es stellte sich heraus, dass ich überhaupt keine Tupel erstellen muss.
Jonathan Allan
133 Bytes
Jo King
@JoKing Danke! (Ich hätte das wirklich bemerken sollen, da es eher so ist, wie ich es in meiner Gelee-Antwort tue.)
Jonathan Allan
2
@JoKing ... was bedeutet, dass wir das Beenden mit einem Division durch Null-Fehler erzwingen können, um --zwei-- sechs weitere zu speichern :)
Jonathan Allan
2

Ruby: 149 Bytes

n=99;f=" bugs in the code\n";loop{puts"#{n}#{f}"*2+"Take one down and patch it around\n";(n+=rand -16..4)>0?puts("#{n}#{f}\n"):break};puts"0#{f}\n"*2

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.

DaveMongoose
quelle
Hallo und willkommen bei PPCG! Wir zählen nachgestellte Zeilenumbrüche, aber wenn es unter Linux funktioniert, können Sie nur die \n(Nein \r) zählen.
NoOneIsHere
@NoOneIsHere Danke :) Ich habe meine Antwort aktualisiert, um dies zu verdeutlichen. Ich bezog mich auf Zeilenumbrüche in der Ausgabe, da die Frage angibt, dass es akzeptabel ist, eine zu haben, bei zwei war ich mir jedoch nicht sicher.
DaveMongoose
Aha. Ich denke, das ist in Ordnung
NoOneIsHere
2

Zsh , 133 Bytes

b="%d bugs in the code
";for ((n=99;n;)){printf $b$b"Take one down and patch it around
$b
" n n n-=RANDOM%21-4,n=n\>0\?n:0};printf $b

Probieren Sie es online!


Dies nutzt einige zsh-Funktionen aus.

  • Die alternative Schleifenform : while list; do list; donekann geschrieben werden alswhile list {list}
  • Wenn ein Formatbezeichner in printfnumerisch ist, wird das entsprechende Argument als arithmetischer Ausdruck ausgewertet. Damit:
    • wir erhalten den Wert von nkostenlos ohne Verwendung von a$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0wird nochmal ausgewertet ohne verwenden zu $((...))müssen $[...]oder ähnliches. Die >und ?mussten entkommen.
    • Am printf $bEnde wird ein leeres Argument als 0 für ausgewertet %d.
  • Die Wortteilung bei der Parametererweiterung ist standardmäßig deaktiviert, sodass ich $bnirgendwo zitieren muss .
    • Dadurch kann ich $b$b"Take..."statt schreiben "$b${b}Take...".

  • Ein paar Bytes gespart \n, indem aktuelle Zeilenumbrüche anstelle von und for((n=99;n;))anstelle von verwendet wurden n=99;while ((n)).
muru
quelle
Ich denke, es sollte -4 sein. "- =" sieht aus wie seine Verbindung, also macht es zuerst die +4 und subtrahiert dann alles.
Sam Dean
@ SamDean oops, korrigiert.
muru