Dada una matriz, sume sus valores arriba / abajo o izquierda / derecha para formar una X, dóblela hacia arriba y devuelva la lista. Describo el algoritmo aquí:
Algoritmo
Su entrada será una matriz cuadrada de enteros de tamaño impar dentro de la capacidad numérica razonable de su idioma.
Tomemos la siguiente matriz como ejemplo:
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
Primero, agregue cada número al número más cercano que esté en la diagonal principal o antidiagonal. Es decir, divida la matriz en cuatro secciones a lo largo de la diagonal principal y antidiagonal, y luego sume todos los números en cada sección hacia el centro, así:
1 2 3 2 1
↓ ↓ ↓
0 → 3 2 3 ← 0
↓
4 → 2 → 5 ← 6 ← 3
↑
7 → 4 7 9 ← 4
↑ ↑ ↑
0 6 7 2 5
Este paso da el siguiente resultado:
1 1
5 5
39
17 15
0 5
Luego, lo doblamos al aplanar la X y entrelazar los elementos con la parte superior izquierda primero y la inferior izquierda última. Esto da el siguiente resultado:
1, 0, 5, 17, 39, 5, 15, 1, 5
Puedes imaginar esto como estirar la diagonal principal y rotarla en sentido antihorario.
Este es el resultado final.
Desafío
Implementa este algoritmo. Se aplican lagunas estándar. Todos los formatos razonables de E / S son aceptables.
Casos de prueba
Input
Output
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
1, 0, 5, 17, 39, 5, 15, 1, 5
1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0
1, 6, 11, 16, 47, 7, 22, 5, 0
1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9
1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
Respuestas:
JavaScript, 113 bytes
Mostrar fragmento de código
fuente
~~
? Se neutralizan entre sí, por lo que no hay necesidad de ellos.~~undefined==0
, así que esto es más golfista que(a[q]||0)
.undefined
. Cuando copié el caso de prueba utilizado por tsh , noté que funcionaba sin el~~
. Y como~~x
es similar-(-x)
neutralizarse entre sí, pensé que de alguna manera fue puesto allí por accidente. Gracias por la corrección.Jalea ,
252321 bytesPruébalo en línea!
Versión alternativa, 19 bytes.
Esto no solía funcionar porque se
Ġ
comportó incorrectamente para matrices anidadas. La única diferencia es que los pares [q, p] mencionados en Cómo funciona se ordenan lexicográficamente en lugar de asignarlos a p + nq antes de ordenarlos.Pruébalo en línea!
Antecedentes
Comenzamos reemplazando sus elementos con coordenadas, aumentando hacia la izquierda y hacia abajo y colocando (0, 0) en el centro de la matriz.
Para una matriz M de 7x7 , obtenemos las siguientes coordenadas.
Ahora calculamos el valor absoluto mínimo de cada par de coordenadas y multiplicamos los signos de ambas coordenadas por él, asignando (i, j) a (signo (i) m, signo (j) m) , donde m = min (| i | , | j |) .
Los elementos de la matriz que corresponden al mismo par deben sumarse. Para determinar el orden de las sumas, asignamos cada par (p, q) a p + nq , donde n es el número de filas / columnas de M .
El orden de las sumas corresponde al orden de los enteros que corresponden a sus sumandos.
Cómo funciona
fuente
Python,
159158bytesPruébalo en línea!
fuente
y+1+(y>l-2)
puede ser(y>l-2)-~y
.Dyalog APL ,
10199646259 bytes3 bytes guardados por @ Adám
Pruébalo en línea!
Usando el asombroso algoritmo de Dennis .
fuente
APL (Dyalog) , 60 bytes *
En colaboración con mi colega Marshall .
Prefijo anónimo lambda. Toma la matriz como argumento y devuelve el vector. Asume
⎕IO
( I ndex O rigin) a ser cero, que es predeterminado en muchos sistemas.Pruébalo en línea!
{
...}
lambda anónimo;⍵
es el argumento correcto (como la letra más a la derecha del alfabeto griego):⍴⍵
forma del argumento (lista de dos elementos idénticos)r←
almacenar comor
(como en r ho)⍳
todos los of nices de una matriz de ese tamaño, es decir(0 0)
,(0 1)
...i←
almacenar eni
(como en i ota)=/¨
Booleano donde las coordenadas son iguales (es decir, la diagonal)(
...)
aplique esta función de prefijo tácito anónimo:⌽
invertir el argumento⊢∨
O que con el argumento no modificado,
ravel (enderezar en una lista simple)Ahora tenemos una máscara booleana para las diagonales.
(
...)/⍨
use eso para filtrar lo siguiente:⊢⍵
ceder (para separarse der
) el argumento{
…}⌺r
Llame al siguiente infijo anónimo lambda en cada elemento, con elr
vecindario (rellenado con ceros según sea necesario) como argumento correcto (⍵
), y una lista de dos elementos de filas, columnas rellenadas con números (negativo para abajo / derecha, cero para ninguno) como argumento izquierdo (⍺
):r÷2
dividirr
con dos⊃
elige el primer elemento (son idénticos)⌊
pisalos←
almacenar comos
(para s hape)i∊⍨¨
para cada elemento dei
, Boolean sis
es miembro del mismo⍵×
multiplicar el barrio con el(
…)↓
Suelte el siguiente número de filas y columnas (negativo para abajo / derecha):×⍺
signo del argumento izquierdo (es decir, la dirección de los rellenos)-
negars×
multiplicars
con eso,
ravel (enderezar en la lista)+/
suma (más reducción)Ahora tenemos una matriz completa de sumas, pero necesitamos filtrar todos los valores leídos en columnas.
⍉
transponer,
ravel (enderezar en una lista simple)* Contando
⌺
como⎕U233A
. Pruébalo en línea!fuente