Учитывая вход ASCII художественной «дороги», выведите дорогу со всеми тупиками, помеченными.
Это дорога:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Это дорога с тупиками, обозначенная буквой X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Под тупиком понимается любая дорожная плитка, которая граничит с n другими дорожными плитками, по крайней мере, n-1 из них уже считаются тупиками по этому правилу. «Границы» находятся в четырех основных направлениях, поэтому плитки, граничащие по диагонали, не учитываются.
Это правило применяется неоднократно, поскольку вновь созданные тупики сами по себе могут создавать больше тупиков . Также обратите внимание, что любая дорожная плитка, ограничивающая только одну другую дорожную плитку, считается тупиком при первом применении правила.
Вход и выход могут быть либо одной строкой (со строками, разделенными любым символом, который не является #
или .
), либо массивом / списком / и т.д. Если ваш язык поддерживает это, вы также можете использовать входные данные, где каждая строка является аргументом функции.
Вы можете предположить следующее относительно ввода:
Всегда будет хотя бы один «цикл», то есть группа
#
символов, за которыми можно следовать бесконечно. (В противном случае каждая отдельная плитка станет тупиком.)Это подразумевает, что вход всегда будет 2 × 2 или больше, так как наименьший цикл:
## ##
(Который, кстати, должен выводиться без изменений.)
Все
#
персонажи будут связаны. То есть, если бы вы выполнили заливку на любом#
из них, все они были бы затронуты.
Поскольку это код-гольф , победит самый короткий код в байтах.
Приведенный выше пример и крошечная сетка 2 × 2 могут быть использованы в качестве тестовых случаев (в этой задаче не так много краевых случаев).
'#
и"#"
разные в CJam?"#"
равно['#]
.JavaScript (ES6),
110109 байт1 байт сохранен благодаря @ edc65 !
объяснение
Очень простой подход к проблеме. Выполняет поиск каждого из них
#
и, если#
вокруг него менее 2 секунд, заменяет его наX
. Повторяет этот процесс много раз, пока не будет гарантировано, что все тупики заменены наX
s.источник
l=~r.search
вместоl=1+r.search
. (Только 1 байт сохранен)Python (3,5)
362331329314 байтблагодаря @ Алисса. она помогает мне выиграть ~ 33 байта
Пояснения
Определение функции
Добавьте границу '.' справа и слева от доски
Добавьте границу '.' сверху и снизу
Лямбда-функция для проверки '#'
Цикл по длине ввода, чтобы убедиться, что мы не забываем тупики
Цикл по столбцам и строкам
Проверьте, есть ли у нас «#» вокруг и на позиции
Заменить "#" на "X"
Обрежьте границу, заполненную знаком "." и присоединиться к строке
использование
источник
split()
вместоsplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
короче. И это может быть сокращено еще больше:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) вам не нужен весь список (zip (....)), используйтеprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. список позволяет мне использовать t [h] [x] = 'X'r
,g
иd
) из вашей функции (экономит вам некоторое суммирование). Может быть, некоторые игры по split () могут помочь:t=[d+list(i)+d for i in s.split()]
затем вычислить длину, затем добавить пунктирные линии в конец и в начало, а затем изменить циклы для работы с этими расширенными длинами. Не уверен, сократит ли он код, но может