Vamos A
ser um m
pela n
matriz retangular de positivos inteiros, onde m
e n
são também positivos inteiros.
Estamos interessados nos caminhos RoD ('Direita ou Abaixo') da célula superior esquerda A
para a célula inferior direita; em um caminho RoD, cada célula sucessiva do caminho é uma célula à direita ou uma célula abaixo da célula anterior.
Dado qualquer caminho RoD, podemos obter a soma das células A
nesse caminho.
Por exemplo, considere a matriz 4 por 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Então podemos considerar o caminho do RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
que tem uma soma de 1+2+1+2+1+1=8
. Vale ressaltar que esse caminho possui a menor soma de todos os caminhos RoD possíveis, da parte superior esquerda para a parte inferior direita nessa matriz.
Portanto, o desafio proposto é fornecer a função / programa mais curto no seu idioma de escolha que produza a soma mínima que um caminho de RoD da parte superior esquerda para a parte inferior direita pode ter em uma determinada matriz A
.
As brechas proibidas usuais estão em vigor. Sua entrada pode estar em qualquer formato razoável; sua saída deve ser um número inteiro.
Isso é código-golfe; as respostas são pontuadas pelo número de bytes.
Casos de teste
[ [5] ] -> 5
[ [5, 2] ] -> 7
[ [5],
[2] ] -> 7
[ [ 9 , 1 , 12, 3 ],
[ 12, 11, 6 , 11],
[ 12, 9 , 2 , 11] ] -> 40
[ [ 6 , 8 , 11, 2 ],
[ 3 , 6 , 7 , 6 ],
[ 6 , 2 , 8 , 12] ] -> 37
[ [ 4 , 5 , 8 , 4 ],
[ 6 , 5 , 9 , 4 ],
[ 2 , 5 , 6 , 8 ] ] -> 31
[ [ 4 , 5 , 15, 18, 30],
[ 26, 26, 3 , 4 , 5 ],
[ 7 , 9 , 29, 25, 14],
[ 16, 1 , 27, 13, 27],
[ 23, 11, 25, 24, 12],
[ 17, 23, 7 , 14, 5 ] ] -> 94
[ [ 10, 15, 7 , 2 , 9 ],
[ 24, 5 , 2 , 1 , 25],
[ 2 , 12, 14, 30, 18],
[ 28, 4 , 12, 22, 14],
[ 15, 21, 21, 11, 4 ],
[ 21, 15, 21, 29, 9 ] ] -> 103
fonte
JavaScript (ES6),
787776 bytesExperimente online!
Comentado
fonte
Haskell,
6357 bytesExperimente online!
fonte
MATL ,
38363029 bytesObrigado a @ Giuseppe por apontar um erro, agora corrigido.
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
R , 90 bytes
Experimente online!
A solução ingênua: percorra a matriz (abaixo das colunas), substituindo cada entrada pela soma de si mesma e pelo mínimo dos vizinhos acima e à esquerda, se existirem, e retorne a última entrada.
fonte
Perl 6 ,
5754 bytesExperimente online!
Explicação
fonte
$!
vez de&f
Röda ,
10089 bytesExperimente online!
-9 bytes graças ao vacas charlatão
fonte
Python 3 , 108 bytes
Experimente online!
Ungolfed
fonte
Gelatina , 21 bytes
Experimente online!
Quão?
fonte
APL (Dyalog Classic) ,
3732 bytesExperimente online!
+⍀+\
somas parciais horizontal e verticalmente - isso fornece uma superestimação inicial dos caminhos para cada quadrado9e9(
...)⍣≡
aplique "..." até a convergência, a cada passo passando um número muito grande (9 × 10 9 ) como argumento à esquerda,
adicione9e9
-s à esquerda da estimativa atual2⊣/
pegue a primeira de cada par de células consecutivas, eliminando efetivamente a última coluna2⊣⌿⍪
mesma coisa verticalmente - coloque9e9
em cima e solte a última linha(2⊣⌿⍪) ⌊ 2⊣/,
mínimos⍵+
adicione a matriz original⊢⌊
tente melhorar as estimativas atuais com isso⊃⌽,
célula inferior direitafonte
Carvão , 46 bytes
Experimente online! Link é a versão detalhada do código. Explicação: Isso provavelmente seria mais curto se houvesse três argumentos
reduce
em Charcoal.Preencha a matriz de trabalho com valores grandes, exceto o primeiro, que é zero.
Faça um loop pelas linhas da entrada.
Inicialize o total atual com o primeiro elemento da matriz de trabalho.
Faça um loop sobre as colunas da entrada.
Pegue o mínimo do total atual e o elemento atual da matriz de trabalho e adicione o elemento atual da entrada para fornecer o novo total atual.
E armazene isso de volta na matriz de trabalho pronta para a próxima linha.
Imprima o total assim que a entrada tiver sido completamente processada.
fonte
Geléia , 17 bytes
Experimente online!
fonte
Java 8,
197193 bytes-4 bytes graças a @ceilingcat .
Experimente online.
Explicação geral:
Na verdade, eu já fiz esse desafio há cerca de um ano com o Projeto Euler # 81 , exceto que isso foi limitado a uma matriz quadrada em vez de uma matriz
N
porM
. Então, modifiquei levemente meu código da época para dar conta disso.Soma primeiro a linha inferior e a coluna mais à direita da última célula para trás. Então, vamos usar a matriz de exemplo do desafio:
A última célula permanece a mesma. A segunda última célula da linha de fundo torna-se a soma:
1+1 = 2
e o mesmo para o segundo última célula da coluna mais à direita:1+7 = 8
. Continuamos fazendo isso, agora a matriz fica assim:Depois disso, examinamos todas as linhas restantes, uma a uma, de baixo para cima e da direita para a esquerda (exceto a última coluna / linha), e procuramos cada célula na célula abaixo e na direita para ver qual é menor.
Assim, a célula que contém o número
6
se torna8
, porque2
abaixo dele é menor que o8
direito dele. Então olhamos para o1
próximo (à esquerda) e fazemos o mesmo. Isso1
se torna5
, porque4
abaixo é menor que o8
direito.Então, depois que terminamos a penúltima linha, a matriz fica assim:
E continuamos fazendo isso para toda a matriz:
Agora, a primeira célula conterá nosso resultado, que é
8
neste caso.Explicação do código:
fonte
Braquilog ,
2625 bytesExperimente online!
-1 byte porque o corte não é necessário - você não pode assumir o comando de uma lista vazia
Provavelmente há muito espaço para jogar isso, mas preciso dormir.
A abordagem se resume a tentar todos os valores da saída, o menor primeiro (
∧≜.
) até que um caminho possa ser encontrado (b|bᵐ
) até o canto inferior direito (~g~g
) que produz essa soma (hhX&...↰+↙X
).fonte
Java (JDK) , 223 bytes
Recebe a entrada como uma lista 2D de entradas.
19 bytes adicionais para
import java.util.*;
incluídos.Experimente online!
Como funciona
fonte
Python 2 , 86 bytes
Experimente online!
Se
B
é a transposição deA
, a definição do problema implica issof(A)==f(B)
.A[1:]
é a matriz que estáA
faltando na linha superior.zip(*A[1:])
é a matriz que estáA
faltando na coluna mais à esquerda e transposta.sum(sum(A,()))
é a soma de todos os elementos emA
.Se
A
tiver apenas uma única coluna ou linha, haverá apenas um caminho, portanto,f
retorna a soma de todos os elementosA
; caso contrário, recurse e retornar a soma deA[0][0]
+ o menorf
deA
perder a linha superior ef
deA
perder a coluna mais à esquerda.fonte