Una matriz piramidal es una matriz cuadrada donde todos los números aumentan o disminuyen desde el punto central, como las dos matrices a continuación:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
O:
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Dado un número entero distinto de cero n
, cree una matriz piramidal donde los números vayan 1
a n
orden creciente (si n <0) o orden decreciente (si n> 0) desde el centro. Si n
es par, entonces habrá 4 números centrales (ver los ejemplos).
Como siempre:
- Formato opcional de entrada y salida
- El número de espacios, delimitador, etc. es opcional.
Casos de prueba:
1
1
-1
1
5
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
-5
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
-2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
-4
4 4 4 4 4 4 4 4
4 3 3 3 3 3 3 4
4 3 2 2 2 2 3 4
4 3 2 1 1 2 3 4
4 3 2 1 1 2 3 4
4 3 2 2 2 2 3 4
4 3 3 3 3 3 3 4
4 4 4 4 4 4 4 4
-10 < n < 10
?Respuestas:
Jalea ,
1817 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
EXCEL: 126 bytes
=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)
Pruébalo en línea *
Nota: esta respuesta utiliza la notación R1C1. Si vas a probar esto tú mismo. necesitas activar eso en las opciones de Excel.
la fórmula dada debe estar en cada célula presente más allá de (2,2). Pon el tamaño de tu pirámide deseado en (1,1).
tapa de pantalla rápida de la fórmula en acción:
¡Aquí hay una imagen adicional de diversión con formato condicional!
* La actualización lleva mucho tiempo, actualmente.
fuente
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
92 bytes. Sin embargo, todavía no maneja los casos y la fórmula no se puede arrastrar ya que la referencia de celda no está bloqueada.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
o necesita mucho más de 126 bytes.Pitón 2,
1099998Crear lista
y juega un poco con eso.
editar: nueva forma de crear lista + thx Lynn para dos bytes
fuente
If n is even, then there will be 4 center numbers
MATL ,
2624 bytesPruébalo en línea! O verifique todos los casos de prueba (código ligeramente modificado para servir como conjunto de pruebas).
Explicación
El código primero construye la matriz de salida suponiendo una entrada positiva
n
. La matriz se inicializa como1
entrada impar o como matriz vacía para entrada par (esto se crea como una matriz de identidad con un tamaño igual a la paridad de la entrada). Luego, lo siguiente se repiten
veces para entradas pares yn-1
veces para entradas impares: extienda la matriz con un marco que contenga0
y agregue1
a todos los elementos.Por ejemplo, los pasos para la entrada
n
son:Matriz inicial:
Extender con marco:
Añadir
1
:Extender con marco:
Añadir
1
:Esto proporciona la salida correcta para la entrada positiva. Si la entrada es negativa, la matriz debe modificarse agregando la entrada menos
1
y tomando el valor absoluto:¡Puedes ver cómo crece la matriz (código modificado para mostrar pasos intermedios) en MATL Online! El intérprete sigue siendo beta. Si no funciona, presione "Ejecutar" nuevamente o vuelva a cargar la página.
Código comentado
fuente
.2
segundosPython 2.7:
123122120 byteslos problemas aún pueden guardar algunos bytes ...
edit1:
N=abs(n)
para guardar 1 byteedit2:
(i+1)*(n>0)or-n-i
para guardar 2 bytesfuente
Haskell,
119113110104102101 bytesDevuelve la matriz como una lista de listas de enteros, por ejemplo:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Cómo funciona:
fuente
Perl, 175 bytes
Incluye 1 bytes para
-p
.(Hay una nueva línea final que no sé cómo mostrar con la rebaja, pero la necesita).
Necesidades
-p
así como-M5.010
o-E
para correr:Maldición, esto es demasiado largo ... Intentaré otros enfoques cuando tenga algo de tiempo.
fuente
eval
?y///
que no se interpola, entonces se usan comillas dobles para interpolar$w
y$k
luegoeval
ejecutary///
.Python 2, 109 bytes
fuente
J,
2926 bytesUso
Explicación
El
i.
verbo de rango produce resultados[0, 1, ..., n-1]
positivosn
y[n-1, n-2, ..., 0]
negativos, lon
cual es útil aquí.fuente
Mathematica, 78 bytes
Explicación
Haga la matriz inicial: 1x1 si es impar, 2x2 si es par.
Genere una lista de 1 a abs (entrada) - 1.
Rellene la matriz inicial utilizando la lista mencionada anteriormente.
Agregue 1 o entrada, lo que sea más pequeño.
Aplicar valor absoluto a toda la matriz.
fuente
PHP,
177157bytescorre con
php -r '<code>
recorre filas y columnas, imprime los valores en función de su distancia al centro.
$n=abs($z)+1
: El+1
guarda un par de+1
y-1
en expresiones posteriores-$n+1
(¡pre-incremento en la condición!) a$n-1
(-abs($z)
aabs($z)
)$n
: 1) se omiten(¡
$n&1
es cierto para las columnas pares aquí! ¿Recuerda el+1
?)+1
.fuente
Haskell,
191183173169168 bytesUso:
Gracias a nimi por
2102024 bytes!fuente
negate
es(0-)
f
a[id!id,tail!init]!!mod n 2
y luego en líneag
y el uso de la1<2
guardia para unirse a un resultado intermedio de la rama:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. No necesita un nombre para la función principal.a
, también (y volver a la1<2
guardia):g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
.m=map
en!
:...(++).m y
yg
:g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
.JavaScript (ES6), 107 bytes
l
es el tamaño de la matriz. Eln<0?-n-j:j+1
parece torpe, pero no puedo encontrar nada mejor.fuente
Vim,
152143 bytesEstoy seguro de que esto podría jugar más, especialmente esas dos últimas líneas, pero mi cerebro está frito.
Pruébalo en línea!
Aquí está en formato xxd con caracteres no imprimibles:
Explicación
Construye la pirámide desde el centro hacia afuera, rodeando el número del centro con
x
es:Luego reemplaza el
x
es con el siguiente número y lo rodea conx
es nuevamente:...y así. Para números pares, hace lo mismo pero comienza con una base de 2x2.
Aquí está el código "sin golf". Es algo poco convencional en el sentido de que "grabo" una macro escribiéndola en un búfer (de ahí todos los
<C-v>
s) y luego eliminándola en un registro, que es la mejor manera que encontré para componer una macro sin ejecutar realmente las pulsaciones de teclas.fuente
PHP, 215 bytes
fuente
R, 112 bytes
Necesita un entero
n
en el espacio de trabajo; de lo contrario, ejecuten=scan()
8 bytes adicionales.fuente