Учитывая квадрат положительных натуральных чисел, напишите программу, найдите горизонтальный и вертикальный путь с суммой чисел вдоль них, являющейся максимальной. Горизонтальный путь проходит от первого столбца до последнего и должен увеличить свою позицию столбца по одному в каждом шаге. Вертикальный путь проходит от первой строки до последнего и должен увеличить свою позицию строки по одному в каждом шаге. Кроме того, положение строки в горизонтальной траектории может оставаться неизменным или изменяться на единицу в любом направлении, аналогично для вертикальных траекторий.
Чтобы проиллюстрировать это, допустимым может быть следующее:
Следующий путь будет недопустимым, поскольку он идет назад (и в некоторых местах остается в той же строке):
Следующий путь будет в равной степени недействительным, так как он меняет положение строки более чем на один шаг:
Примечание. Решение должно работать в течение приемлемого периода времени.
вход
n строк ввода с n разделенными пробелом положительными целыми числами каждая дана на стандартном вводе. 2 ≤ n ≤ 40. Каждая строка заканчивается разрывом строки. Числа достаточно малы, чтобы максимальная сумма помещалась в 32-разрядное целое число со знаком.
Выход
Максимальные суммы горизонтальных и вертикальных путей (в указанном порядке) разделены одним пробелом.
Пример ввода 1
1 2
1 2
Пример вывода 1
3 4
Пример ввода 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 4 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 4 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Пример вывода 2
37 35
Пример ввода 3
683 671 420 311 800 936
815 816 123 142 19 831
715 588 622 491 95 166
885 126 262 900 393 898
701 618 956 865 199 537
226 116 313 822 661 214
Пример вывода 3
4650 4799
Для вашего удобства мы подготовили несколько тестовых примеров в bash (благодаря Ventero ) и PowerShell, через которые вы можете запустить свою программу. Invocation:, <test> <command line>
так что-то вроде ./test python paths.py
или ./test.ps1 paths.exe
. Веселиться :-)
bash
тестовый скрипт! Я хотел бы, чтобы весь код гольф пришел с таким.Ответы:
GolfScript - 49 улучшенных персонажей Nabb
51 символ50 строго и крайне необходимых символов + 3 бездельника, которые выполнили работу только из 156 в основном избыточных символов51 решение:
53 решение:
Этот метод работает с двумя строками одновременно, одна из которых содержит максимальные суммы, достигнутые в каждой точке, а другая содержит следующую строку.
a / 14: повторите дважды, один раз для каждого результата.
8: Возьмите первую строку из ввода и переключите ее за массив ввода, теперь это первый набор максимальных сумм.
b / 13: перебирать каждую оставшуюся строку в массиве.
9: Поставьте 0 в начале максимальной суммы.
c / 12: перебирать каждый элемент строки.
10: Сделайте копию максимальных сумм с удаленным первым элементом.
11: Возьмите первые 3 элемента максимальных сумм, отсортируйте их и добавьте наибольшее к текущему элементу строки.
56 решение:
1: От ввода до массива массивов в 9 символов, на самом деле это можно было сделать всего с 1, но я сломал этот ключ, так что это придется делать.
2: 4 символа, просто чтобы сделать транспонированную копию.
3: Массив 99 0 в 5 символах, вероятно, это можно сделать более умным способом, но я курю слишком много травки, чтобы понять, как это сделать.
4: Слишком сложный двойной цикл, который перебирает каждый элемент ввода и выполняет некоторую нечеткую логику или что-то подобное для получения результата. Набб, вероятно, сделает что-то эквивалентное в 3½ символа.
5: к настоящему моменту результат есть, внутри массива, то есть этот глупый кусок кода только для того, чтобы вытащить его (и отбросить кусок остатков (и переключить результат на место)).
6: эта команда настолько проста, что ее количество символов, вероятно, будет отрицательным в оптимальном решении. 7: на этом этапе программа действительно выполнена, но из-за неаккуратности в предыдущем коде вывод находится в неправильном порядке и ему не хватает пробела, так что здесь идет еще несколько битов.
источник
{}*
вместо(\{}%
.J, 91
95Я отказываюсь делать IO, резко снижая свой счет.Пройдены все тесты в тестовом жгуте (хотя он работает только в том случае, если ввод заканчивается на конце строки, как в тестовом жгуте).Я удалил обработку для концов строк Windows, так как Крис предположил, что в этом нет необходимости. Мультиплатформенная версия будет иметь
a=:".;._2 toJ(1!:1)3
в качестве первой строки.Объяснение:
f
дает пару решений, вызывая p нормально и с помощью input transposed (|:
).p
принимает максимум (>./
) итоговых сумм от примененияc
между каждой строкой (c/
)c
занимает две строки (х и у). Он добавляет x к каждому из y, y сдвигается на 1 ячейку (1|.!.0 y
), а y сдвигается на 1 ячейку (_1|.!.0 y
). Затем он берет максимумы трех альтернатив для каждого ряда. (>./
). Остальное - звание [sic] - я не уверен, правильно ли я это делаю.источник
Haskell: 314 необходимых символов
Примечание: для этого требуется модуль Data.Vector . Я не уверен, включен ли он в платформу Haskell или нет.
Безголовая версия:
Это решение использует лень в тандеме с Data.Vector для запоминания . Для каждой точки вычисляется решение для максимального пути от нее до конца, затем сохраняется в ячейке Vector
m
и повторно используется при необходимости.источник
Ruby 1.9, 155 символов
Простое решение, которое проходит все тестовые случаи.
источник
Хаскель, 154 персонажа
источник
zipWith3
сокращать код?foldl1 max
, который добавляет символы, но позволяет вам разложить foldl1 и max, что должно сохранять символы.maximum.foldl1
,max
Иmax
--vs--f=foldl1;m=max;
,f m.f
,m
, иm
. - или 20 против 22. Так что нет, это не спасает.m=max
. Что насчет zipWith3?J 109 + 10 = 119 символов
Запустить с
tr
:Как обычно в J, большая часть кода предназначена для ввода / вывода. «Фактический» код состоит из 65 символов:
Проходит все тесты
источник
#!/usr/bin/env jconsole
поверх файла и установите флаг исполняемого файла.Питон, 149
Если бы я рассчитывал только кратчайший путь по вертикали или по горизонтали,
это можно было бы сделать на месте, сэкономив около трети байтов.
источник
Python, 204 символа
источник