Entonces, escribí una línea que imprimía una serpiente en la consola. Es un poco divertido, y me preguntaba cómo podría condensar mi código ...
Aquí hay una salida de ejemplo (corta):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Aquí están las especificaciones:
- En cada línea, se imprime un único carácter que no sea un espacio en blanco (lo que desee) en la consola, inicialmente con 29 a 31 espacios de relleno a la izquierda de la misma.
- Cada iteración, se toma una decisión aleatoria entre estas tres acciones
- La cantidad de relleno disminuye en 1
- La cantidad de relleno sigue siendo la misma.
- La cantidad de relleno aumenta en 1
Haga esto 30 veces, para imprimir una serpiente de 30 segmentos en la consola.
La respuesta más corta en bytes gana.
Respuestas:
05AB1E ,
1514 bytesPruébalo en línea!
Usos
0
.Explicación
fuente
Random Brainfuck ,
123 122121 bytesPruébalo en línea!
Brainfuck aleatorio es una extensión de brainfuck, con la útil adición del
?
comando, que establece la celda actual en un byte aleatorio. Esto imprime una serpiente hecha de!
s, que se parece más a los pasos que a una serpiente curiosamente.Cómo funciona:
Otra solución que se adhiere a la letra de la pregunta, en lugar del espíritu.
87 bytes
Pruébalo en línea!
Este está muy sesgado para dejar el relleno solo, pero aumentar o disminuir el relleno es igualmente posible. Cada uno tiene un poco menos de 1 en 256 posibilidades de suceder.
fuente
?
comando. +1?
solo está disponible en Random Brainfuck , no en brainfuck clásicoC (gcc) ,
615856 bytesRespuesta editada para reflejar cambios en las reglas ...
Pruébalo en línea!
fuente
s+=1-rand()%3
a la función printf.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Retina , 24 bytes
Pruébalo en línea!
Explicación
Inicialice la cadena de trabajo a la primera línea, es decir, 30 espacios y a
+
.Hay un espacio en la segunda línea.
-29{
envuelve el resto del programa en un bucle, que se ejecuta 29 veces.¶<
imprime la cadena de trabajo al comienzo de cada iteración de bucle con un salto de línea final. La etapa atómica en sí misma inserta un espacio al comienzo de la cadena (la idea básica es insertar un espacio y luego eliminar aleatoriamente 0–2 espacios, porque es un byte más corto que elegir aleatoriamente entre eliminar, insertar y no operar).Esto coincide con la expresión regular vacía contra la entrada, lo que nos da cada posición entre los caracteres (y el inicio y el final de la cadena). Luego
,2
mantiene solo los primeros tres partidos, es decir, los partidos después de cero, uno y dos espacios.@
selecciona uno aleatorio de esos tres partidos. Luego, la etapa dividida (S
) divide la entrada alrededor de esa coincidencia. Y1
le dice que mantenga solo la segunda parte de la división. En otras palabras, descartamos todo hasta nuestra coincidencia aleatoria.La línea 30, que es el resultado de la iteración final del bucle, se imprime implícitamente al final del programa.
fuente
VBA,
605949 bytesPégalo en la ventana Inmediato y presiona enter. (¡Asegúrese de que la declaración explícita esté desactivada!)
Es mucho más probable que se mueva que permanecer en una línea (es decir, las acciones no tienen la misma ponderación), pero ese no era un requisito específico (¡Afortunadamente!)
{EDITAR} Guardado 1 byte eliminando el espacio entre
=1
yTo
{EDIT2} Guardado 10 bytes gracias al comentario de remoel
Versiones antiguas:
fuente
String(i," ")
paraSpc(30+i)
luego eliminarlosi=30:
. O -1 byte eliminando&
. :)C # (.NET Core),
1121101061009998 bytes-1 byte gracias a @raznagul .
-1 byte gracias a @auhmaan .
Explicación:
Pruébalo en línea.
fuente
new Random().Next()
varias veces localmente (.net Framework Versión 4.6.1) siempre obtengo el mismo resultado. Necesito agregar unThread.Sleep(10)
entre llamadas para obtener resultados diferentes de manera confiable. Con un tiempo de sueño de menos de 10 ms, a veces todavía obtengo el mismo resultado. Entonces .net-Framework y TIO (.net-Core) tienen diferentes PRNG o al menos usan diferentes semillas. Si cambio su programa en TIO a C # -mono, obtengo el mismo comportamiento que localmente en .net-Framework.new Random()
usa el tiempo como semilla, por lo que en un ciclo cerrado el tiempo es el mismo y el resultado es el mismo.Thread.Sleep(10)
obtener resultados diferentes de manera confiable eThread.Sleep(1)
incluso 9 ms no es suficiente.C, 56 bytes
Pruébalo en línea!
Explicación:
C (gcc) , 55 bytes
Depende de que f "devuelva" el valor asignado a n en la función, que es un comportamiento indefinido, pero funciona de manera coherente con gcc cuando no se habilitan optimizaciones.
Pruébalo en línea!
fuente
JavaScript (ES8),
636260 bytesIncluye una nueva línea final.
*2-1
podría reemplazarse-.5
por un ahorro de 1 byte, pero las posibilidades de que cada línea tenga la misma longitud que la línea anterior aumentaría considerablemente. Por supuesto, como "aleatorio" no está definido en el desafío, el RNG podría ser reemplazado pornew Date%3-1
por un recuento total de bytes de 55 .Ahorré un byte gracias a alguien que eliminó su comentario antes de que pudiera captar el nombre. En realidad lo intenté de esta manera
repeat
ypadStart
no pensé en intentarlopadEnd
, ¡no sé por qué!Mostrar fragmento de código
Prima
Para el mismo número de bytes, aquí hay una versión que toma el número de espacios e iteraciones iniciales como entrada.
Mostrar fragmento de código
fuente
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``
es un byte más corto. (Nota: dado que SO no permite saltos de línea en los comentarios, tuve que escribir \ n en lugar de usar un salto de línea).y=31
, habría una posibilidad de que la primera línea sea demasiado corta. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 bytesPrimero golf, estoy seguro de que podría ser mucho mejor ...
Editar: se corrigió la primera línea gracias a Steadybox .
Pruébalo en línea!
fuente
Python 2 ,
836564 bytesEnfoque directo:
Pruébalo en línea!
¡Gracias a @Rod por guardar algunos bytes! ¡Gracias a @ovs por -1 byte!
Editar: cambió el nombre de la variable y la cadena de salida a la letra 's'
Más salida tipo serpiente para 88 bytes:
fuente
APL (Dyalog) , 20 bytes
1 byte guardado gracias a ngn
Pruébalo en línea!
fuente
¯2+
--->2-
Carbón , 14 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Sería de solo 10 bytes si no hubiera un requisito de sangría inicial.
fuente
PHP, 61 bytes
Pruébalo en línea!
fuente
$i<30;$i++
puede ser$i++<30;
para guardar 2 bytes.for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');
(\n
se cuenta como 1 carácter, y debe reemplazarse por una nueva línea real)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Java 8,
131129127126119108101 bytesExplicación:
Pruébalo en línea.
Antigua respuesta de 119 bytes:
Explicación:
Pruébalo en línea.
fuente
R ,
726967 bytesGracias a Zahiro Mor por 2 bytes adicionales!
Pruébalo en línea!
fuente
sample(3,29,T)-2
arunif(29,-1,1)
reducirá el número de bytes en 2, pero los movimientos ya no son igualmente probables. ¿Y también podría cambiar a enpaste("%"
lugar depaste0("% "
o me estoy perdiendo algo aquí?% 30 s
lugar de% 30s
. Como dijisterunif
, arruinaría las probabilidades.sprintf("%30s")
,sprintf("% 30s")
ysprintf("% 30 s")
devuelve los mismos resultados para mí. Pero en TIO solo los dos primeros tienen resultados idénticos, por lo quepaste0("%"
deberían guardar un byte. Y no hay requisito de que cada movimiento tenga la misma probabilidad.Japt , 13 bytes
Devuelve una matriz de líneas.
Pruébalo
Explicación
Prima
Para 2 bytes menos , aquí hay una versión que toma la cantidad de espacios e iteraciones iniciales como entrada.
Intentalo
RNG alternativos
Los últimos 4 bytes se pueden reemplazar con cualquiera de los siguientes:
fuente
-1
el RNG devuelve la primera iteración, terminaremos con una longitud de línea total de29
cuándo debería ser30
,31
o32
.30
y luego agregamos-1
,0
o1
dándonos29
,30
o31
- agregamos el"
y eso nos da una longitud total de30
,31
o32
para la primera línea.Swift , 101 bytes
Explicación
Un programa completo Esto usa un truco bastante extraño:
arc4random()
es miembro delDarwin
módulo, peroUIKit
también viene con esta función instalada, por lo que guarda un byte :) También usa uno de mis consejos de golf Swift para repetir cadenas un número arbitrario de veces.fuente
for _ in 0 ... g
ejecuta el bloque de código 29 veces ahora en lugar de 30 (bucle de 0 a 29 (exclusivo))?0...g
genera todos los enteros en [0; g] . Mi mal, arregló la explicación.0..<g
generaría los enteros en [0; g) : P[0; g)
que has editado[0; g]
realmente me confundió. :) Hmm, pero ¿no es posible comenzarg=30
y recorrer[1; g]
en ese caso?[0; g)
o[1; g]
definitivamente sería posible si elijo en sug=30
lugar, pero luegoprint(...,0)
debe cambiarse aprint(...+"0")
, porque de lo contrario se agregaría un espacio adicional (extraño) antes del 0. De cualquier manera, el recuento de bytes sigue siendo el mismo.Perl, 36 bytes
fuente
say
para restar. ¿Estoy en lo cierto al pensar que no cambia el número de ejecuciones cuando$#a
se incrementa porque no es una referencia?map
que parece primero diseñar los elementos en la pila.for
no tiene y habría tenido una longitud de bucle impredecibleperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'
, pero eso a veces (no siempre) resultó en un fallo de segmentación. ¿Podría ser un error en perl v5.22.1 y v5.16.3?R
5453 bytesIdea similar a la anterior , pero con
sprintf
código acortado y una cadena de caracteres literal más corta. En lugar de\n
(dos bytes) estoy usando un salto de línea literal (un byte).Try it online!
fuente
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number.
Lo he estado usandosprintf
durante años y de alguna manera siempre me perdí esa parte ... ¡Gracias por el recordatorio!Ruby ,
4539 bytesPruébalo en línea!
La modificación
x
durante el ciclo no afecta al contador del ciclo. Elegí S como un personaje de salida particularmente parecido a una serpiente.-6 bytes: uso en
rand(3)-1
lugar de[-1,0,1].sample
. Gracias Eric Duminil !fuente
x.map
lugar dex.times
(equivalente ya que no utiliza el valor de retorno)rand -1..1
es cinco bytes más corto que[-1,0,1].sample
rand(3)-1
por 6 bytes menos.(x=30).times{puts' '*x+?+;x+=rand(3)-1}
(mismo tamaño) imprimirá exactamente 30 espacios para la cabeza de la serpiente según lo solicitado por el desafíoSenseTalk ,
237198 BytesEste es un lenguaje que llegué a conocer y amar hace una década. Es el lenguaje de secuencias de comandos que impulsa la herramienta de prueba automatizada Eggplant Functional . Fui un ávido usuario de la herramienta durante muchos años antes de unirme a la empresa por un tiempo. No es el idioma más apto para el golf, pero me resulta muy divertido escribirlo. Jugar al golf en realidad es bastante desafiante, ya que el idioma debe ser detallado y similar al inglés ... me llevó bastante tiempo entenderlo. a 237 bytes.
Ungolfed / Explicación
Editar: Guardado 36 bytes gracias a @mustachemoses
fuente
J , 23 bytes
Pruébalo en línea!
fuente
PowerShell , 42 bytes
Pruébalo en línea!
Bucles de
1
a$l=30
. En cada iteración, colocamos$l
espacios más unx
en la tubería como una cadena, luego,+=
ya sea en-1, 0, 1
baseGet-Random
al$l
siguiente ciclo. Esas cadenas se recopilan de la tubería y un implícitoWrite-Output
nos da una lista separada por una nueva línea de forma gratuita.fuente
Bash, 53
Pruébalo en línea .
fuente
p+=RANDOM%3-1
también funcionaJalea , 18 bytes
Pruébalo en línea!
El personaje elegido es 0 . Si se permite devolver una lista de la lista de caracteres, entonces el
Y
puede descartar y el envío se puede convertir en una cadena niládica de 17 bytes . Alternativa .Cómo funciona
Jalea , 16 bytes
Combinando las soluciones mías, de Erik y Jonathan, podemos reducir esto a 16 bytes. El personaje elegido es 1 .
Pruébalo en línea!
Gracias a Jonathan Allan por el heads-up (encendido
Ṭ€o⁶
).fuente
Ṭ€o⁶
en lugar de⁶ẋ;€0
mi 18 byter y bajar a 17.Octava ,
53 51 5049 bytesPruébalo en línea!
Guardado 1 byte al no hacer más bucles. Salvó a otro como Octave
printf
tambiénfprintf
.Este nuevo código crea una matriz de 30 enteros aleatorios en el rango
-1:1
. Luego suma acumulativamente la matriz y agrega 30, lo que da la secuencia deseada.El resultado se imprime
fprintf
con un formato que dice "Un número decimal, rellenado con un ancho especificado, seguido de una nueva línea. El ancho será el primer valor ingresado y el número decimal será el segundo valor ingresado. Si el número de entrada de valores es más que esto, Octave seguirá repitiendo la impresión automáticamente para obtener la salida deseada.Para lograr el bucle, entonces, solo necesitamos intercalar ceros entre la matriz de secuencia para que la
fprintf
función use cada valor en la secuencia como un ancho, y cada cero como el dígito a imprimir.Imprime una salida como:
El código anterior no siempre imprime exactamente 30 espacios en la primera línea. Será 29, 30 o 31. Para corregir eso, usaría esta versión de 53 bytes:
fuente
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua
8175 bytesEn
for i=1,n ...
el to_expn
se evalúa sólo una vez antes de entrar en el bucle, el ahorro de un byte.-6 gracias a @ user202729
Pruébalo en línea!
fuente
Python 3.6 ,
847369 bytesGracias a @WheatWizard por -11 bytes. Gracias a @JoKing por -4 bytes.
fuente
i
, puedes usarlofor i in[1]*30
para guardar bytes.from random import*
puedes hacerlo para no necesitarrandom.
más tarde. Y puede eliminar el espacio de nueva línea después de su:
.30
a29
la"+".rjust(x)
puede ser reemplazado con" "*x+"+"
.[1]*30
a[1]*x
porque es un byte más corto.ES5,
979581 bytesES5,
11298 bytes si se necesita el formato de función:fuente
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
conjoin` `
Rojo , 54 bytes
Pruébalo en línea!
fuente