99 errores en el código

47

99 errores en el código

La adaptación de "99 botellas de cerveza en la pared" para la informática donde los errores aumentan en lugar de que disminuyan las botellas a menudo se vuelve a publicar en Internet. Ejemplo de camiseta aquí .

Creo que será interesante ver la recurrencia potencial y la generación de números aleatorios en una gran variedad de idiomas y encontrar las formas más eficientes de hacerlo.

Hay otros pocos desafíos que hacer con 99 botellas de cerveza, ¡pero ninguna parece tener un número creciente y decreciente!

Desafío

Su programa o función no debe ingresar nada y luego imprimir

99 errores en el código

99 errores en el código

Quita uno y reméndelo

X errores en el código

(linea en blanco)

Donde X es el entero anterior menos 1 más un entero aleatorio en el rango [-15,5].
Puede fusionar el menos 1 en el entero aleatorio, permitiendo así el rango [-16,4].
Los rangos pueden ser exclusivos, por lo que menos uno más (-16,6) o (-17,5).

Los enteros aleatorios no tienen que distribuirse uniformemente, solo tienen que ser posibles.

El programa siempre comienza con 99 errores.

Puede ignorar el error gramatical de "1 errores".

El programa debe detenerse cuando el número de errores es 0 o negativo e imprimir

0 errores en el código

Nunca debe haber un número negativo de errores. El final debería verse como

Errores Y en el código

Errores Y en el código

Quita uno y reméndelo

0 errores en el código

(linea en blanco)

0 errores en el código

Una nueva línea final es aceptable.

  • Su código puede ser un programa completo o una función.
  • No hay entrada
  • El resultado debe ser stdout o devuelto.
  • Las advertencias / errores en los registros / STDERR están bien siempre que STDOUT tenga el texto requerido. Ver aquí para más información.

Este es el código de golf, por lo que gana el código más corto en bytes.

Salida de ejemplo

Salida de ejemplo de bin pegado manipulada para -11 errores cada vez

Sam Dean
fuente
1
Relacionado: 1 2 (diferencia: en este desafío, la salida puede ser arbitrariamente larga).
user202729
16
¡Un escenario más realista sería si se volteara el signo del número aleatorio!
Stewie Griffin
99
Me decepciona que los requisitos no incluyan que el programa debe tener un error una vez que se encuentra un número negativo, como bloquearse, desbordarse a max int o similar;).
allo
3
"Los enteros aleatorios no tienen que distribuirse uniformemente, solo tienen que ser posibles". me recordó a xkcd.com/221
Ivo Beckers
2
Es una pena que 99 no tenga generación de números aleatorios.
Jonathan Allan

Respuestas:

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="")

Pruébalo en línea!

Si bien es razonablemente bueno en la generación de números aleatorios, R es terrible en cadenas e impresión. ¡JayCe encontró alrededor de mil millones de bytes y continúa encontrando nuevas formas de jugar golf!

Giuseppe
fuente
1
¿Dónde encontró JayCe todos esos bytes? ¿Fue solo una casualidad o JayCe los estaba buscando activamente?
Stewie Griffin
¿No +5te está costando otros 2 bytes? ¿Por qué no solo sample(26,6))?
theforestecologist
2
@theforestecologist Bienvenido a PPCG! Le sugiero que eche un vistazo más de cerca a la pregunta ... hay un signo menos al frentesample
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 gracias a @JonathanAllan .

Pruébalo en línea.

Explicación:

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
fuente
Parece que no estás usando rpara nada?
OOBalance
1
,rParece que la eliminación aún funciona: ¡ Pruébelo en línea!
Kamil Drakari
@OOBalance Oops ... No estoy seguro de por qué lo conseguí allí ...>.> Gracias por notarlo.
Kevin Cruijssen
1
i - = ... + 5 guarda uno (aunque creo que el rango debería ser [-16 4] no [-15,5])
Jonathan Allan
1
@OOBalance yes r no se usa, porque está usando java ;-)
Anand Rockzz
10

PowerShell , 137 135 133 131 bytes

$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"

Pruébalo en línea!

