Einführung
Ich habe einen Raum voller Zauberspiegel . Es handelt sich um mysteriöse Artefakte, die jedes Objekt, mit Ausnahme eines weiteren magischen Spiegels, duplizieren können. Genauer gesagt wird eine doppelte Version des Elements auf der anderen Seite des Spiegels im gleichen Abstand angezeigt. Befindet sich jedoch auf beiden Seiten ein anderer magischer Spiegel zwischen dem duplizierenden Spiegel und einem Gegenstand (Original oder Duplikat), wird das Duplikat nicht gebildet. Das Originalelement kann sich entweder links oder rechts vom Spiegel befinden, und das Duplikat wird auf der anderen Seite angezeigt. Das duplizierte Element kann auch selbst von einem anderen Spiegel dupliziert werden. Gegenstände blockieren niemals die Vervielfältigung anderer Gegenstände (es sei denn, sie befinden sich direkt an der Position des möglichen Gegenstands).
Eingang
Ihre Eingabe ist eine Zeichenfolge, die aus den Zeichen besteht .#|
, die Leerzeichen, Objekte und magische Spiegel darstellen. In der Eingabe befindet sich immer mindestens ein Zauberspiegel.
Ausgabe
Ihre Ausgabe soll eine andere Zeichenfolge sein, in der jeder Magic Mirror alle Objekte dupliziert hat, die er kann, gemäß den obigen Regeln. Sie können davon ausgehen, dass an der Stelle, an der ein doppeltes Element angezeigt wird, immer ein leerer Bereich vorhanden ist (sodass diese Bereiche nicht überschritten werden).
Beispiele
Betrachten Sie die Eingabezeichenfolge
.#.|.....|......#
A B C D
wo wir aus Gründen der Übersichtlichkeit einige Positionen markiert haben. Der Spiegel B
dupliziert das Element A
, das rechts davon endet:
.#.|.#...|......#
A B C D
Spiegeln C
dupliziert dann das neue Objekt:
.#.|.#...|...#..#
A B C D
Spiegeln C
kann kein Objekt duplizieren A
, da Spiegeln B
im Weg ist. Es kann auch kein Objekt dupliziert werden D
, da der Spiegel B
auf der anderen Seite im Weg ist. Ebenso kann der Spiegel B
nicht das Objekt D
oder das Duplikat daneben duplizieren, da der Spiegel C
im Weg ist, sodass dies die richtige Ausgabe ist.
Betrachten Sie für ein anderes Beispiel die Eingabe
.##..#...|#..##...|..##....#.
AB C DE FG H IJ K
Mirror D
kann duplizieren A
und B
nach rechts E
und G
nach links.
C
und F
sind bereits Duplikate voneinander. Die Zeichenfolge wird
.##.##..#|#..##.##|..##....#.
AB C DE FG H IJ K
Mirror H
kann duplizieren E
, F
und die Duplikate von A
und B
rechts und I
links.
G
und J
sind bereits Duplikate voneinander, und der Spiegel D
steht im Weg von K
. Jetzt haben wir
.##.##..#|#..#####|#####..##.
AB C DE FG H IJ K
Schließlich kann Mirror D
das Duplikat von I
links duplizieren . Wir enden mit
.#####..#|#..#####|#####..##.
AB C DE FG H IJ K
Regeln und Wertung
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt. Einsendungen, die keine regulären Ausdrücke verwenden, konkurrieren getrennt von denen, die dies tun, und können mit (kein regulärer Ausdruck) gekennzeichnet sein .
Testfälle
"|" -> "|"
"..|.." -> "..|.."
".#.|..." -> ".#.|.#."
"..#|.#." -> ".##|##."
".#..|....|.." -> ".#..|..#.|.#"
".|..|.#....." -> "#|#.|.#....."
"...|.#...|....#" -> ".##|##...|...##"
"......#|......." -> "......#|#......"
".#.|.....|......#" -> ".#.|.#...|...#..#"
".......|...#.##|...." -> "##.#...|...#.##|##.#"
"...#..||.......#..#...#" -> "...#..||.......#..#...#"
".##|.#....||#||......#|.#" -> ".##|##....||#||.....##|##"
".##..#...|#..##...|..##....#." -> ".#####..#|#..#####|#####..##."
".#|...||...|#...|..##...|#...." -> ".#|#..||.##|##..|..##..#|#..##"
"....#.|...#.|..|.|.....|..#......" -> "..#.#.|.#.#.|.#|#|#.#..|..#.#...."
"..|....|.....#.|.....|...|.#.|..|.|...#......" -> ".#|#...|...#.#.|.#.#.|.#.|.#.|.#|#|#..#......"
Antworten:
Netzhaut , 50 Bytes
Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Ich denke, dies ist das Gegenteil einer (nicht regulären) Einreichung.
Erläuterung
Dies ist einfach eine reguläre Ersetzung, die wiederholt angewendet wird (
+
), bis sich die Zeichenfolge nicht mehr ändert. Ich benutze Bilanzgruppen , um sicherzustellen, dass die beiden gespiegelten Positionen den gleichen Abstand zum angegebenen Spiegel haben (Rückreferenzen reichen nicht aus, da die exakte Zeichenfolge auf beiden Seiten der|
möglicherweise unterschiedlich ist).Dies wird ersetzt
#$2#
, indem einfach sowohl das erste als auch das letzte Zeichen der Übereinstimmung durch a ersetzt werden#
.quelle
Perl, 49 Bytes
Voller Dank an @Martin Ender für diesen, der diese Regex vorgeschlagen hat, die 15 Byte kürzer ist als meine.
47 Byte Code +
-pl
FlagsUm es auszuführen:
Der erste (
([.#])
) und der letzte ((?!\1)[^|]
) Teil sind die gleichen wie in der Retina-Antwort (siehe die Erklärung dort).Der mittlere Teil (
(\||[^|](?2)[^|])
) verwendet die Perl-Rekursion ((?2)
), um entweder einen Spiegel (\|
) oder (|
) zwei Nicht-Spiegel-Zeichen ([^|]
) zuzuordnen, die durch dasselbe Muster ((?2)
) getrennt sind.Meine ältere (und hässlichere) Version:
s/([.#])(([^|]*)\|(??{$3=~s%.%[^|]%gr}))(?!\1)[^|]/#$2#/&&redo
quelle
Haskell (kein regulärer Ausdruck), 117 Byte
quelle
PHP,
123117100 BytesDas Programm übernimmt das Kommandozeilenargument regex von @Martin Ender / Dada. Laufen Sie mit
-r
.quelle
C 176 Bytes
Ungolfed
quelle
'#'
und'.'
mit35
und46
jeweils.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 BytesJavaScript (ES6), 170 Byte
Ungolfed:
quelle