Vamos a A
ser una m
por n
matriz rectangular de positivos enteros, donde m
y n
son también positivos enteros.
Estamos interesados en rutas RoD ('Derecha o Abajo') desde la celda superior izquierda a la celda A
inferior derecha; en una ruta RoD, cada celda sucesiva de la ruta es una celda a la derecha o una celda abajo de la celda anterior.
Dada cualquier ruta de RoD, podemos tomar la suma de las celdas A
en esa ruta.
Por ejemplo, considere la matriz 4 por 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Entonces podemos considerar la ruta de RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
que tiene una suma de 1+2+1+2+1+1=8
. Vale la pena señalar que esta ruta tiene la suma más pequeña de todas las rutas de RoD posibles desde la parte superior izquierda a la inferior derecha en esa matriz.
Por lo tanto, el desafío propuesto es proporcionar la función / programa más corto en su idioma de elección que genere la suma mínima que puede tener una ruta RoD desde la parte superior izquierda a la inferior derecha en una matriz determinada A
.
Las lagunas prohibidas habituales están vigentes. Su entrada puede estar en cualquier formato razonable; Su salida debe ser un número entero.
Este es el código de golf; Las respuestas se puntúan por número de bytes.
Casos de prueba
[ [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
fuente
JavaScript (ES6),
787776 bytesPruébalo en línea!
Comentado
fuente
Haskell,
6357 bytesPruébalo en línea!
fuente
MATL ,
38363029 bytesGracias a @Giuseppe por señalar un error, ahora corregido.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
R , 90 bytes
Pruébalo en línea!
La solución ingenua: iterar a través de la matriz (hacia abajo en las columnas), reemplazando cada entrada por la suma de sí misma y el mínimo de sus vecinos superiores e izquierdos, si existen, luego devuelva la última entrada.
fuente
Perl 6 ,
5754 bytesPruébalo en línea!
Explicación
fuente
$!
lugar de&f
Röda ,
10089 bytesPruébalo en línea!
-9 bytes gracias a Cows quack
fuente
Python 3 , 108 bytes
Pruébalo en línea!
Sin golf
fuente
Jalea , 21 bytes
Pruébalo en línea!
¿Cómo?
fuente
APL (Dyalog Classic) ,
3732 bytesPruébalo en línea!
+⍀+\
sumas parciales horizontal y verticalmente: esto proporciona una sobreestimación inicial de los caminos a cada cuadrado9e9(
...)⍣≡
aplique "..." hasta la convergencia, en cada paso pasando un número muy grande (9 × 10 9 ) como argumento izquierdo,
agrega9e9
-s a la izquierda de la estimación actual2⊣/
tome la primera de cada par de celdas consecutivas, dejando caer efectivamente la última columna2⊣⌿⍪
lo mismo verticalmente - poner9e9
encima y suelte la última fila(2⊣⌿⍪) ⌊ 2⊣/,
mínimos⍵+
agregue la matriz original⊢⌊
tratar de mejorar las estimaciones actuales con eso⊃⌽,
celda inferior derechafuente
Carbón , 46 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: Esto probablemente sería más corto si hubiera tres argumentos
reduce
en Charcoal.Rellene el conjunto de trabajo con valores grandes, excepto el primero, que es cero.
Pase sobre las filas de la entrada.
Inicialice el total actual con el primer elemento de la matriz de trabajo.
Pase sobre las columnas de la entrada.
Tome el mínimo del total actual y el elemento actual de la matriz de trabajo y agregue el elemento actual de la entrada para obtener el nuevo total actual.
Y guárdelo en la matriz de trabajo listo para la siguiente fila.
Imprima el total una vez que la entrada se haya procesado por completo.
fuente
Jalea , 17 bytes
Pruébalo en línea!
fuente
Java 8,
197193bytes-4 bytes gracias a @ceilingcat .
Pruébalo en línea.
Explicación general:
De hecho, ya hice este desafío hace aproximadamente un año con el Proyecto Euler # 81 , excepto que estaba limitado a una matriz cuadrada en lugar de una matriz
N
porM
. Entonces modifiqué un poco mi código desde entonces para dar cuenta de eso.Primero sumo la fila inferior y la columna de la derecha desde la última celda hacia atrás. Entonces usemos la matriz de ejemplo del desafío:
La última celda permanece igual. La segunda última celda de la fila inferior se convierte en la suma:
1+1 = 2
y lo mismo para el segundo última celda de la columna más a la derecha:1+7 = 8
. Continuamos haciendo esto, así que ahora la matriz se ve así:Después de hacer eso, observamos todas las filas restantes, una por una, de abajo hacia arriba y de derecha a izquierda (excepto la última columna / fila), y buscamos cada celda tanto en la celda debajo como a la derecha para ver cuál es más pequeño
Por lo tanto, la celda que contiene el número se
6
vuelve8
, porque el2
siguiente es más pequeño que el8
derecho. Luego miramos el1
siguiente (a la izquierda) y hacemos lo mismo. Eso se1
convierte5
, porque el4
siguiente es más pequeño que el8
derecho.Entonces, después de terminar con la penúltima fila, la matriz se ve así:
Y continuamos haciendo esto para toda la matriz:
Ahora la primera celda contendrá nuestro resultado, que es
8
en este caso.Explicación del código:
fuente
Brachylog ,
2625 bytesPruébalo en línea!
-1 byte porque el corte no es necesario: no puede tomar el encabezado de una lista vacía
Probablemente haya mucho espacio para jugar al golf, pero necesito dormir.
El enfoque se reduce a probar cada valor para la salida, el más pequeño primero, (
∧≜.
) hasta que se pueda encontrar una ruta (b|bᵐ
) a la esquina inferior derecha (~g~g
) que produce esa suma (hhX&...↰+↙X
).fuente
Java (JDK) , 223 bytes
Toma entrada como una lista 2D de entradas.
19 bytes adicionales para
import java.util.*;
incluidos.Pruébalo en línea!
Cómo funciona
fuente
Python 2 , 86 bytes
Pruébalo en línea!
Si
B
es la transposición deA
, entonces la definición del problema implica quef(A)==f(B)
.A[1:]
es la matriz queA
falta su fila superior.zip(*A[1:])
es la matriz queA
falta su columna más a la izquierda y se transpone.sum(sum(A,()))
es la suma de todos los elementos enA
.Si
A
solo tiene una columna o una fila, solo hay una ruta, por lo quef
devuelve la suma de todos los elementosA
; de lo contrario, son recursivos y devolver la suma deA[0][0]
+ la más pequeña def
deA
falta la fila superior yf
de laA
falta de la columna de la izquierda.fuente