Mira la siguiente cadena. ¿Ves un patrón?
ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SEMEN BAZYXWV N EO DP CQ BAZYXWVUTSR
Como algunos habrán notado, es básicamente una espiral del alfabeto, donde las distancias entre filas / columnas aumentan gradualmente en 1 espacio / nueva línea.
Definición rigurosa
- Tengamos un contador c , que inicialmente es 0.
- Escribimos la primera c + 1 letras del alfabeto, de izquierda a derecha:
A
. Entonces, de arriba a abajo la siguiente (c + 1) (c + 2) / 2 cartas (ADD
B
):AB
.De izquierda a derecha, el siguiente (c + 1) (c + 2) / 2 (agregar
C
):AB C
Y de abajo hacia arriba, las siguientes letras c + 1 (agregar
D
):AB DC
Alcanzado el final del ciclo. Por lo tanto, incrementemos c (que se convierte en 1). Luego, comienza desde el primer paso, la única diferencia es que en lugar de usar las primeras letras c + 1 del alfabeto, usamos las siguientes c + 1 letras , comenzando desde el último elemento de este ciclo (
D
en este caso, entonces continuamos conEFG...
). CuandoZ
se alcanza, retrocede desdeA
.
Tarea
Dado un número entero N (que es positivo para la indexación 1 o no negativo para la indexación 0), genera los primeros N ciclos de la espiral.
Reglas
Puede usar el alfabeto en minúsculas o mayúsculas, pero su elección debe ser coherente (solo use uno de ellos, no se permite mezclar).
Puede tomar entradas y proporcionar salidas a través de cualquiera de los métodos estándar , en cualquier lenguaje de programación , mientras observa que estas lagunas están prohibidas de manera predeterminada.
Formatos de salida aceptables: cadena multilínea, una lista de cadenas que representan líneas, una lista que contiene múltiples listas de caracteres, cada una representando una línea, o cualquier otra cosa que considere adecuada. En caso de que no elija el primer formato, sería bueno incluir una versión bonita de su código.
Este es el código de golf , por lo que gana el código más corto en bytes (en cada idioma) que cumpla con los requisitos.
Casos de prueba
El entero de entrada se separará por su salida correspondiente a través de una nueva línea, y las pruebas se separarán con guiones. Tenga en cuenta que estos están indexados en 1.
1 AB corriente continua -------- 2 ABEF DC G MH LKJI -------- 3 ABEFNOP DC GQ MHR LKJI S DT CU BAZYXWV ------- 4 4 ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SEMEN BAZYXWV N EO DP CQ BAZYXWVUTSR ------- 5 5 ABEFNOPEFGHFGHIJ DC GQIK MHRJL LKJI SKM DTLN CUMO BAZYXWV NP EOQ DPR CQS BAZYXWVUTSR T RU QV PW BUEY NMLKJIHGFEDCBAZY ------ 6 6 ABEFNOPEFGHFGHIJSTUVWX DC GQIKY MHRJLZ LKJI SKMA DTLNB CUMOC BAZYXWV NPD EOQE DPRF CQSG BAZYXWVUTSR TH RUI QVJ PWK OXL NMLKJIHGFEDCBAZY M SN RO QP PQ O NMLKJIHGFEDCBAZYXWVUTS
Respuestas:
Carbón , 31 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Nota: El desverbosificador genera un separador final por alguna razón. Explicación:
Dibuje cuadros en orden inverso de tamaño (de mayor a menor).
Calcule el tamaño de la caja.
Dibuja el borde de la caja usando un alfabeto rotado.
Calcule la letra que aparecería en la esquina superior izquierda del cuadro (indexada en 0).
fuente
Python 2 , 176 bytes
Pruébalo en línea!
Explicación
Construimos un conjunto vacío de espacios del tamaño correcto, luego lo movemos así, comenzando en la esquina superior izquierda:
1 paso →, 1 paso ↓, 1 paso ←, 1 paso ↑
3 pasos →, 3 pasos ↓, 3 pasos ←, 3 pasos ↑
6 pasos →, 6 pasos ↓, 6 pasos ←, 6 pasos ↑
10 pasos →, 10 pasos ↓, 10 pasos ←, 10 pasos ↑
...
Cada vez que encontramos una celda en blanco, ponemos una letra y pasamos a la siguiente letra del alfabeto.
En el código,
s%4
es la dirección (→ ↓ ← ↑), y lo hacemos varias veces:Oportunidades de golf
¿Hay un camino más corto para mapear
s%4
a1,0,-1,0
queabs(2-s%4)-1
?¿Hay un camino más corto para mapear
s%4
a0,1,0,-1
ques%2-s%4/3*2
?Créditos
fuente
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 bytes ). Aún podría ser golfable aunqueC,
305281 bytesGracias a @Mr. Xcoder para guardar cuatro bytes!
Pruébalo en línea!
fuente
#define
forfor(
(que en realidad ahorra bytes). +1 de mi parte :)Python 2 ,
262260254245 bytesPruébalo en línea!
¡Nuevo método con más matemáticas!
Devuelve una lista de listas de caracteres.
Versión antigua:
Python 2 ,
322321308298 bytesPruébalo en línea!
fuente
.49
suficiente en ese caso, o falla para entradas muy grandes?i<j
, ya que la está usando cuatro veces?+1==1+
con mi método anteriorPerl 5, 177 +2 (-nl) = 179 bytes
2 bytes guardados gracias a Xcali
Pruébalo en línea
fuente
-1
lugar de$#O
. También usando$,
en lugar de$n
le permitirá quitar el espacio antesfor
de$_.=$"x$n for@O
s/ (?=\S)/n/e
as/.*\K /n/e
APL (Dyalog Classic) , 47 bytes
Pruébalo en línea!
fuente