Considera esta espiral
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
Comenzando en el centro:
- La primera línea (hacia arriba) tiene 3 caracteres.
- La segunda línea tiene el mismo número de caracteres (3)
- A continuación, agregamos dos caracteres (5) para los siguientes dos lados.
- Este patrón continúa, dos lados de la misma longitud y luego aumentan la longitud en 2.
Quiero generar esta espiral para N líneas.
- Escribe en cualquier idioma.
- La entrada / argumento, etc. es el número de líneas en su espiral.
- Cada línea comienza con el carácter final de la línea anterior en la dirección de 90 grados en el sentido de las agujas del reloj de la línea anterior.
- No me importa cuánto espacio en blanco hay antes o después de cada línea, siempre que los elementos de la espiral se alineen.
- Imprima texto para dibujar la espiral con cualquier carácter que no sea un espacio en blanco que elija.
- Intente hacer esto en el menor número de bytes.
Casos de prueba (usando un hash como salida):
N = 1
#
#
#
N = 2
###
#
#
N = 3
###
# #
# #
#
#
N = 10
###########
#
# #######
# # #
# # ### #
# # # # #
# # # # #
# # # #
# ##### #
# #
#########
*
lugar de#
. ¿Esperado?Respuestas:
05AB1E ,
1311 bytesCódigo:
Gracias a Emigna por guardar dos bytes!
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación
La longitud de cada borde individual en la espiral comienza con la longitud 3 y aumenta gradualmente cada dos pasos en dos:
Esto básicamente nos da la lista deseada de longitudes.
El lienzo funciona como una función que muestra tres parámetros (donde el parámetro más a la derecha aparece primero): <longitud (s)> , <char (s)> , <dirección (s)> . El parámetro de direcciones es en este caso una lista de números. Los números que corresponden a las direcciones son:
En este caso, [0, 2, 4, 6] corresponde a la lista de instrucciones
[↑, →, ↓, ←]
. El lienzo itera sobre cada longitud recuperada de la lista de longitudes, usa el carácter '#' e itera cíclicamente sobre la lista de direcciones.fuente
0246S
=3Ý·
Python 2 ,
176170165161157 bytesPruébalo en línea!
Repetidamente: utiliza
g
para rotar lan
iteración de la espiral en una posición 'canónica' (similar a N = 3 o N = 7), agrega un nuevo segmento agregando 2 espacios a la izquierda de cada fila existente, y luego reemplaza la última fila con todos los'#'
s (lo que da como resultado una posición comparable a N = 4 o N = 8), y finalmente usarg
nuevamente para rotarlo de nuevo a la posición correcta. Enjabonar, enjuagar, repetir.fuente
Carbón ,
161514 bytes-2 bytes gracias a @Neil .
Pruébelo en línea (detallado) o Pruébelo en línea (puro) .
Explicación:
La dirección de impresión está a la derecha por defecto, y queremos comenzar hacia arriba, por lo que comenzamos girando 45 grados en sentido antihorario:
Luego haga un bucle
i
en el rango[0, input)
:Imprima una nueva línea para imitar el efecto de retroceder una posición:
Imprimir "#"
x
cantidad de veces en la dirección actual:Donde
x
es3 + i // 2 * 2
:Y luego gire 45 grados en el sentido de las agujas del reloj para la siguiente iteración del bucle:
fuente
⊗÷ι²
es un byte más corto que⁻ι﹪ι²
. Además, puede obtener el efecto de retroceder imprimiendo un\n
antes del#
s, lo que le permitirá eliminar el»#
para guardar un byte general adicional.⊗÷ι²
, pero ¿cuáles serían los cambios para imprimir un\n
antes del#
s? La espiral es incorrecta si agrego elPrint("\n")
.#
largos.Pitón 2 ,
179178 bytesgracias a Kevin Cruijssen por -1 byte.
Pruébalo en línea!
Python 2 , 179 bytes
En este enfoque, se usan fórmulas para
x
yy
deltas en lugar de una lista de búsqueda.Pruébalo en línea!
fuente
n+1+n%2
an%2-~n
para -1 byte. Y necesito recordar0--n/4*2
ser 1 más bajo que-(-n/4*2)
. Buena respuesta, +1 de mi parte.JavaScript (ES6), 185 bytes
Claro que esto se puede jugar más, tal vez con curry, pero aquí está mi intento muy humilde. Se agregaron saltos de línea para facilitar la lectura, excepto el penúltimo carácter.
Uso:
d(10)
devuelve una cadena según el ejemplo de desafío N = 10.Define una función
r(a,n)
para rotar una matriza
porn
turnos; una funcións(n)
para generar una matriz bidimensional que representa una espiral de tamañon
mediante la rotación recursiva y la adición de espacios y líneas (no girado de nuevo a la posición inicial); y una funciónd(n)
para dibujar una espiral de tamañon
, rotar consistentemente según el desafío, y representar como una cadena devuelta.Este fue un desafío muy divertido: ¬)
fuente