La sección "errores en el código" se guarda $bpara su uso posterior. Se establece $aen 99, entra en un forbucle $a. Primero creamos una matriz de dos cadenas ," "*2, siendo la cadena el "X bugs in the code".

El siguiente es solo la cadena "Take one down and patch it around". Luego incrementamos $aseleccionando un Randomnúmero entero del rango [-16,4]. Después de eso, $aestablecemos un mínimo de cero usando un if if($a-lt0){$a=0}. Luego la cuerda "Y bugs in the code".

Finalmente, una vez finalizado el bucle, colocamos la cuerda "0 bugs in the code"en la tubería. Todas esas cadenas se recopilan de la tubería, y un implícito Write-Outputnos da nuevas líneas entre ellas de forma gratuita.

Guardado dos bytes usando un forbucle en lugar de un whilebucle.
Ahorró dos bytes moviéndose $ba su propia sección.
Ahorró dos bytes gracias a Adrian Blackburn.

AdmBorkBork
fuente
Puede reemplazar $ a = (0, $ a) [$ a-gt0]; con If ($ a-lt0) {$ a = 0} por un par de bytes
Adrian
@AdrianBlackburn ¡Gracias!
AdmBorkBork
9

JavaScript (Node.js) , 127 bytes

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

Pruébalo en línea!


Explicacion:

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

Gracias a @tsh por la idea de recursión e implementación (guardado algunos bytes)

Cualquier sugerencia para jugar golf más allá es bienvenida.

Muhammad Salman
fuente
1
¿Por qué fue 0+eliminado? Parece que se requiere salida.
tsh
@tsh: ¿lo es? No leí esa parte.
Muhammad Salman
7

05AB1E , 59 bytes

99[Ð16(4ŸΩ+¾‚{θ©3F“ÿ±À€†€€ƒË“Š}“ƒ¶€µ„‹€ƒš¡€•…¡“ªsõ®>#®]sDŠ»

Pruébalo en línea!

Emigna
fuente
6

Python 2 , 151 bytes

Buen truco j=i+max(-i,randint(-16,4))de Jo King, explotar la distribución desigual permitida

Par de bytes guardados gracias a Mnemonic

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

Pruébalo en línea!

Zarigüeya muerta
fuente
1
Puede guardar un byte usando j=max(0,i+randint(-16,4)).
Mnemónico
Además, son 'errores en el código'.
Mnemónico
Usar 0 para comparar hará que no todos los números sean posibles. Gracias por nada 'the': D
Dead Possum
El mismo truco que mi respuesta, 151 bytes
Jo King
No son posibles de todos modos. No tienes permitido ir por debajo de 0.
Mnemonic
6

Carbón , 81 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔⁹⁹θ

Comience con 99 errores en el código.

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

Guarde la cadena comprimida "% d errores en el código \ n".

W›θ⁰«

Repita mientras haya un número positivo de errores restantes.

ײ﹪ζθ

Imprima el número de errores en el código dos veces.

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

Imprime "Toma uno y revísalo".

≧⁺⁻⁴‽²¹θ

Agregue un número aleatorio de errores entre -17 (exclusivo) y 4 (inclusive).

﹪ζ×θ›θ⁰

Imprima el número de errores restantes, o 0 si es negativo.

Deje una línea en blanco entre versos.

»﹪ζ⁰

Después del último verso, imprima 0 errores en el código nuevamente.

Neil
fuente
¡Necesito esa repetición final de "0 errores en el código"!
Sam Dean
1
@SamDean Lo siento, pasé por alto eso, arreglado.
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)}

Pruébalo en línea!

Gracias por Muhammad Salman por el console.logreemplazo faltante , y por Oliver por la mejora de la prueba x

Gracias por l4m2 por jugar al golf por 8 bytes

El chico al azar
fuente
No soy un experto en nodos, pero creo que "El programa debe detenerse cuando el número de errores es 0 o negativo" significa que necesita x<=0?console.log("\n"+0+a):f(x)al final.
NoOneIsHere
1
OK lo siento. Una cosa más: si necesita recurrir en una función anónima, debe nombrarla explícitamente (+2 bytes)
NoOneIsHere
1
¿No se puede reemplazar ese último "console.log" por "c"?
Sam Dean
1
También @NoOneIsHere tiene razón. Necesitas esa fdeclaración. Votado abajo hasta actualizado para arreglar eso. (También mi enlace necesita una actualización también)
Muhammad Salman
2
El punto que estoy tratando de hacer aquí es que su código no funciona si no se llama a la función f, lo cual no puede suponer.
NoOneIsHere
6

