Пусть A
быть m
от n
прямоугольной матрицы положительных целых чисел, где m
и n
также являются положительными целыми числами.
Нас интересуют пути RoD («вправо или вниз») от верхней левой ячейки A
до нижней правой ячейки; в пути RoD каждая последующая ячейка пути находится либо на одну ячейку справа, либо на одну ячейку вниз от предыдущей ячейки.
Учитывая любой такой путь RoD, мы можем взять сумму клеток A
в этом пути.
Например, рассмотрим матрицу 4 на 3:
[ [1, 2, 3, 4],
[5, 1, 6, 7],
[8, 2, 1, 1] ]
Тогда мы можем рассмотреть путь RoD:
1 > 2 3 4
v
5 1 6 7
v
8 2 > 1 > 1
который имеет сумму 1+2+1+2+1+1=8
. Стоит отметить, что этот путь имеет наименьшую сумму всех возможных путей RoD от верхнего левого до нижнего правого в этой матрице.
Таким образом, предлагаемая задача состоит в том, чтобы предоставить самую короткую функцию / программу на выбранном вами языке, которая выводит минимальную сумму, которую может иметь путь RoD из верхнего левого угла в нижний правый в данной матрице A
.
Обычные запрещенные лазейки действуют. Ваш вклад может быть в любом разумном формате; Ваш вывод должен быть целым числом.
Это код-гольф; ответы оцениваются по количеству байтов.
Тестовые случаи
[ [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
источник
JavaScript (ES6),
787776 байтПопробуйте онлайн!
комментарии
источник
Haskell,
6357 байтПопробуйте онлайн!
источник
MATL ,
38363029 байтСпасибо @Giuseppe за указание на ошибку, теперь исправленную.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
R , 90 байт
Попробуйте онлайн!
Наивное решение: выполнить итерацию по массиву (вниз по столбцам), заменив каждую запись суммой самой себя и минимума ее соседей сверху и слева, если они существуют, затем верните последнюю запись.
источник
Perl 6 ,
5754 байтаПопробуйте онлайн!
объяснение
источник
$!
вместо&f
Röda ,
10089 байтПопробуйте онлайн!
-9 байт благодаря шарлатану коров
источник
Python 3 , 108 байт
Попробуйте онлайн!
Ungolfed
источник
Желе , 21 байт
Попробуйте онлайн!
Как?
источник
APL (Дьялог Классик) ,
3732 байтаПопробуйте онлайн!
+⍀+\
частичные суммы по горизонтали и вертикали - это обеспечивает начальную переоценку путей к каждому квадрату9e9(
...)⍣≡
применять "..." до сходимости, на каждом шаге передавая очень большое число (9 × 10 9 ) в качестве левого аргумента,
добавить9e9
слева от текущей оценки2⊣/
взять первое из каждой пары последовательных ячеек, эффективно отбрасывая последний столбец2⊣⌿⍪
то же самое вертикально - положить9e9
сверху и опустить последний ряд(2⊣⌿⍪) ⌊ 2⊣/,
минимумы⍵+
добавить оригинальную матрицу⊢⌊
попытаться улучшить текущие оценки с этим⊃⌽,
нижняя правая ячейкаисточник
Древесный уголь , 46 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Пояснение: Вероятно, это было бы короче, если бы
reduce
в Charcoal было три аргумента .Заполните рабочий массив большими значениями, кроме первого, равного нулю.
Цикл по строкам ввода.
Инициализируйте текущую сумму с первым элементом рабочего массива.
Цикл по столбцам ввода.
Возьмите минимум текущего итога и текущий элемент рабочего массива и добавьте текущий элемент ввода, чтобы получить новый текущий итог.
И сохраните это обратно в рабочем массиве, готовом к следующему ряду.
Выведите итоговую сумму после полной обработки ввода.
источник
Желе , 17 байт
Попробуйте онлайн!
источник
Ява 8,
197193 байта-4 байта благодаря @ceilingcat .
Попробуйте онлайн.
Общее объяснение:
Я на самом деле уже сделал этот вызов около года назад с проектом Эйлера # 81 , за исключением того, что был ограничен квадратной матрицы вместо
N
отM
матрицы. Поэтому я немного изменил свой код, чтобы учесть это.Сначала я суммирую нижний ряд и самый правый столбец от самой последней ячейки назад. Итак, давайте использовать пример матрицы задачи:
Последняя ячейка остается прежней. Вторая последняя ячейка в нижней строке становится суммой:
1+1 = 2
, и то же самое для второй последней ячейки крайней правой колонки:1+7 = 8
. Мы продолжаем делать это, поэтому теперь матрица выглядит так:После этого мы смотрим на все оставшиеся строки по порядку снизу вверх и справа налево (кроме последнего столбца / строки), и ищем каждую ячейку как в ячейке под ней, так и справа от нее, чтобы увидеть какой из них меньше.
Таким образом, ячейка, содержащая число
6
становится8
, потому что2
ниже он меньше, чем8
справа от него. Затем мы смотрим на1
следующее (слева) и делаем то же самое. Это1
делается5
, потому что4
ниже он меньше, чем8
справа от него.Итак, после того, как мы закончили со вторым до последнего ряда, матрица выглядит следующим образом:
И мы продолжаем делать это для всей матрицы:
Теперь самая первая ячейка будет содержать наш результат, который
8
в этом случае.Объяснение кода:
источник
Брахилог ,
2625 байтПопробуйте онлайн!
-1 байт, потому что вырезать не нужно - вы не можете взять заголовок пустого списка
Там, наверное, много места для игры в гольф, но мне нужно поспать.
Подход сводится к тому, чтобы пробовать каждое значение для вывода, сначала наименьшее (
∧≜.
), пока не будет найден путь (b|bᵐ
) к нижнему правому углу (~g~g
), который производит эту сумму (hhX&...↰+↙X
).источник
Java (JDK) , 223 байта
Принимает ввод в виде 2D списка целых.
Дополнительные 19 байтов для
import java.util.*;
включения.Попробуйте онлайн!
Как это устроено
источник
Python 2 , 86 байт
Попробуйте онлайн!
Если
B
это транспонированиеA
, то определение проблемы подразумевает этоf(A)==f(B)
.A[1:]
массивA
отсутствует в верхней строкеzip(*A[1:])
массивA
отсутствует в крайнем левом столбце и транспонирован.sum(sum(A,()))
это сумма всех элементов вA
.Если
A
имеет только один столбец или одну строку, существует только один путь, поэтомуf
возвращает сумму всех элементов вA
; в противном случае мы рекурсия и возвратить суммуA[0][0]
+ меньшие изf
изA
отсутствующих верхней строки иf
вA
отсутствии самого левый столбца.источник