Dado un solo entero impar positivo como entrada, devuelve un zigzag convergente como una lista de cadenas, lista de listas de caracteres o cadena separada por nueva línea, de esta forma:
#
#
#
#
#
#
#
#
#
#
#
Puede reemplazar #
con cualquier carácter coherente que no sea un espacio en blanco. Se permite el espacio en blanco al final de cada línea y se permite una nueva línea al final.
El zig-zag comienza en la columna 1
y para cada fila se mueve hacia la derecha una columna, hasta llegar a la columna n
(donde n
está la entrada). Luego, se mueve hacia la izquierda 2
, luego hacia la derecha n-1
, luego hacia la izquierda 3
, con los dos límites convergiendo hasta que el zigzag termine en la columna central ( (n+1)/2
).
Casos de prueba
El ejemplo anterior es el caso de prueba para 5
.
Los siguientes son casos de prueba individuales:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Respuestas:
C (gcc) , 89 bytes
Pruébalo en línea!
Funciona analizando la secuencia de número de espacios como (para n = 7):
Y para n = 3:
Podemos ver que el número del medio (
a
en el código) se ejecuta desde [n-1, n / 2). Entonces, la diferencia entre el primer número y el número del medio es:Entonces, si hemos
b
pasado por [- (2a-n), 2a-n],a-abs(b)
nos dará la secuencia deseada. Esto es esencialmente lo que hace el código.fuente
Carbón ,
108 bytesPruébalo en línea! El enlace es a la versión detallada del código. Editar: Guardado 2 bytes gracias a @dzaima por señalar que no tengo que usar
#
s.fuente
Python 2 , 78 bytes
Pruébalo en línea!
fuente
Jalea , 14 bytes
Pruébalo en línea!
Programa completo
Usos
1
.-1 gracias a Jonathan Allan .
-1 gracias a Jonathan Allan .
fuente
’R
->Ṗ
para un byte.”X
->1
para otro.Haskell , 72 bytes
Pruébalo en línea!
Definimos una lista infinita que
r
es la diagonal de#
s a partir de la esquina superior izquierda.Luego definimos una función
g
que hace la mayor parte del trabajo.g
tomará una lista y la invertirá repetidamente y eliminará su primer elemento hasta que la lista esté vacía, luego concatenará el resultado de cada acción.Nuestra función principal aquí es una función sin puntos. Esta función comienza tomando
n
elementos de la lista infinitar
, luego corta el primer elemento y aplicag
. Por último, tenemos que agregar una#
vuelta al principio, esto se debe a que las especificaciones de la pregunta son un poco raras, no estoy seguro de por qué la primera diagonal siempre es una más larga de lo que debería ser, pero lo es, así que tenemos que agregue aa#
.fuente
("#":).g.init.(
taker)
pero gracias!SOGL V0.12 , 19 bytes
Pruébalo aquí!
fuente
05AB1E , 22 bytes
Pruébalo en línea!
Usos
8
.fuente
05AB1E , 6 bytes
Pruébalo en línea!
fuente
S
. Entonces el resultado será el doble de largo. Todavía no sabía sobre + y ×. Hacen patrones realmente interesantes cuando los combinas con númerosS
, pero no presté suficiente atención a la salida ..>.> Y el+
y×
son básicamente incorporados para[0,4,4,0,2,6,6,2]
y[1,5,5,1,3,7,7,3]
. Y8
se restablecerá al origen desde donde comenzó. Aquí un poco más de información.CJam , 29 bytes
Pruébalo en línea!
Usos
8
.fuente
Pyth, 23 bytes
Pruébalo aquí
fuente
JavaScript, 127 bytes
Calcula el objetivo (
g
) para llegar. Cuando se alcanza este objetivo, da la vuelta al siguiente objetivo. También usa un truco para evitar usarMath.round()
agregando0.5
a cada número desigual.fuente
Haskell, 74 bytes
Pruébalo en línea!
Cómo funciona:
Cada llamada recursiva
f
anexa la siguiente diagonal.fuente
Casco , 19 bytes
Pruébalo en línea!
Explicación
Esto se siente un poco torpe.
fuente
Python 3 , 82 bytes
Pruébalo en línea!
fuente
Retina , 71 bytes
Pruébalo en línea! Explicación: Las primeras tres etapas convierten la entrada en el formulario
:> :
donde el número de caracteres entre los:
s es el número de entrada. Las últimas dos etapas luego rebotan>
(o<
, al moverse hacia la izquierda) entre:
s. La cuarta etapa repite el rebote e imprime las partes requeridas de la cadena cada vez. El;
detiene la cadena de ser impresa después del bucle.fuente
05AB1E , 16 bytes
Pruébalo en línea!
Explicación
fuente
K (Kona), 27 bytes
Produce la secuencia numérica subyacente al invertir y soltar repetidamente la cabeza de un vector hasta que esté vacío.
fuente
PHP, 65 bytes
Ejecutar como tubería con
-nF
o probarlo en línea .explicación:
primera iteración:
$n
es decirNULL
,--$n
no tiene efecto y se evalúa enNULL
-> establecer
$n
y$d
en el argumento pre-decrementado1. incremento
$x
para par$d
, decremento para impar$d
2. impresión
X
, nueva línea y$x
espaciositeraciones adicionales: decremento
$n
; cuando golpea0
, restablece$n
(y$d
) al argumento pre-decrementadofinal: imprime uno más
X
.fuente
Japt , 31 bytes
Solución recursiva que devuelve una matriz de líneas.
Pruébalo en línea! usando la
-R
bandera para unir la salida con nuevas líneas.fuente
Python 2,
159145141136 bytesYa ha habido versiones bastante agradables de Python para este problema, pero pensé que aún publicaría mi horrible one-liner. (¡Sin punto y coma sin embargo!)
Editar: 14 bytes hacia abajo, usando suma en lugar de doble comprensión de lista
Editar: Acabo de notar que en Python 2 puede usar input en lugar de raw_input. Siempre he usado este último.
fuente
Mathematica,
142102bytes (independiente)Esta solución tiene un sabor a mathy:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Básicamente, esto calcula en qué segmento estamos (invirtiendo la función de número triangular) y luego moviéndonos hacia la izquierda o hacia la derecha agregando una potencia de -1.
Puede probarlo en Wolfram Code Sandbox pegando código como
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
y presionando Shift + Enter o Numpad Enter o haciendo clic en Gear -> "Evaluar celda".Esto tiene la misma longitud que mi puerto incorrecto original de la solución Python 2 de Erik (este puerto proporciona la salida para una entrada más alta):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
fuente