Python 3 , 156 138 bytes

Gracias a la respuesta de Jonathan Python 2 por el idtruco

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)

Pruébalo en línea!

Explicación:

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
Jo King
fuente
5

Octava , 149 148 bytes

Se guardó un byte cambiando randi(21)y %ihacia 21*randy %.f. %.fgarantiza que la salida sea flotante con cero decimales (es decir, y entero).

Se insertó un montón de saltos de línea en lugar de comas y punto y coma para facilitar la lectura. Se siente mal, pero no es más largo que el de una sola línea.

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)

Pruébalo en línea!

Explicación:

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.

Usar en p((x+=21*rand-17)*(x>0)lugar de maxguardar un byte, pero la última línea sale en -0 bugs ...lugar de 0 bugs. Funciona con randi(21)-17, pero luego tiene la misma longitud que la anterior. Pruébalo en línea!

Stewie Griffin
fuente
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"

Pruébalo en línea!

Sin golf

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

Nota: la última oración todavía se imprime, porque COBOL ejecuta todo el programa, y ​​después del perform untilciclo "cae" la etiqueta a , ejecutando sus declaraciones. Este comportamiento es similar a un switch casesin break.

PD: Los números no se muestran exactamente como se requiere, pero COBOL no es tan bueno para convertir automáticamente números a una representación textual bonita.

MC Emperor
fuente
1
Hola. Bienvenido a PPCG.
Muhammad Salman
Creo que menos 4 debería ser más 4. Supongo que elegiste (i- (rand-4) == (i-rand + 4). Pero no hay corchetes, por lo que el signo debe cambiar. También pueden cambiar los signos de los números debe ser eliminado o es que una característica de la lengua Pero el trabajo agradable con un lenguaje amigable no oro?!
Sam Dean
1
@SamDean ¡Gracias! Arreglé ese error. Debo admitir que el cálculo aleatorio real se inspiró en la respuesta de Kevin Cruijssen . Pero él usa un operador de asignación compuesto ( -=in i-=Math.random()*21-4), que implica paréntesis alrededor de todo el operando de la derecha. Olvidé hacerlos explícitos, pero ahora está arreglado, creo.
MC Emperor
¡@MCEmperor me parece bien ahora!
Sam Dean
¿No puedes usar +4 y guardar los corchetes?
raznagul
4

VBA: 212 163 bytes

Esta solución se basa en la que Chronocidal publicó ayer. Esta es mi primera publicación y no tengo suficiente reputación para comentar su publicación.

Esta revisión contiene dos mejoras.

  1. Usar en While/Wendlugar de For/Nextguardar algunos caracteres.
  2. Llamar a un Sub nombrado con un solo carácter es más corto GoSuby las líneas Exit Suby Returnnecesarias para admitirlo.

Editar:
3. Se eliminaron los espacios en blanco y los caracteres que el editor de VBA agregará automáticamente. Vea Consejos para jugar golf en VBA
4. Agregué sugerencias de @EricF, luego vi que su algoritmo de papelera era aún más pequeño, así que reemplacé mi algoritmo con el suyo y eliminé espacio en blanco Se agregaba un cambio clave vbLFa la cadena de salida, por Debug.Printlo que no era necesario llamarlo con tanta frecuencia. Felicitaciones a 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

Este fue un desafío divertido. Si conoce a un intérprete en línea como TIO para VB6 / VBScript / VBA, deje un comentario.

Si desea probar este código y tiene instalado Microsoft Excel, Word, Access o Outlook (solo Windows), presione Alt + F11 para abrir el IDE de VBA. Inserte un nuevo módulo de código (Alt + I, M) y borre Option Explicit. Luego pegue el código y presione F5 para ejecutarlo. Los resultados deberían aparecer en la ventana Inmediato (presione Ctrl + G si no lo ve).

Ben
fuente
44
Bienvenido al sitio!
Wheat Wizard
1
Puede cc>0c=Iif(c<0,0,c)If c<0 [...]
reducirlo
4

LaTeX , 368 304 293 287 245 240 bytes

Si bien no es realmente competitivo en comparación con otros programas en términos de bytes, solo quería ver cómo hacerlo en LaTeX.

\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}

Más legible:

\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}

