Introducción
Este es uno es bastante sencillo. Dibujaremos una serpiente en ascii. Esto se inspiró en ese viejo juego de serpientes donde tienes que recolectar la fruta y crecer continuamente.
Definición
Dado un número entero positivo N que representa la longitud de la serpiente, dibuja una serpiente para que tenga un cuerpo de n más una cabeza y una cola.
Partes:
- cabeza:
<, >, ^, v
- cola:
@
- vertical:
|
- horizontal
-
Todas las esquinas deben estar satisfechas con a \
o /
respectivamente. A menos que la cabeza termine en una esquina, en cuyo caso la cabeza <, >, ^, v
tiene prioridad en la dirección de la serpiente. es decir, para el ejemplo de longitud 1, se gira en sentido antihorario y, por lo tanto, la cabeza se gira de esa manera. Para una solución en el sentido de las agujas del reloj, estaría a la derecha >
.
La serpiente debe comenzar en el medio con su cola, pero puede ir hacia afuera en cualquier dirección que elija, ya sea en sentido horario o antihorario. También debe envolverse firmemente alrededor de sí mismo a medida que se expande hacia afuera de manera circular.
Ejemplo
/--\
|/\|
||@|
|\-/
\--->
Donde @
está la cola y la posición inicial. Como se ve arriba, la cola comienza en el medio, sube hacia la izquierda en una rotación hacia la izquierda.
Aquí la longitud es 19
más una cola y una cabeza.
Como otro ejemplo, aquí está la longitud 1
:
<\
@
Victorioso
Este es el código de golf, por lo que la respuesta que se envía con el menor número de bytes gana, con tiempo para ser utilizado como desempate.
¡Que te diviertas!
@---->
. Probablemente intente condiciones más estrictas sobre la forma de la serpiente. También aclare cuánto espacio en blanco está permitido o no@
es el medio (posible agregar algunos espacios para que sea así), declarar "a la derecha" como la dirección y hacer que la cabeza apunte hacia abajo y declarar eso en el sentido de las agujas del reloj. Sus términos pueden parecerle claros, pero en realidad son ambiguos. Me doy cuenta de que probablemente te refieres a una serpiente enrollada lo más apretada posible, pero debes dejar eso claroRespuestas:
MATL ,
8583 bytesY pensé que tener un
spiral
builtin sería un código corto ...Pruébalo en línea!
Explicación
Deje N denotar la entrada. Crearemos un vector de longitud
ceil(sqrt(N+2))^2
, es decir, el cuadrado perfecto más pequeño que sea igual o superior a N +2. Este vector se rellenará con valores numéricos, se enrollará en espiral (es por eso que su longitud debe ser un cuadrado perfecto), y luego los valores numéricos serán reemplazados por caracteres.Deje n denotar cada paso comenzando desde 1 en el centro de la espiral. Los pasos donde gira la serpiente están dados por n 2 +1 (es decir: 2, 5, 10, ...) para
\
símbolos yn 2 + n +1 (es decir: 3, 7, 13, ...) para/
. Los pasos entre a\
y a/
deberían ser-
, y aquellos entre a/
y a\
deberían ser|
.El vector se crea de tal manera que contiene
1
en los puntos de giro (2,3,5,7,10,13 ...) y0
en el resto. La paridad de la suma acumulativa indica si cada entrada debe ser a-
o a|
. Sumando 1 a este resultado obtenemos un vector que contiene1
(para|
) o2
(para-
). Pero esto hace que los puntos de giro se conviertan1
o2
también. Entonces, los puntos de giro, cuyas posiciones sabemos, se sobrescriben: las posiciones n 2 +1 se llenan3
y las posiciones n 2 + n +1 se llenan4
. La cola y la cabeza también son casos especiales: el primer elemento del vector (cola) se establece en5
, y el elemento con índice N+2 (cabeza) se establece en6
. Finalmente, los elementos con índices que exceden N +2 se establecen en0
.Tomando la entrada N = 19 como ejemplo, ahora tenemos un vector con longitud 25:
Necesitamos rodar este vector en una espiral. Para esto, utilizamos una función integrada que genera una matriz en espiral, seguida de una reflexión y una transposición para producir:
La indexación del vector con la matriz da
donde
0
corresponde al espacio,1
corresponde a|
,2
a-
,3
a\
,4
a/
,5
a@
y6
a la cabeza.Para saber cuál de los cuatro caracteres
^
,<
,v
, o>
la cabeza debe tener, utilizamos la suma acumulada de los puntos de giro que hemos calculado previamente. Específicamente, el penúltimo valor de esta suma acumulativa (es decir, el valor N + 1-ésimo) módulo 4 nos dice qué carácter debe usarse para la cabeza. Tomamos el penúltimo valor de la suma acumulativa, no el último, debido a la exigencia "si los extremos de la cabeza en una esquina de la cabeza<
,>
,^
,v
tiene prioridad en la dirección está curvado a la serpiente". Para el ejemplo N = 19, la cabeza es>
.Ahora podemos construir una cadena que contiene todos los caracteres de serpientes, incluyendo el carácter apropiado para la cabeza en la sexta posición:
'|-\/@> '
. Luego indexamos esta cadena con la matriz anterior (la indexación se basa en 1 y es modular, por lo que el espacio es el último), lo que dafuente
Python 2,
250233191 bytesrepl.it
Dibuje la serpiente girando la serpiente entera 90º en sentido horario y agregando el segmento inferior, de esta manera la serpiente siempre estará en sentido antihorario.
El nuevo segmento siempre comenzará
\
y tendrá-
cuerpo para los lados pares y/
-
los lados impares. Los tamaños de los segmentos (sin esquinas) son0
,1
,1
,2
,2
,3
... que esfloor(side/2)
.Si el segmento es el último, elimina el exceso de caracteres, agrega la cabeza y completa con espacios.
fuente
'\/'[m]
,'-|'[m]
y'>v'[m]
print
y''.join
JavaScript (ES6), 193
201 203 215 220 224Editar 4 bytes guardados thx @Arnauld
Edit2 cambió la lógica, no almacenando los incrementos actuales para x e y, solo
consíguelos desde la dirección actual Edit3 habiendo guardado algunos bytes, decidí usarlos para una mejor gestión del espacio en blanco
Edit4 8 bytes guardados que no siguen exactamente los ejemplos sobre la dirección de la cabeza, como otras respuestas
La versión actual funciona con Chrome, Firefox y MS Edge
Esta respuesta da un poco de espacio inicial y final (y líneas en blanco).Ligeramente menos golfizado
fuente
(' ')
con` `
y('@')
con`@`
[ Array[1], Array[1] ]
, whileArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 bytes
Versión ES6 para facilitar las pruebas:
fuente
Perl,
111110 bytesIncluye +1 para
-p
Dar tamaño en STDIN
snake.pl
:fuente
Lote, 563 bytes
Explicación: Los casos especiales 1 como el resto del código requieren un ancho de serpiente de al menos dos. Luego, calcula el cuarto de cuadrado más grande (ya sea un cuadrado exacto o un rectángulo 1 más ancho que alto) cuya área es menor que la longitud de la serpiente. La serpiente se enrollará en este rectángulo comenzando en la esquina inferior izquierda y terminando con la cola en el medio, y la longitud restante se ejecutará debajo de la parte inferior del rectángulo. El rectángulo se genera realmente a partir de reemplazos de cadena simples; La mayoría de las veces cada línea se genera a partir de la línea anterior moviendo las diagonales 1 paso, pero obviamente la cola también tiene que ser tratada, y existen pequeñas diferencias dependiendo de si la altura del rectángulo es par o impar.
fuente
Python 2.7, A WHOPPING 1230 bytes
Soy nuevo en Python y Code Golf, pero sentí que tenía que responder a mi propia pregunta y enfurruñarme de vergüenza después del hecho. Sin embargo, ¡es muy divertido trabajar en ello!
https://repl.it/Dpoy
fuente