Este desafío está inspirado en esta pregunta, ahora eliminada.
Tome un entero positivo N como entrada y genere una matriz con los números 1 .. N 2 que sigue el siguiente patrón:
Complete la primera fila con 1 .. N, luego complete la última fila (número de fila N ) con (N + 1) .. 2N , luego complete la segunda fila con (2N + 1) .. 3N y continúe hasta que haya completado todas las filas
El formato de salida es flexible, por lo que se aceptan listas de listas, etc.
N = 1
1
N = 2
1 2
3 4
N = 3
1 2 3
7 8 9
4 5 6
N = 4
1 2 3 4
9 10 11 12
13 14 15 16
5 6 7 8
N = 5
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
16 17 18 19 20
6 7 8 9 10
Aplican reglas estándar. La respuesta más corta en bytes en cada idioma gana. Se alientan las explicaciones como siempre.
code-golf
number
array-manipulation
matrix
Stewie Griffin
fuente
fuente
1 2 3 7 8 9 4 5 6
:) ¿El formato de salida es tan flexible?Respuestas:
05AB1E ,
138 bytesGuardado 5 bytes gracias a Rod
Pruébalo en línea!
Explicación
fuente
Ruby , 53 bytes
Explicación:
Ponga todos los números en una sola matriz primero, luego corte la matriz omitiendo una línea para cada iteración. Después de las primeras iteraciones (n / 2 + n% 2) no queda nada que omitir, luego obtenga todas las líneas restantes hacia atrás.
Pruébalo en línea!
fuente
Python 2 , 75 bytes
Pruébalo en línea!
fuente
JavaScript, 68 bytes
Editar 3 bytes guardados, estimados por @ user71546
Primero intente,siguiendo la ruta obvia: cuente desde 1 y llene la matriz desde ambos lados, desde el exterior al interiorPrueba
fuente
Haskell , 62 bytes
Pruébalo en línea! La salida es una lista de listas, por ejemplo,
(0#) 3
rendimientos[[1,2,3],[7,8,9],[4,5,6]]
.fuente
> <> ,
51 + 3 = 5447 bytesPruébalo en línea!
Se espera una entrada en la parte superior de la pila al inicio del programa utilizando el
-v
indicador. La salida consiste en números no alineados separados por espacios individuales, y cada línea está separada por una nueva línea. Ejemplo de salida paraN=5
:... seguido de una nueva línea. El programa termina con un error (
something smells fishy...
), pero eso está en STDERR en lugar de STDOUT.Explicación:
La primera línea simplemente almacena una copia de
N
en el registro.La segunda línea construye el desplazamiento para cada fila de salida restando 1 de
N
, multiplicándoloN
, girándolo al fondo de la pila y luego invirtiendo toda la pila. Cuando el número en la parte superior de la pila llega a 0, la pila debería verse así (el ejemplo usaN=5
):La tercera línea descarta el duplicado
0
de la parte superior de la pila.La cuarta línea incrementa la parte superior de la pila y genera una copia de la misma. Esto se toma mod
N
, y se usa para decidir si se debe imprimir un espacio o una nueva línea, y si se debe descartar la parte superior de la pila; si se imprime el último númerox
, entoncesx mod N == 0
indica que se ha alcanzado el final de esa fila de salida . La ejecución finaliza cuando1+
se ejecuta en una pila vacía, arrojando el error de terminación.Versión previa
Esto verificó explícitamente una pila vacía para finalizar la ejecución, y también estaba incluyendo 3 bytes para el
-v
uso del indicador.Pruébalo en línea!
fuente
Perl 5 ,
-p
5251 bytesPruébalo en línea!
fuente
Java (OpenJDK 9) , 101 bytes
Pruébalo en línea!
Créditos
fuente
j++
: 102 bytesn-i/2-1
an+~i/2
101 bytesn->{int i=n*n,x[]=new int[i],r;for(;i-->0;x[(r%2<1?r/2:n+~r/2)*n+i%n]=i+1)r=i/n;return x;}
JavaScript (ES6),
6968 bytesBueno, se superó antes de que pudiera publicarlo, pero aquí está de todos modos.Editar: Guardado 1 byte gracias a @KevinCruijssen.fuente
n+n-i-1
puede sern+n+~i
de -1 byte, por lo que se enfrenta de nuevo con la otra respuesta de JavaScript. :)Jalea , 10 bytes
Pruébalo en línea!
Cómo funciona
fuente
Stax , 10 bytes
Ejecútelo y depúrelo en línea
La representación ascii correspondiente del mismo programa tiene 12 caracteres.
Así es como funciona.
fuente
Jalea ,
13...6 bytesGracias JonathanAllan por -1 byte!
Pruébalo en línea!
Use un algoritmo idéntico a la respuesta 05AB1E.
fuente
R
ya ques
tiene un rango implícito de izquierda.R ,
705947 bytesPruébalo en línea!
Gracias a Robin Ryder por un golf de 4 bytes, que luego jugué más.
Devuelve una matriz; construye el
matrix
en secuencia, por ejemplo[[1 2 3] [4 5 6] [7 8 9]]
, luego reorganiza las filas.fuente
rbind
.Python 2 ,
726863 bytes-4 bytes gracias a Neil
Pruébalo en línea!
fuente
x
variable intermedia ?Octava , 102 bytes
Pruébalo en línea!
fuente
until
comando. Y no sabía sobrevec2mat
:( Lamentablemente, la misma duración:A=B=vec2mat(1:(n=input(''))*n,n)
:(while j++<n
también tiene exactamente la misma longitud ... ¿Has probado las diferentes opciones o son solo coincidencias?while
bucle tiene la misma longitud, lo intenté en ambos sentidos. Sin embargo, a menudodo ... until
es un byte más corto quewhile ... end
.C (gcc) , 110 bytes
Pruébalo en línea!
Completa una matriz alternando entre 2 índices para las filas: un índice que comienza en la parte superior y otro que comienza en la parte inferior. El índice de la fila superior comienza en 0 y se incrementa cada 2 filas; el índice de la fila inferior comienza en n-1 y se reduce cada 2 filas.
Sin golf:
fuente
C ++ + Rango V3 , 159 bytes
Live on Wandbox
Sin contar las 2 nuevas líneas después
using namespace range::view
; solo están ahí para separar las importaciones de la lambda.Hecho levemente interesante: esta solución no realiza asignaciones de montón. Resuelve el problema en el
O(1)
espacio.Explicación:
iota(1, n*n+1)
->[1 ... n*n]
chunk(n)
: todos losn
elementos juntos, entonces[1 ... n] [n+1 ... 2*n] ...
r
r | stride(2)
: tome todos los demás elementos:[1 ... n] [2*n+1...] ...
r | reverse | drop(n % 2)
: reversa, luego elimine el[1 ... n]
término sin
es impar (habrá un número impar de filas y solo queremos imprimir el primer término una vez). Parece que debería poder hacerlor | reverse | take
, pero eso no funciona por alguna razón.stride(2)
de nuevo, tome todos los demás elementos. Esta vez es al revés.Más legible y comprobable:
fuente
int n
, necesitolog(n)
bits para almacenar la entrada? Pero esa es la entrada de todos modos, y estamos tratando con unint
dóndesizeof(int) == 4
(la mayoría de los sistemas), por lo que es un número constante de bytes utilizados independientemente de la entrada.Jalea , 11 bytes
Pruébalo en línea!
fuente
CJam , 22 bytes
Pruébalo en línea!
fuente
C (gcc)
8078Ahora veo que esta solución está mal
Pruébalo en línea!
fuente
C (gcc) , 36 + 8 + 61 = 105 bytes
compilar con
-Dp=printf("%d ",i),i++%n;);puts("")
-Dq=i,n)
Pruébalo en línea!
fuente