Mejoras (por edición):

  1. "x errores en el código" ahora es una función en lugar de 4 líneas
  2. Reescribió la \ifcláusula para el \repeatcomo\else
  3. Aparentemente \value{b}=xfunciona para la inicialización pero no en el bucle (en lugar de \setcounter{b}{x})
  4. Aparentemente \relaxdebería usarse para el punto 3, pero eso también se puede lograr insertando un espacio. Retiró el\else comandos TeX utilizados en lugar de LaTeX, ya que son más cortos y se reemplazaron \'por ~.
  5. Algún código no necesitaba ser relajado por alguna razón.
Simon Klaver
fuente
1
Bienvenido a PPCG.
Muhammad Salman
Bienvenido a PPCG! No he ejecutar el código, pero no debería ser \ifnum\value{b}<1más que <0?
JayCe
@ JayCe: Realmente no importa, una vez que b es 0, se escapa del bucle de todos modos. Puede que sea menos intuitivo que cuando b es 0, el caso más se imprime, pero creo que no hay diferencia.
Simon Klaver
@ JayCe acortó el código, ahora ya no importa;)
Simon Klaver
4

C,  169  165 bytes

¡Gracias a @ceilingcat por guardar cuatro 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);}

Pruébalo en línea!

Steadybox
fuente
3

SAS, 210 bytes

%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

Sin golf:

%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

Puede guardar algunos bytes si se permiten advertencias en el registro (poner &aen la &bvariable macro, pero eso genera una advertencia inicial).

Joe
fuente
Algunos otros tienen advertencias, así que iré con ellos están permitidos.
Sam Dean
3

PHP, 126 bytes

Ejecutar en la línea de comando, usando 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
";
Por favor levantese
fuente
3

ABAP , 295 bytes

... porque por qué diablos no!

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.

Ciertamente no es competitivo en comparación con otros idiomas, pero incluso logré reducirlo de 330 bytes que escribí inicialmente, así que lo considero una victoria personal.

Como ABAP no permite líneas de más de 255 caracteres, tuve que reemplazar un espacio con un salto de línea. En Windows, esto inicialmente aumentó el tamaño a 296 bytes debido a CRLF, pero funciona bien solo con el LF allí. Sin embargo, ABAP requiere muchos espacios, así que esto no es gran cosa.

ESCRIBIR simplemente voltea el texto de la GUI, ¿así que supongo que es algo así como stdout? Probablemente podría guardar algunos bytes aquí usando una estructura o tabla, pero debido a cómo SAP maneja estructuras mixtas (que contienen caracteres y números), el enfoque que imaginé solo funcionaría en sistemas que no sean Unicode ... Lo cual personalmente considero un no- ir, a pesar de tener acceso a ambos.

El módulo de función para números aleatorios es el único que pude encontrar en nuestro sistema, supongo que podría haber uno con un nombre o parámetros más cortos. ¡Ni idea!

Código más o menos legible, los comentarios incluyen:

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.

Gracias por el reto!
A mi jefe: ¡Por favor no me despidan, solo me estoy educando!

Maz
fuente
3

Limpio , 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"

Pruébalo en línea!

Οurous
fuente
¿Hay alguna posibilidad de que pueda eliminar las comillas al principio y al final?
Sam Dean
1
@SamDean Oh, eso es solo una opción de compilador que olvidé. Voy a tirar de que en.
Οurous
3

C #, 184 181 bytes

¡Mi primera respuesta de Code Golf!

(Basado en la respuesta Java de @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;};

Pruébalo en línea!

Ben noble
fuente
1
Bienvenido a 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 permite devoluciones dentro de literales de cadena, por lo que ayuda.

CONCAT()realiza una conversión implícita a texto para que no tenga que preocuparme por CASTo CONVERT.

BradC
fuente
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
fuente
2

QB64 , 134 bytes

