Это второй из серии испытаний Island Golf. Предыдущий вызов
Два отшельника прибыли на необитаемый остров. Поскольку они пришли искать уединения, они хотят жить как можно дальше друг от друга. Где они должны строить свои хижины, чтобы максимизировать расстояние между ними?
вход
Ваш ввод будет прямоугольной сеткой, состоящей из двух символов, представляющих землю и воду. В приведенных ниже примерах земля есть, #
а вода есть .
, но вы можете заменить любые два разных символа по вашему желанию.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Там всегда будет как минимум две плитки земли. Плитки земли все будут смежными (то есть есть только один остров). Водяные плитки также будут смежными (т.е. там нет озер). Внешняя граница сетки будет водяной плиткой. Плитки земли не будут связаны по диагонали: то есть вы никогда не увидите ничего подобного
....
.#..
..#.
....
Выход
Ваш код должен выводить ту же сетку с двумя отмеченными местоположениями хижины . В приведенных ниже примерах местоположения хижины помечены знаком X, но вы можете заменить любого персонажа, если он отличается от ваших символов земли и воды.
Места хижины должны быть двумя плитками земли, выбранными таким образом, чтобы максимизировать расстояние между ними. Мы определяем расстояние ходьбы как длину кратчайшего пути, полностью на суше, между двумя точками. Наземные плитки считаются смежными по горизонтали или вертикали, но не по диагонали.
Возможное решение для вышеуказанного острова:
...........
...X#......
..#####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
Пешком между этими двумя точками является 11, что является наибольшим расстоянием между любыми двумя точками на этом острове. Существует еще одно решение дистанции 11:
...........
...##......
..X####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
Детали
Ваше решение может быть полной программой или функцией . Любой из методов ввода и вывода по умолчанию является приемлемым.
Ваш ввод и вывод может быть многострочной строкой, списком строк или двумерным массивом / вложенным списком символов / односимвольных строк. Ваш вывод может (опционально) иметь один завершающий перевод строки. Как упоминалось выше, вы можете использовать любые три различных символа вместо #.X
(пожалуйста, укажите в своем представлении, какие символы вы используете).
Контрольные примеры
А. Острова с уникальными местами размещения в хижине:
....
.##.
....
....
.XX.
....
......
......
..##..
...#..
......
......
......
......
..X#..
...X..
......
......
........
.#####..
.##..##.
.#..###.
.##..##.
........
........
.#####..
.##..##.
.#..###.
.#X..#X.
........
.........
.#####.#.
.#...#.#.
.#.###.#.
.#.....#.
.#######.
.........
.........
.#####.X.
.#...#.#.
.#.X##.#.
.#.....#.
.#######.
.........
Б. Пример острова с несколькими возможными решениями:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Возможные выводы:
........
....#X..
...####.
..###...
.#####..
.X####..
..##....
........
........
....#X..
...####.
..###...
.#####..
.#####..
..X#....
........
........
....##..
...###X.
..###...
.#####..
.X####..
..##....
........
........
....##..
...###X.
..###...
.#####..
.#####..
..X#....
........
Это код-гольф : выигрывает самый короткий код на каждом языке.
Ответы:
Python 3,
249246 байтПобрил 3 байта, спасибо DLosc.
Вход и выход - одиночные строки, где '.', '@' И 'X' представляют воду, хижины и землю соответственно.
Предыдущая версия:
Ввод - это одна строка с '.' и «#» представляет воду и землю соответственно. «Х» представляет хижины на выходе.
Объяснение:
Это в основном поиск в ширину по всем возможным отправным точкам одновременно. Сохраните словарь, d, длины пути, обозначенные началом и концом пути, например, d [(k, i)] - это расстояние от k до i. Затем перебираем ключи в словаре d и создаем новый словарь u с путями, которые на 1 единицу длиннее, перемещая конечную точку на 1 единицу в N, S, E, W, например, u [(k, i + 1)] = d [(k, i)] + 1. Не включайте пути, которые уже есть в d. Если u не пусто, добавьте новые более длинные пути к d и повторите. Когда u пусто, это означает, что больше пути не могут быть сделаны. Теперь d содержит все возможные пути и их длины. Так что это просто вопрос получения ключа с самым длинным путем.
Менее гольф, прокомментированная версия:
источник
C #, 387 байт
Давайте запустим мяч ...
Попробуйте онлайн
Полная программа, читает из STDIN, пишет в STDOUT. Он просто перебирает каждую ячейку и запускает BFS для вычисления самой дальней ячейки, записывая обе, если она самая дальняя в записи. Ничего особенного, и, к сожалению, мало что я могу найти в гольфе.
Отформатированный и закомментированный код:
источник