Щёлкни щёлкни Никто не знает, почему курица перешла дорогу, возможно, с другой стороны был красивый петух. Но мы можем выяснить, как. Напишите программу, которая слева направо пересекает эту (или любую) «дорогу».
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Ваша программа «пересекает» его, двигаясь слева направо. Вы начинаете с любого числа в крайнем левом столбце, который вам нравится. Оттуда вы можете перейти к любому соседнему персонажу справа. Если вы начали в левом верхнем углу, 1, вы можете перейти к 3 или 8. Каждый номер, на который вы идете, включая начальный номер, добавляется к сумме. Пробелы не добавляют к вашей сумме. "|" заставляет вас двигаться вверх или вниз, а не куда-то направо. (Вы НЕ МОЖЕТЕ продвинуться вперед в этом персонаже) Ваша цель - добраться до другой стороны с наименьшей возможной суммой. Ваша программа должна распечатать сумму в конце, и она должна быть в состоянии решить любую дорогу. Предпочтительно, он также может иметь вход для дороги, но это не обязательно. Ваша программа должна напечатать как путь, так и сумму. Побеждает несколько байтов кода.
Чтобы уточнить, вы можете двигаться диагностически, если вы не находитесь на вертикальной планке. Вы можете двигаться только вверх и вниз, когда находитесь на вертикальной полосе.
Для более точной спецификации дорог это в основном строка текста (или массив столбцов или строк, если вы предпочитаете так думать), которая следует правилам символов, и ничего не может быть, НО эти символы в дорога. Это может быть любое число, пробел, строка ("|") или перевод строки. Если дорога была проложена пьяным парнем, как в ответе ProgrammerDan, она все еще является действительной дорогой, и ваша программа должна быть в состоянии решить эту дорогу. Дорога не считается дорогой, если невозможно добраться до другой стороны (например, из прямой линии баров нет выхода).
Ваша программа не обязана определять, является ли дорога недействительной.
Ключ:
любое число - добавление числа к вашей сумме, движение вперед.
Пробел - двигаться вперед, к вашей сумме ничего не добавляется.
"|" - Перемещение вверх или вниз, ничего не добавляется к вашей сумме.
РЕДАКТИРОВАТЬ: пример решения, как предлагается. Я не могу сделать ужасно большой, я не могу войти в IDE, чтобы решить это для меня банкомат.
Возьми эту маленькую дорогу:
9191 | 8282
1919 | 2727
5555 5555
Решением будет путь 1, 1, 1, 1, пробел, делитель, делитель, пробел, пробел, 2, 2, 2, 2, всего 12.
РЕДАКТИРОВАТЬ # 2: Решение первой дороги в этом вопросе, как определено в программах Geobits и людей, составляет 0,2,0,1,,, 1,4,1,4 на сумму 13.
источник
|
подряд?0,2,0,1, , , ,1,4,1,4 -> 13
Ответы:
Pyth,
168143141 байт [теперь совместим с Drunken Road]Мой тестовый пример работает, но из-за недопонимания с моей стороны он не будет работать должным образом с первоначальным примером. Я работаю над тем, чтобы исправить это.Сейчас работаю на оригинальном примере и пьяных дорогах
Какой-то
ДЕЙСТВИТЕЛЬНОчуть менее уродливыйкод:Проверьте это здесь
Я проверил это на дороге 10 + 9 х 40.
источник
Ява, 955 байт
Очевидно, я не собираюсь выигрывать какие-либо награды, будучи Java и все такое, но я люблю эту проблему и хочу добавить свою собственную запись.
Особенности и ограничения:
Хорошо, достаточно Джибба Джабба. Гольф версия:
По моей привычке, github с нечистым кодом .
Решение для «первой» дороги:
Второй пример:
Образец Брайана Така:
Пример «пьяного» Брайана:
Решение визуализировано:
Наслаждайтесь!
Изменить: Теперь я просто хвастаюсь (две дороги сливаются! Он может сделать это?)
Решение:
(бонус: путь от негольфированного):
Подробности об алгоритме
Было запрошено более полное объяснение техники динамического программирования, которую я использовал, поэтому здесь:
Я использую метод решения с использованием меток и предварительных вычислений. У него правильное имя, но я давно его забыл; возможно кто-то еще может предложить это?
Алгоритм:
Примечания:
Вот и все. Мы сканируем сверху вниз, справа налево, один раз; единственные ячейки, которые были затронуты (потенциально) более одного раза, - это трубы, однако каждая труба «решается» только один раз, удерживая нас в нашем окне O (m * n).
Для обработки «нечетных» размеров карты я предпочел просто предварительно отсканировать и нормализовать длину строк, дополнив их нулевыми символами. Нулевые символы считаются как "нулевые затраты", такие же, как трубы и пробелы. Затем при печати решения я прекращаю печатать затраты или перемещения, когда достигается либо край нормализованной дороги, либо нулевой символ.
Прелесть этого алгоритма в том, что он очень прост, применяет одни и те же правила к каждой ячейке, создавая полное решение путем решения подзадач O (m * n), и с точки зрения скорости довольно быстро. Он компенсирует память, эффективно создавая две копии в памяти карты проезжей части: первая для хранения данных с «наилучшей стоимостью», а вторая для хранения данных «с наилучшим перемещением» на ячейку; это типично для динамического программирования.
источник
c
как-1>>>1
.