о нет! Немо, наша маленькая рыба-клоун потерялась в океане ASCII, и его отец Марлин пытается найти его.
Ваша задача - безопасно доставить Марлина в Немо. Но будьте осторожны, у нас на свободе безумный питающий Брюс, так что лучше избегайте его любой ценой!
подробности
Вам дана прямоугольная сетка океана ASCII, содержащая только строчные буквы a-z
. Этот океан будет иметь nemo
, marlin
и bruce
внутри него, в виде непрерывного полиомино, всегда начиная с самой верхней ячейки в первом столбце полиомино. Так, например, из всех возможных тетромино действительные перечислены в приведенном ниже фрагменте
Но такие формы недопустимы и не будут присутствовать во входных данных:
omen
ne
mo
nem
o
o
m
en
nem
o
n
eo
m
Наконец, ваша задача - найти путь от marlin
плитки polyomino к плитке nemo
polyomino, убедившись, что ни одна ячейка в вашем пути не примыкает к bruce
плитке polyomino. Ваш вывод должен заменить все алфавиты, которые не являются частью marlin
тайла, nemo
тайла и пути, соединяющего их обоих символом из диапазона ASCII для печати (включая пробел), кроме строчных a-z
.
пример
Если входной океан выглядит следующим образом:
oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv
(с 3-мя множителями:
...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............
)
Тогда правильное решение может выглядеть так:
...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............
Ниже приведен фрагмент кода:
Заметки
- Сетка всегда будет идеальным прямоугольником и будет содержать только одну плитку полиомино
nemo
,marlin
иbruce
. - Ваш путь не должен проходить
bruce
или через любую из 4 смежных (вверх, вниз, влево и вправо) ячеек любой ячейки вbruce
тайле. - Всегда гарантируется, что будет хотя бы один допустимый путь от
marlin
доnemo
. - Здесь нет требования кратчайшего пути, так что сходите с ума!
- Даже если вам не нужно находить кратчайший путь, ни одна ячейка в пути (путь, кроме marlin или nemo) не может быть смежной с более чем двумя другими ячейками в пути.
- Путь не должен проходить через плитки
marlin
илиnemo
, так как это могло бы сбить с толку маленьких рыб при выборе направления. - Как обычно, вы можете написать программу или функцию, получая ввод через STDIN (или ближайший эквивалент), аргумент командной строки или параметр функции и производя вывод через STDOUT (или ближайший эквивалент), возвращаемое значение или параметр функции (out).
- Если многострочный ввод невозможен, вы можете предположить, что сетка соединена
|
символом, а не\n
. Вы также можете принять входные данные как массив строк сетки.
Это код гольф, поэтому выигрывает самая короткая запись в байтах.
источник
k
вышеl
будет видно марлин? (прокладывая путь от русских в марлине к немо)Ответы:
Matlab 560
560 байт при удалении всех ненужных пробелов, всех точек с запятой и всех комментариев. Можно было бы играть в гольф намного больше, но я устал сейчас (может быть, завтра ...) Всем спокойной ночи.
PS: я предположил, что путь должен иметь 4-х окрестность ('+') связности.
Вызов функции: (новые строки не нужны)
Выход:
Как это работает
Извлечение имен
Первая часть извлекает имена, например
nemo
, что делается функциейq()
. Функция сначала помечает все как 0, затем вначале встречается первая буква имени как1
, затем вторая буква, как2
будто есть1
соседство, затем третья и так далее. После этого долженnemo
быть только один4
. От этого мы идем назад, пока не найдем1
снова, а затем удаляем все остальные числа, которые были больше, поэтому мы получаем красивую маску, где маскируются буквыnemo
. Мы делаем это для всех трех имен, а затем можем перейти к поиску пути.Нахождение пути
Мы начинаем с позиций Марлина и шаг за шагом посылаем ударную волну через «изображение» дыры. На каждом шаге мы увеличиваем счетчик расстояний и отмечаем «пиксели» под волновым фронтом текущим расстоянием. (Как это обычно делается с алгоритмами кратчайшего пути.) Этот волновой фронт, очевидно, блокируется областью Брюса, поэтому он будет обтекать его. Этот шаг повторяется до тех пор, пока не будет достигнута верхняя граница. Эта (предположительно очень свободная) верхняя граница теперь является окружностью «изображения» (в любом случае самые короткие пути будут намного короче). В тестовом примере это выглядит примерно так:
Теперь начните с
nemo
пикселей и уменьшайте счетчик расстояний на каждом шаге и добавляйте соседа со следующим меньшим расстоянием (согласно той карте расстояний, которую мы рассчитали ранее) к нашему пути.источник
Питон 2 - 658
Очень и очень неэффективно как по времени, так и по памяти. Функция для идентификации шаблонов - это рекурсивная функция S, а функция для поиска путей - это C, которая в основном является ужасно неэффективной реализацией A *.
Для тестирования используйте этот (очень немного) менее гольфовый (который рассчитывает путь один раз вместо каждой плитки)
источник