Dada uma matriz, some seus valores para cima / baixo ou esquerda / direita para formar um X, dobre-o e retorne a lista. Eu descrevo o algoritmo aqui:
Algoritmo
Sua entrada será uma matriz quadrada de números ímpares dentro da capacidade numérica razoável do seu idioma.
Vamos tomar a seguinte matriz como exemplo:
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
Primeiro, adicione todos os números ao número mais próximo que estiver na diagonal principal ou antidiagonal. Ou seja, divida a matriz em quatro seções ao longo da diagonal principal e antidiagonal e, em seguida, some todos os números em cada seção em direção ao centro, da seguinte forma:
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
Esta etapa fornece o seguinte resultado:
1 1
5 5
39
17 15
0 5
Em seguida, dobramos, achatando o X e entrelaçando os elementos com a parte superior esquerda primeiro e a parte inferior esquerda por último. Isso fornece o seguinte resultado:
1, 0, 5, 17, 39, 5, 15, 1, 5
Você pode imaginar isso esticando a diagonal principal e girando-a no sentido anti-horário.
Esse é o resultado final.
Desafio
Implemente esse algoritmo. Aplicam-se brechas padrão. Todos os formatos razoáveis de E / S são aceitáveis.
Casos de teste
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
Respostas:
JavaScript, 113 bytes
Mostrar snippet de código
fonte
~~
? Eles se neutralizam, então não há necessidade deles.~~undefined==0
, então isso é mais do que golfe(a[q]||0)
.undefined
. Quando copiei o caso de teste tsh usado, notei que funcionava sem o~~
. E como~~x
é semelhante a-(-x)
neutralizar um ao outro, achei que de alguma forma foi colocado ali por acidente. Obrigado pela correção.Geléia ,
252321 bytesExperimente online!
Versão alternativa, 19 bytes
Isso não costumava funcionar porque se
Ġ
comportava incorretamente para matrizes aninhadas. A única diferença é que os pares [q, p] mencionados em Como funciona são classificados lexicograficamente em vez de os mapear para p + nq antes da classificação.Experimente online!
fundo
Começamos substituindo seus elementos por coordenadas, aumentando para a esquerda e para baixo e colocando (0, 0) no centro da matriz.
Para uma matriz 7x7 M , obtemos as seguintes coordenadas.
Agora calculamos o valor absoluto mínimo de cada par de coordenadas e multiplicamos os sinais de ambas as coordenadas por ele, mapeando (i, j) para (sinal (i) m, sinal (j) m) , em que m = min (| i | , | j |) .
Elementos da matriz que correspondem ao mesmo par devem ser somados. Para determinar a ordem das somas, que mapear cada par (p, q) a p + nq , onde n é o número de linhas / colunas de M .
A ordem das somas corresponde à ordem dos números inteiros e corresponde aos seus summands.
Como funciona
fonte
Python,
159158 bytesExperimente online!
fonte
y+1+(y>l-2)
pode ser(y>l-2)-~y
.Dyalog APL ,
10199646259 bytes3 bytes salvos por @ Adám
Experimente online!
Usando o incrível algoritmo de Dennis .
fonte
APL (Dyalog) , 60 bytes *
Em colaboração com meu colega Marshall .
Prefixo anônimo lambda. Toma matriz como argumento e retorna vetor. Assume
⎕IO
( I ndex O rigin) como zero, o que é padrão em muitos sistemas.Experimente online!
{
...}
lambda anônima;⍵
é o argumento correto (como a letra mais à direita do alfabeto grego):⍴⍵
forma do argumento (lista de dois elementos idênticos)r←
armazenar comor
(como em r ho)⍳
todos os índices de uma matriz desse tamanho, ou seja(0 0)
,(0 1)
…i←
armazenar emi
(como em i ota)=/¨
Booleano onde as coordenadas são iguais (ou seja, a diagonal)(
…)
Aplique esta função de prefixo tácito anônimo:⌽
reverter o argumento⊢∨
OU que, com o argumento não modificado,
passear (endireitar em lista simples)Agora temos uma máscara booleana para as diagonais.
(
…)/⍨
Use isso para filtrar o seguinte:⊢⍵
produzir (separarr
) o argumento{
…}⌺r
Chame o seguinte infixo anônimo lambda em cada elemento, com or
-neighbourhood (preenchido com zeros, conforme necessário) como argumento correto (⍵
) e uma lista de dois elementos de número preenchido de linhas, colunas (negativo para baixo / direito, zero para nenhum) como argumento à esquerda (⍺
):r÷2
dividirr
com dois⊃
escolha o primeiro elemento (eles são idênticos)⌊
andar issos←
armazenar comos
(para s hape)i∊⍨¨
para cada elemento dei
, Boolean ses
for um membro dele⍵×
multiplicar a vizinhança com isso(
…)↓
Solte o seguinte número de linhas e colunas (negativo para inferior / direita):×⍺
signum do argumento esquerdo (ou seja, a direção dos forros)-
negars×
multiplicars
com isso,
ravel (endireite na lista)+/
soma (mais redução)Agora temos uma matriz completa de somas, mas precisamos filtrar todos os valores lidos em colunas.
⍉
transpor,
passear (endireitar em lista simples)* Contando
⌺
como⎕U233A
. Experimente online!fonte