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
Respuestas:
R ,
182,140,138,135 bytesPrué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!fuente
+5
te está costando otros 2 bytes? ¿Por qué no solosample(26,6))
?sample
Java 8,
161160 bytes-1 byte gracias a @JonathanAllan .
Pruébalo en línea.
Explicación:
fuente
r
para nada?,r
Parece que la eliminación aún funciona: ¡ Pruébelo en línea!PowerShell ,
137135133131 bytesPruébalo en línea!
La sección "errores en el código" se guarda
$b
para su uso posterior. Se establece$a
en99
, entra en unfor
bucle$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$a
seleccionando unRandom
número entero del rango[-16,4]
. Después de eso,$a
establecemos un mínimo de cero usando un ifif($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ícitoWrite-Output
nos da nuevas líneas entre ellas de forma gratuita.Guardado dos bytes usando un
for
bucle en lugar de unwhile
bucle.Ahorró dos bytes moviéndose
$b
a su propia sección.Ahorró dos bytes gracias a Adrian Blackburn.
fuente
JavaScript (Node.js) , 127 bytes
Pruébalo en línea!
Explicacion:
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.
fuente
0+
eliminado? Parece que se requiere salida.05AB1E , 59 bytes
Pruébalo en línea!
fuente
Python 2 , 151 bytes
Buen truco
j=i+max(-i,randint(-16,4))
de Jo King, explotar la distribución desigual permitidaPar de bytes guardados gracias a Mnemonic
Pruébalo en línea!
fuente
j=max(0,i+randint(-16,4))
.Carbón , 81 bytes
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.
Guarde la cadena comprimida "% d errores en el código \ n".
Repita mientras haya un número positivo de errores restantes.
Imprima el número de errores en el código dos veces.
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.
fuente
JavaScript,
189176168162 bytesPruébalo en línea!
Gracias por Muhammad Salman por el
console.log
reemplazo faltante , y por Oliver por la mejora de la prueba xGracias por l4m2 por jugar al golf por 8 bytes
fuente
x<=0?console.log("\n"+0+a):f(x)
al final.f
declaración. Votado abajo hasta actualizado para arreglar eso. (También mi enlace necesita una actualización también)f
, lo cual no puede suponer.Python 3 ,
156138 bytesGracias a la respuesta de Jonathan Python 2 por el
id
trucoPruébalo en línea!
Explicación:
fuente
Octava ,
149148 bytesSe guardó un byte cambiando
randi(21)
y%i
hacia21*rand
y%.f
.%.f
garantiza 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.
Pruébalo en línea!
Explicación:
Usar en
p((x+=21*rand-17)*(x>0)
lugar demax
guardar un byte, pero la última línea sale en-0 bugs ...
lugar de0 bugs
. Funciona conrandi(21)-17
, pero luego tiene la misma longitud que la anterior. Pruébalo en línea!fuente
COBOL (GnuCOBOL),
317294279270 bytesPruébalo en línea!
Sin golf
Nota: la última oración todavía se imprime, porque COBOL ejecuta todo el programa, y después del
perform until
ciclo "cae" la etiqueta a , ejecutando sus declaraciones. Este comportamiento es similar a unswitch case
sinbreak
.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.
fuente
-=
ini-=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.VBA:
212163 bytesEsta 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.
While/Wend
lugar deFor/Next
guardar algunos caracteres.GoSub
y las líneasExit Sub
yReturn
necesarias 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
vbLF
a la cadena de salida, porDebug.Print
lo que no era necesario llamarlo con tanta frecuencia. Felicitaciones a EricF .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).fuente
c
c>0
c=Iif(c<0,0,c)
If c<0 [...]
LaTeX ,
368304293287245240 bytesSi 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.
Más legible:
Mejoras (por edición):
\if
cláusula para el\repeat
como\else
\value{b}=x
funciona para la inicialización pero no en el bucle (en lugar de\setcounter{b}{x}
)\relax
deberí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~
.fuente
\ifnum\value{b}<1
más que<0
?C,
169165 bytes¡Gracias a @ceilingcat por guardar cuatro bytes!
Pruébalo en línea!
fuente
SAS, 210 bytes
Sin golf:
Puede guardar algunos bytes si se permiten advertencias en el registro (poner
&a
en la&b
variable macro, pero eso genera una advertencia inicial).fuente
PHP, 126 bytes
Ejecutar en la línea de comando, usando
php -r 'code here'
:fuente
ABAP , 295 bytes
... porque por qué diablos no!
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:
Gracias por el reto!
A mi jefe: ¡Por favor no me despidan, solo me estoy educando!
fuente
Limpio ,
245234 bytesPruébalo en línea!
fuente
C #,
184181 bytes¡Mi primera respuesta de Code Golf!
(Basado en la respuesta Java de @Kevin Cruijssen)
Pruébalo en línea!
fuente
C (gcc) ,
141137 bytesUsé macros de preprocesador para una gran justicia (advertencia: Tropos de TV)
Pruébalo en línea!
fuente
T-SQL, 188 bytes
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 porCAST
oCONVERT
.fuente
JavaScript, 138 bytes
Mostrar fragmento de código
fuente
QB64 , 134 bytes
De mi hermano
fuente
Pyth ,
9492 bytesPruébalo en línea
Versión anterior: 94 bytes
fuente
Jalea , 61 bytes
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?
fuente
Perl, 132 bytes
fuente
VBA:
225233 bytes{EDITAR} Se agregaron los que faltan
rnd()*
Notas: Se
utiliza
GoSub
para imprimir la línea triplicada, porque es un poco más corta que asignar la línea a una variable yDebug.Print
ponerla.Debug.Print
sin ningún argumento imprime una línea vacía (no es necesario un nulo o una cadena vacía) UnaWorksheetFunction.Max
línea sería demasiado larga, por lo que utilicé un "si es menor que" para evitar negativos.Con sangría y comentarios
fuente
rnd() *
allí: creo que estaba ocupado contando si se trataba de menos caracteresDim c%
(es decir, "c es un número entero") y soltar elInt()
Python 2 ,
138134133131127bytes-1 Gracias a Jo King (reorganizar para usar la lógica en
bugs-=min(bugs,randomNumber)
lugar debugs=max(0,bugs-randomNumber)
). Esto permitió el forzar-salir usando un error de división por cero, ¡ahorrando otros 6 bytes!Pruébalo en línea!
fuente
Rubí: 149 bytes
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.
fuente
\n
(no\r
).Zsh , 133 bytes
Pruébalo en línea!
Esto aprovecha algunas características de zsh.
while list; do list; done
se puede escribir comowhile list {list}
printf
es numérico, el argumento correspondiente se evalúa como una expresión aritmética. Entonces:n
gratuita sin utilizar un$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
se evalúa nuevamente sin tener que usar$((...))
,$[...]
o similar. los>
y?
tuvo que ser escapado.printf $b
final evalúa un argumento vacío como 0 para%d
.$b
ningún lado.$b$b"Take..."
lugar de"$b${b}Take..."
.\n
y enfor((n=99;n;))
lugar den=99;while ((n))
.fuente