Muy inspirado en este desafío Code Golf: tu propia serpiente ASCII mascota : pensé que hacerlo horizontal agregaría una capa adicional de complejidad.
Un ejemplo de serpiente horizontal:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Y las reglas son:
- Se imprimen exactamente 5 líneas de caracteres
- Cada línea tiene exactamente 30 caracteres, que consiste en una combinación de espacios y el personaje con el que eliges dibujar tu serpiente
- Tu serpiente comienza en la línea 3
- La siguiente línea que se utilizará para dibujar su serpiente debe elegirse al azar de su línea actual, una línea arriba (si aún no está en la línea 1) o una línea debajo (si aún no está en la línea 5).
- Estas elecciones deben ser igualmente ponderadas. Entonces, si está en la línea 1, tiene un 50% de posibilidades de permanecer en la línea 1 y un 50% de posibilidades de pasar a la línea 2. Si está en la línea 2, tiene un 33% de posibilidades de pasar a la línea 1, un 33% de posibilidades de permanecer en la línea 2 o 33% de posibilidades de pasar a la línea 3
- Su serpiente no necesita visitar cada línea.
Respuestas:
JavaScript (ES6), 98 bytes
Guardado 7 bytes gracias a @KevinCruijssen
Devuelve una matriz de 5 cadenas.
Pruébalo en línea!
Comentado
fuente
d
y usar((y%4?3:2)|0)-(y>0)
para -6 bytes. Pruébalo en línea.1
denew Random(...)
está implícito por defecto, por supuesto, .. Pruébelo en línea.!!y
lugar de(y>0)
guardar 2 bytes más).Carbón , 28 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Imprima un poco de relleno para forzar 5 líneas de salida.
Repite 30 veces.
Imprima un cero (y muévalo horizontalmente).
Si la coordenada Y es 2, suba aleatoriamente por 0 o 1.
Si es -2, muévase hacia abajo al azar por 0 o 1.
De lo contrario, muévase hacia abajo aleatoriamente por -1, 0 o 1.
fuente
Perl, 68 bytes
Esto no se siente óptimo en absoluto.
fuente
Jalea , 24 bytes
Pruébalo en línea!
Explicación
fuente
R , 138 bytes
Pruébalo en línea!
Fácilmente superado por plannapus
fuente
Python 3, 144 bytes
@Ruts, @Turksarama y @mypetlion han sido muy útiles para reducir bytes
Intentaremos mejorar esto. Desafío divertido!
fuente
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
al+=random.randint(~-(l<1),l<4)
para guardar 31 bytes.m=[[' 'for x in R(w)]for y in R(h)]
am=[list(' '*w)for y in R(h)]
para guardar 7 bytes.boolean
una subclase deint
. PorFalse
lo tanto, se puede usar en lugar de0
y seTrue
puede reemplazar1
. El~
es un operador unario para bit a bitnot
y el-
operador voltea el signo (multiplicado por-1
). Entonces~-(False)
evalúa-1
y~-(True)
evalúa a 0.m[2][0]=0
desapareció) y 2 bytes en el bucle for (sefor i in R(1,30):
conviertefor i in R(30):
). También deberá volver a calcular l después de establecer el 0. Esto debería llevarlo a 144 bytes.R ,
120114 bytes¡Gracias a @Giuseppe por los 6 bytes adicionales!
Utiliza una tabla de probabilidades de la siguiente manera:
donde cada columna corresponde a un caso, es decir, la columna 1 se elige si la serpiente está en la fila 1, dando las probabilidades 0, 1/2 y 1/2 para elegir respectivamente -1 [bajar], 0 [quedarse quieto] y 1 [ subir] (
sample
normaliza automáticamente las probabilidades a 1), la columna 2 para la fila 2 da las probabilidades 1/3, 1/3 y 1/3, etc.Pruébalo en línea!
fuente
SOGL V0.12 ,
2221 bytesPruébalo aquí!
Explicación:
fuente
Japt,
3129 bytesDevuelve una matriz de líneas.
Pruébalo
fuente
Japt , 26 bytes
¡Pruébalo en línea!
fuente
Python 2 , 127 bytes
Pruébalo en línea!
fuente
Octava con paquete de estadísticas, 99 bytes
También funciona en MATLAB con Statistics Toolbox.
Pruébalo en línea!
fuente
Japt , 28 bytes
Guardado 9 bytes gracias a ETHproductions
Pruébalo en línea!
fuente
SmileBASIC,
10710510389 bytesEsta respuesta es más interesante que la vertical debido a los casos límite (literales).
64 bytes, sin espacios de impresión:
También encontré algunas variaciones de la línea 2 con la misma longitud:
La división entera de Y / 3 se usa para verificar si Y está fuera del rango válido, así como para obtener el signo.
fuente
Java 8,
177170 bytes-7 bytes gracias a @ OlivierGrégoire .
Explicación:
Pruébalo en línea.
fuente
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
para guardar unos pocos bytes.C (gcc) ,
134130 bytesPruébalo en línea!
fuente
Python 3 , 123 bytes
Pruébalo en línea!
Genere una matriz de enteros, luego conviértalo a cada fila.
Python 2 , 120 bytes
Pruébalo en línea!
Para Py2, los pares redundantes para
exec
yprint
se pueden eliminar, pero la sintaxis en la segunda línea no es válida.Superando tanto el envío de Py2 por Rod como el envío de Py3 por linemade .
fuente
Ruby ,
9877 bytesPruébalo en línea!
Una lambda que devuelve una serie de cadenas.
Mi impulso inicial fue generar las columnas y transponerlas, pero es mucho más fácil evitar ese paso.
Me hubiera gustado comenzar
a
con[" "*30]*5
, pero eso haría copias superficiales de las cadenas, lo que resultaría en una serpiente muy gruesa y no resbaladiza.Podría haber usado una constanteD
como el incremento (para el mismo conteo de bytes), pero Ruby se habría quejado cada vez que lo asignaba. Decidí que prefiero disminuir la legibilidad al reutilizari
mid-loop que tener un montón de advertencias de depuración para ignorar.También me hubiera gustado guardar algunos bytes conloop{x+=rand(3)-1;(0..4)===x&&break}
, pero eso habría causado un sesgo en los bordes: 1/3 de posibilidad de volver hacia adentro, 1/3 de posibilidad de quedarse y 1/3 de posibilidad de salir de los límites para un tiempo antes de volver al azar al azar (es decir, "quedarse").-20 bytes: use Ruby
Integer#[]
para crear condicionales pequeños, asegurando ponderaciones de movimiento correctas para las 5 posiciones. Esto reemplaza un patrón de ruptura de bucle (con una probabilidad distinta de cero de no detenerse) por un gran ahorro. Gracias Eric Duminil !-1 byte: Inicialice
a
con en(0..4).map
lugar de5.times
, gracias de nuevo a Eric Duminil .fuente
loop
. Puede calcular el incremento conrand(2+14[x])-30[x]
orand -(30[x])..15[x]
. Probablemente hay una versión más corta. Aún así, -20 bytes no está mal! Pruébalo en línea!x,a=2,(0..4).map{" "*30}
. Pruébalo en línea!30[x]
es un gran truco! ¡Gracias!Perl 6 , 85 bytes
Pruébalo en línea!
La expresión larga entre paréntesis es una secuencia perezosa generada a partir del elemento inicial
(' ', ' ', 0, ' ', ' ')
, la primera franja vertical de la salida. Cada tira / lista sucesiva se genera a partir de la anterior llamando a surotate
método, con el desplazamiento elegido aleatoriamente de un conjunto que contiene0
,1
(si el primer elemento es distinto de cero) y-1
(si el quinto elemento es distinto de cero).La matriz de tiras horizontales se transpone con el
[Z]
operador, convirtiéndola en una lista de tiras verticales, cada una de las cuales sejoin
edita en una sola cadena y se genera consay
.fuente
Scala, 207 Bytes
muestra:
degolfado:
Mi invento único: bueno, hasta ahora no he leído las otras soluciones, es generar un Random (6) que implícitamente son dos Randoms (2 * 3). Si está lejos del borde, uso los valores de r / 2 (0,1,2) y → (-1,0,1) dime, para subir o bajar. Si en la frontera, puedo evitar la costosa llamada del personaje de otro azar, y simplemente tomar el módulo (2), para decidir, si me quedo o si me voy.
Veamos las otras soluciones. :)
fuente
java
?try it
enlace? Kevin Cruijssen no incluyó algunas repeticiones, necesarias para compilar este código o ejecutarlo en JShell, pero supongo que eso está de acuerdo con las pautas: podría haber una meta discusión. Si lo desea, puede intentar reducir este código, utilizando también una matriz de dos dim. Una segunda idea es reducir el código deslizante al final. ¿Algún método de mapa? La impresión está oculta por Kevin. - Sí, Array ofrece una mejora de 8.Perl,
83101 bytesNuevo: Sin problema de probabilidad en las fronteras:
Sin golf:
fuente
PowerShell , 133 bytes
Pruébalo en línea!
Construye una matriz 2D de 30 espacios de ancho por 5 líneas de alto. (Nota: si alguien puede encontrar una forma mejor y efectiva de inicializar esta matriz, te <3 para siempre.) Establece la variable auxiliar
$l
en2
(esto se usa para qué línea estaba el segmento de serpiente anterior). Luego recorre de0
a29
.En cada iteración, establecemos nuestro elemento serpiente en
0
. Luego indexamos en una matriz complicadaGet-Random
que selecciona si subimos o bajamos o nos mantenemos igual. Eso se agrega de nuevo a$l
.Finalmente, recorremos los cinco elementos
$a
y-join
sus elementos internos en una sola cadena cada uno. Esas cinco cadenas quedan en la tubería, y lo implícitoWrite-Output
nos da nuevas líneas de forma gratuita.fuente
Clojure, 123 bytes
Aquí vienen los parens:
Versión sin golf:
Construye una lista de las diferentes alturas del cuerpo de la serpiente, luego itera de 0 a 4. Cada vez que una altura coincide con la fila actual, imprime un 0, de lo contrario, un espacio en blanco. No dejar que las alturas excedan el límite realmente cuesta bytes. También reconocer cuándo una nueva línea está en orden requiere más byte como debería ser. Uno podría escribir fácilmente un sencillo
doseq
, haciendo un producto cartesiano de las X e Y, pero no se sabe cuándo imprimir una nueva línea.fuente
Python3 + numpy,
137132 bytesNo es la presentación de Python más corta, no es la más larga y definitivamente no es la más rápida.
actualizar El uso
numpy
del comando diff ahorró 5 bytes para probar si la serpiente es un patrón válido, en comparación con el cálculo manual de la diferenciaj[1:]-j[:-1]
.fuente
C (gcc),
80767271 bytesPruébalo en línea!
fuente
f(r)
lugar der;f()
R , 95 bytes
La siguiente línea
x
siempre se elige entre las líneas que no están a más de 1 de la línea actual (l[abs(x-l)<2]
). El uso enreplicate
lugar de unfor
ciclo ahorra algunos bytes necesarios para la inicialización y manipulación de la matriz y requiere el uso del<<-
operador al asignar a la variable globalx
.Pruébalo en línea!
fuente
05AB1E , 25 bytes
Pruébalo en línea!
Explicación
fuente