Введение
У меня есть комната, полная волшебных зеркал . Это загадочные артефакты, которые могут дублировать любой предмет, кроме другого волшебного зеркала. Более точно, дублированная версия предмета появится на другой стороне зеркала, на том же расстоянии. Однако, если с обеих сторон на пути между дублирующим зеркалом и каким-либо предметом (оригиналом или дубликатом) находится другое волшебное зеркало, дубликат не формируется. Оригинальный предмет может быть слева или справа от зеркала, а дубликат появится на другой стороне. Кроме того, дубликат предмета может сам дублироваться другим зеркалом. Элементы никогда не блокируют дублирование других элементов (за исключением того, что они находятся непосредственно на позиции потенциального дубликата).
вход
Ваш ввод - это строка, состоящая из символов .#|
, которые представляют пустое пространство, предметы и магические зеркала. На входе всегда будет хотя бы одно волшебное зеркало.
Выход
В результате вы получите еще одну строку, в которой каждое волшебное зеркало дублирует каждый элемент, в соответствии с приведенными выше правилами. Вы можете предположить, что на месте, где появляется дубликат, всегда будет пустое место (чтобы они не выходили за пределы).
Примеры
Рассмотрим входную строку
.#.|.....|......#
A B C D
где мы отметили некоторые позиции для ясности. Зеркало B
дублирует элемент A
, который заканчивается справа от него:
.#.|.#...|......#
A B C D
C
Затем зеркало дублирует новый элемент:
.#.|.#...|...#..#
A B C D
Зеркало C
не может дублировать предмет A
, так как зеркало B
мешает. Он также не может дублировать элемент D
, так как зеркало B
находится на пути с другой стороны. Аналогично, зеркало B
не может дублировать элемент D
или дубликат рядом с ним, так как зеркало C
мешает, так что это правильный вывод.
Для другого примера рассмотрим ввод
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
Зеркало D
можно дублировать A
и B
вправо, E
и G
влево.
C
и F
уже дублируют друг друга. Строка становится
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Зеркало H
может дублировать E
, F
и дубликаты A
и B
вправо, и I
влево.
G
и J
уже дублируют друг друга, а зеркало D
стоит на пути K
. Теперь у нас есть
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Наконец, зеркало D
может дублировать копию I
слева. Мы заканчиваем с
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Правила и оценки
Вы можете написать либо полную программу, либо функцию. Побеждает самое низкое число байтов. Работы, в которых не используются движки регулярных выражений, конкурируют отдельно от тех, которые используют регулярные выражения, и могут быть помечены (без регулярных выражений) .
Контрольные примеры
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"