Wprowadzenie
Mam pokój pełen magicznych luster . Są to tajemnicze artefakty, które mogą powielić dowolny przedmiot, z wyjątkiem innego magicznego lustra. Mówiąc dokładniej, duplikat wersji elementu pojawi się po drugiej stronie lustra, w tej samej odległości. Jeśli jednak po obu stronach znajduje się inne magiczne lustro, między lustrem do duplikowania a dowolnym przedmiotem (oryginalnym lub duplikatem), duplikat nie jest tworzony. Oryginalny element może znajdować się po lewej lub prawej stronie lustra, a duplikat pojawi się po drugiej stronie. Ponadto zduplikowany element może sam zostać powielony przez inne dublowanie. Przedmioty nigdy nie blokują powielania innych przedmiotów (z wyjątkiem tego, że znajdują się bezpośrednio na pozycji potencjalnego duplikatu).
Wkład
Twój wkład to ciąg znaków składający się z znaków .#|
reprezentujących puste miejsce, przedmioty i magiczne zwierciadła. Na wejściu zawsze będzie przynajmniej jedno magiczne lustro.
Wydajność
Twój wynik będzie kolejnym ciągiem, w którym każde magiczne lustro powieli każdy możliwy przedmiot, zgodnie z powyższymi zasadami. Możesz założyć, że w miejscu, w którym pojawi się zduplikowany przedmiot, zawsze będzie puste miejsce (więc nie będą przekraczać granic).
Przykłady
Rozważ ciąg wejściowy
.#.|.....|......#
A B C D
gdzie zaznaczyliśmy niektóre pozycje dla jasności. Lustro B
duplikuje element A
, który kończy się po jego prawej stronie:
.#.|.#...|......#
A B C D
Mirror C
następnie powiela nowy element:
.#.|.#...|...#..#
A B C D
Lustro C
nie może powielić elementu A
, ponieważ przeszkadza mu lustro B
. Nie może również powielać przedmiotu D
, ponieważ lustro przeszkadza B
po drugiej stronie. Podobnie, lustro B
nie może powielić elementu D
lub duplikatu obok niego, ponieważ lustro przeszkadza C
, więc jest to prawidłowe wyjście.
W innym przykładzie rozważmy dane wejściowe
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
Lustro D
może powielać A
i B
na prawo, a E
i G
w lewo.
C
i F
są już duplikatami. Ciąg staje się
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Lustro H
może powielać E
, F
oraz duplikaty A
i B
na prawo i I
na lewo.
G
i J
są już duplikatami, a lustro D
jest na drodze K
. Teraz mamy
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Wreszcie lustro D
może powielić duplikat I
po lewej stronie. Kończymy z
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów. Zgłoszenia, które nie używają silników wyrażeń regularnych, konkurują osobno z tymi, które to robią i mogą być oznaczone symbolem (bez wyrażeń regularnych) .
Przypadki testowe
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"
Odpowiedzi:
Siatkówka , 50 bajtów
Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
Wydaje mi się, że jest to przeciwieństwo przedłożenia (bez wyrażenia regularnego).
Wyjaśnienie
Jest to po prostu podstawienie wyrażenia regularnego, które jest stosowane wielokrotnie (
+
), aż łańcuch przestanie się zmieniać. Używam grup równoważących, aby upewnić się, że dwie pozycje lustrzane znajdują się w tej samej odległości od danego lustra (odwołania wsteczne nie zrobią, ponieważ dokładny ciąg po obu stronach|
może być inny).Zastępuje się to,
#$2#
co po prostu zamienia zarówno pierwszy, jak i ostatni znak meczu na#
.źródło
Perl, 49 bajtów
Pełne uznanie dla @Martin Ender dla tego, który zasugerował to wyrażenie o 15 bajtów krótsze niż moje.
47 bajtów kodu +
-pl
flagiAby uruchomić:
Pierwsza (
([.#])
) i ostatnia ((?!\1)[^|]
) część są takie same jak w odpowiedzi Retina (patrz objaśnienie tam).Środkowa część (
(\||[^|](?2)[^|])
) używa perl recursion ((?2)
), aby dopasować albo mirror (\|
) albo (|
) dwa znaki inne niż mirrors ([^|]
) oddzielone tym samym wzorcem ((?2)
).Moja starsza (i brzydsza) wersja:
s/([.#])(([^|]*)\|(??{$3=~s%.%[^|]%gr}))(?!\1)[^|]/#$2#/&&redo
źródło
Haskell (bez wyrażenia regularnego), 117 bajtów
źródło
PHP,
123117100 bajtówprogram pobiera argument wiersza poleceń, wyrażenie regularne wzięte z @Martin Ender / Dada. Uruchom z
-r
.źródło
C, 176 bajtów
Nie golfił
źródło
'#'
i'.'
z35
i46
odpowiednio.x,i,j;void t(char*a){while(a[i]++)if(a[i]=='|'){for(j=x;a[j++]&&j<=i*2-x;j++){if((a[j]==35)&&(a[2*i-j]==46)){a[2*i-j]=35;i=-1;break;}if((i-j)&&(a[j]=='|'))break;}x=i+1;}}
- 170 bajtówJavaScript (ES6), 170 bajtów
Nie golfowany:
źródło