Dado un número entero de entrada n
, dibujar una serpiente número, es decir, una cuadrícula de medición n x n
que consiste en los números 1
a través de n^2
que se enrollan alrededor de la otra de la manera siguiente:
Entrada n = 3
:
7 8 9
6 1 2
5 4 3
Entrada n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Entrada n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Inspirado por este problema del Proyecto Euler).
Este es el código de golf , ¡la respuesta más corta en bytes gana!
4
? O cualquier número par.Respuestas:
MATL , 3 bytes
Pruébalo en línea!
Explicación
Incorporado ... ¯ \ _ (ツ) _ / ¯
fuente
C #,
203202196193178 bytesGuardado un byte gracias a @StefanDelport.
Guardado 22 bytes gracias a @FelipeNardiBatista.
Esto funciona mediante la siguiente observación de cómo se forman los cuadrados:
Como puede ver, cada bit se agrega al cuadrado anterior. Para los números pares, vamos a la derecha de donde estábamos, hacia abajo, hasta que estuvimos uno más abajo de donde estaba el cuadrado y luego nos fuimos al final. Los números impares son esencialmente lo opuesto, vamos a la izquierda, hasta que estuvimos uno por encima de la altura actual y luego al final.
Versión completa / formateada:
fuente
++i<=n;
puede convertirsen>++i
, nada más puedo ver, +1.n%2<1?2:1
a2-x%2
? No lo he probado en C #, pero en C y Python funcionó.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
golf un pocovar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 bytesPruébalo en línea!
¿Cómo?
calcula las diferencias entre los índices;
1
y¯1
para derecha e izquierda,¯⍵
y⍵
para arriba y abajo.1,⊢,¯1,-
viene como1 ⍵ ¯1 ¯⍵
,+⍨⍴
estira esta matriz a la longitud de⍵×2
, por lo que el final2/⍳
puede repetir cada uno de ellos, con un conteo de repeticiones que aumenta cada segundo elemento:luego,
antepone el elemento superior izquierdo de la espiral,
limitar los primeros ⍵ 2 elementos de esta lista de distancias,
realiza suma acumulativa,
califica los índices (
⍵[i] = ⍵[⍵[i]]
), para traducir la matriz original con los índices de cada elemento, y finalmenteformas como una
⍵×⍵
matriz.fuente
C,
321307295284283282 bytes¡Gracias a @Zachary T y @Jonathan Frech por jugar al golf en un byte!
Asigna una matriz bidimensional de ceros, luego comienza a llenarlo desde algún lugar en el medio. Por último, se imprimen los valores que son mayores que cero pero menores o iguales que el cuadrado de la entrada.
Pruébalo en línea!
Formateado:
fuente
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
coni,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
para guardar un byte?k<=n;
conn>k;
para guardar un byte.PHP , 192 bytes
Pruébalo en línea!
Del mismo modo, construya una cadena en lugar de una matriz
PHP , 217 bytes
Pruébalo en línea!
fuente
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. Y otro:"%$l".d
. Y uno más:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
a un guión bajo (o letra o dígito); ese personaje se sobrescribirá..d
en tu propio enfoque para ahorrar 2 bytesPHP,
185 176174 bytesEjecutar como tubería con
-nR
o probarlo en línea .Descompostura
fuente
APL (Dyalog Classic) ,
3229 bytesPruébalo en línea!
Usos
⎕io←1
. Comienza con una matriz 0 por 1 (⍪⍬
). 2N veces (⍣2⍣⍵
) agrega la altura de la matriz (≢⍵
) a cada uno de sus elementos, se coloca1 2...height
a la derecha (,⌸
) y gira (⌽⍉
). Cuando haya terminado, corrige la orientación del resultado (⊖∘⌽⍣⍵⌽
) e invierte los números restándolos de N 2 +1 (1+×⍨-
).fuente
Mathematica, 177 bytes
fuente
C ++,
245228 bytesPruébalo en línea!
La función calcula e imprime el valor de cada número de la matriz en función de su x, y aplicando esta lógica:
Versión formateada :
fuente
Pitón 3 ,
249247 bytesInicializo una matriz 2D y encuentro el punto de partida, que es el centro para n impar o desplazamiento (-1, -1) para n par, luego escalo el patrón de relleno / cursor con el número de 'anillo' actual. Siento que me falta un truco para interpretar las instrucciones, pero no he encontrado nada más barato.
Pruébalo en línea!
-2 gracias a Zachary T!
fuente
\t
y\n
como 1 byte y todavía obtengo 249 byteslen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram Language (Mathematica) ,
(...)83 bytesByte medido en UTF8,
\[LeftFloor]
(⌊
) y\[RightFloor]
(⌋
) cuesta 3 bytes cada uno. Mathematica no tiene ningún conjunto de caracteres de byte especial.Pruébalo en línea!
Utiliza el formulario cerrado para cada uno de los 4 casos, luego toma el máximo con cuidado para obtener el resultado deseado.
Devuelve una matriz 2D de enteros. No estoy seguro de si esto está permitido, y aunque se ha preguntado en los comentarios , el OP no respondió.
fuente
Clojure, 206 bytes
Supongo que este es un comienzo decente, construye el tablero en secuencia en un mapa hash y luego lo divide en
n x n
listas. Esodefmacro
terminó siendo bastante largo, pero el código aún es más corto con él que sin él. ¿Existe una sintaxis más sucinta para describirla?La cantidad de bytes calcula el punto de partida y construye la lógica de búsqueda de la siguiente velocidad
v
. Quizás un anidadovec
sería mejor, pero entonces tienes dos índices y velocidades para seguir.fuente
J , 41 bytes
Pruébalo en línea!
Hace lo mismo que el envío APL de ngn pero comienza con una matriz 1 por 1 y se repite 2 × N − 2 veces.
fuente
Python 165 (o 144)
Esto crea una matriz numpy, luego la gira y agrega un lado hasta alcanzar el tamaño correcto. La pregunta no especificó si el mismo punto de inicio debe usarse para números pares e impares, si ese no es el caso, la línea
if n%2==0:a=r(r(a))
se puede eliminar, ahorrando 21 bytes.fuente
J , 41 bytes
formato estándar
Este enfoque se basa en At Play With J Volutes (el APL de Uriel usa una técnica similar).
Es inesperado y lo suficientemente elegante como para justificar una segunda respuesta J, pensé.
Esencialmente, no hacemos nada de procedimiento o incluso geométrico. En cambio, creamos aritméticamente una secuencia simple que, cuando el escaneo se suma y se califica, da el orden correcto del número en espiral de izquierda a derecha, de arriba a abajo. Luego formamos eso en una matriz y listo.
Agregaré una explicación más detallada cuando el tiempo lo permita, pero el artículo vinculado lo explica en profundidad.
Pruébalo en línea!
fuente
Python 3 (sin apilamiento) ,
192188179150 bytesPruébalo en línea!
El algoritmo aquí es formar un fasor para cada coordenada en la cuadrícula, y luego rotarlo 90 grados en el sentido de las agujas del reloj hasta que el fasor se encuentre entre las diagonales superiores. Se puede usar una fórmula simple para calcular el valor basado en las coordenadas y el número de rotaciones en sentido horario:( 2 y+ 1 )2- ( y- x ) - 2 yr
Guardado 4 bytes ya que la rotación fasorial de 90 grados se realiza fácilmente sin números complejos
fuente
R , 183 bytes
Pruébalo en línea!
La salida es una serpiente de matriz (o matriz de serpiente, lo que sea). Probablemente no sea el método más eficiente, y probablemente podría jugar golf, pero pensé que valía la pena mostrarlo. ¡Estoy bastante orgulloso de esto en realidad!
El método construye la matriz de adentro hacia afuera, siempre agregando un número adicional de enteros igual al número de columnas en la matriz antes de agregar. El patrón que sigue es vinculante por columnas o por filas, mientras que también invierte algunos valores para que se agreguen en el orden correcto.
193 bytes
Exactamente igual que el anterior, pero el final
b
esPruébalo en línea!
lo que da una salida ligeramente más limpia, pero no vi ningún criterio especial para la salida, por lo que la primera respuesta debería funcionar si no me equivoco.
fuente