De mi hermano

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
fuente
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

Pruébalo en línea


Versión anterior: 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
fuente
2

Jalea , 61 bytes

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

Un enlace niládico que también funciona como un programa completo.

Pruébalo en línea!(la salida se vacía después de que se completa la ejecución pero imprime párrafo por párrafo)

¿Cómo?

;“,Ȥ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
fuente
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
fuente
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

{EDITAR} Se agregaron los que faltanrnd()*

Notas: Se
utiliza GoSubpara imprimir la línea triplicada, porque es un poco más corta que asignar la línea a una variable y Debug.Printponerla.
Debug.Printsin ningún argumento imprime una línea vacía (no es necesario un nulo o una cadena vacía) Una WorksheetFunction.Maxlínea sería demasiado larga, por lo que utilicé un "si es menor que" para evitar negativos.

 

Con sangría y comentarios

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
Cronocidales
fuente
1
¡Esa es una manera muy eficiente de hacer números aleatorios!
Sam Dean
@SamDean No estoy seguro de cómo olvidé incluir el contenido rnd() * allí: creo que estaba ocupado contando si se trataba de menos caracteres Dim c%(es decir, "c es un número entero") y soltar elInt()
Chronocidal
jaja no te preocupes! ¡Es bueno ver una respuesta de VBA ya que no la he usado en años!
Sam Dean
2

Python 2 ,  138134133131127  bytes

-1 Gracias a Jo King (reorganizar para usar la lógica en bugs-=min(bugs,randomNumber)lugar de bugs=max(0,bugs-randomNumber)). Esto permitió el forzar-salir usando un error de división por cero, ¡ahorrando otros 6 bytes!

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

Pruébalo en línea!

Jonathan Allan
fuente
Resulta que no necesito crear tuplas en absoluto.
Jonathan Allan
133 bytes
Jo King
@JoKing ¡Gracias! (Realmente debería haberlo visto ya que es más como lo que hago en mi respuesta de Jelly.)
Jonathan Allan
2
@JoKing ... lo que significa que podemos forzar el abandono con una división por cero error para guardar --dos-- seis más :)
Jonathan Allan
2

Rubí: 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

Debería funcionar en casi cualquier versión de Ruby> = 1.8

Creo que podría ser posible optimizar las cadenas un poco más, pero en general estoy bastante satisfecho con eso, en particular la asignación de combo / comparación / declaración de interrupción y el abuso de corchetes opcionales.

Nota: la salida técnicamente tiene dos nuevas líneas finales; si eso debe tenerse en cuenta, entonces aumenta en 4 caracteres.

DaveMongoose
fuente
Hola y bienvenidos a PPCG! Contamos las nuevas líneas finales, pero si funciona en Linux solo puede contar el \n(no \r).
NoOneIsHere
@NoOneIsHere Gracias :) He actualizado mi respuesta para aclarar: me refería a nuevas líneas en el resultado porque la pregunta especifica que tener uno es aceptable, pero no estaba seguro de dos.
DaveMongoose
Veo. Creo que está bien
NoOneIsHere 01 de
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

Pruébalo en línea!


Esto aprovecha algunas características de zsh.

  • el forma de bucle alternativa : while list; do list; donese puede escribir comowhile list {list}
  • Si un especificador de formato en printf es numérico, el argumento correspondiente se evalúa como una expresión aritmética. Entonces:
    • obtenemos el valor de n gratuita sin utilizar un$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0se evalúa nuevamente sin tener que usar $((...)), $[...]o similar. los> y ?tuvo que ser escapado.
    • El printf $bfinal evalúa un argumento vacío como 0 para %d.
  • La división de palabras en la expansión de parámetros está desactivada de forma predeterminada, por lo que no tengo que citar en $bningún lado.
    • Esto me permite escribir en $b$b"Take..."lugar de "$b${b}Take...".

  • Se guardaron algunos bytes al usar nuevas líneas reales en lugar de \ny en for((n=99;n;))lugar de n=99;while ((n)).
muru
fuente
Creo que debería ser -4. "- =" se parece a su compuesto, por lo que primero hace +4 y luego lo resta todo.
Sam Dean
@SamDean oops, corregido.
muru