Bei einer Eingabe von zwei Zeichenfolgen mit Sequenzen von Unterstrichen, die entsprechende Wörter darstellen, werden die Sätze mit den ausgefüllten "Leerzeichen" ausgegeben.
Diese Herausforderung lässt sich am besten anhand eines Beispiels beschreiben. Hier ist eine Beispieleingabe:
programming _____________ and code golf
programming puzzles ______ code ____
Und hier ist die entsprechende Ausgabe:
programming ___puzzles___ and code golf
programming puzzles _and__ code golf
Für die Zwecke dieser Herausforderung wird ein "Wort" als eine Folge von einem oder mehreren Kleinbuchstaben definiert, und ein "Leerzeichen" wird als ein oder mehrere Unterstriche definiert (die Eingabe enthält immer nur Kleinbuchstaben, Leerzeichen und Unterstriche). . Wörter und Leerzeichen in den Eingabezeichenfolgen werden durch einzelne Leerzeichen getrennt, und die Summe der Anzahl der Wörter und Leerzeichen in den Sätzen ist immer gleich.
Das Ziel der Herausforderung besteht darin, alle Lücken mit den richtigen Wörtern zu füllen. Dies sind die Wörter, die denselben Index in der anderen Zeichenfolge belegen, wenn sie durch Leerzeichen geteilt werden.
Das Wort muss im Leerzeichen zentriert sein, wie im obigen Beispiel mit dem Wort "Rätsel" gezeigt - auf beiden Seiten verbleibt die gleiche Anzahl von Unterstrichen.
Wenn das Wort nicht genau zentriert werden kann, kann der zusätzliche Unterstrich entweder links oder rechts stehen (z. B. das Wort "und" im obigen Beispiel).
Es wird immer genug Unterstriche geben, damit das Wort passt, aber es kann genau so viele wie die Länge des Wortes geben (z. B. das Wort "Golf" im obigen Beispiel).
In beiden Zeichenfolgen wird niemals ein Leerzeichen an derselben Position angezeigt.
Die Eingabe / Ausgabe kann eine der folgenden sein (Eingabe / Ausgabe muss nicht unbedingt über dieselbe Methode erfolgen):
einzelne Zeichenfolge, die durch ein nicht alphabetisches Zeichen, ein Leerzeichen oder einen Unterstrich getrennt ist (z. B. durch Zeilenumbrüche oder Kommas getrennte Zeichenfolge)
ein Array / eine Liste / etc. von zwei Saiten
zwei Funktions- / Befehlszeilenargumente (nur Eingabe)
Da dies Code-Golf ist , gewinnt der kürzeste Code in Bytes.
Das obige Beispiel kann als Testfall verwendet werden. Hier ist ein größerer Testfall (die zweite Zeichenfolge in der Ausgabe kann aufgrund des unterschiedlichen Zentrierungsverhaltens geringfügig variieren):
lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum
Antworten:
Pyth, 30
Nimmt Ein- und Ausgaben als Liste von zwei Zeichenfolgen. Verwendet einen ziemlich einfachen Split-Zip-Double-Map-Center-Zip-Join-Ansatz.
Probieren Sie es hier aus
Erweitert:
Ich werde mehr erklären, sobald ich wirklich zufrieden bin, dass ich das nicht mehr spielen kann, obwohl es angesichts der Allgegenwart des Split-Zip-Double-Map-Center-Zip-Join-Ansatzes und allem ziemlich klar sein sollte.
quelle
Retina ,
1021009388 BytesDie Byteanzahl setzt die ISO 8859-1-Codierung voraus.
Die Zeichenfolgen werden durch einen Zeilenvorschub getrennt. Wenn noch eine ungerade Anzahl von Unterstrichen übrig ist, steht der fremde hinter dem Wort.
Probieren Sie es online aus!
Erläuterung
Ich denke, dies ist der "Duplicate-Append-Lookback-Match-Add-Center-Ansatz" oder etwas Nahes ...
Wir beginnen mit dem Duplizieren der Eingabe (getrennt durch einen
!
und einen Zeilenvorschub). Der Zweck davon ist, dass wir dann beide Zeilen verarbeiten können, indem wir Wörter aus der nächsten Zeile abrufen (anstatt die zweite Zeile separat behandeln zu müssen).Dies stellt jeder Lücke das richtige Wort voran. Wir beginnen mit dem Zählen der aktuellen Wortposition mit dem Lookbehind
(?<=^(\w+ )*)
(die Position wird als Gruppentiefe gespeichert1
). Dann wird der Look - Ahead - a) stellt sicher , dass wir am Anfang einer Lücke durch Anpassung sind_
, dann springt in die nächste Zeile mit.*¶
, passt die richtige Anzahl der Wörter mit(?<-1>\w+ )*
in die richtige Position zu bekommen, und dann passt das Wort fand dort mit(\w+)
in Gruppe2
.Diese Phase macht drei Dinge:
2
mit([a-z])+
und passend dann , dass viele Unterstreichungen (was nie wieder geschrieben).(_*)\3
und$3$1$3
zurückgeschrieben wird.!\D+
und durch nichts ersetzt wird.quelle
Python 2, 109
Die Funktion verwendet zwei Zeichenfolgen als Argumente und druckt die Ausgabe wie in den Beispielen. Es verwendet einen langweiligen Ansatz, bei
str.center(width, fillchar)
dem der Großteil der Arbeit erledigt wird.Probieren Sie es online aus .
quelle
z
, es sei denn, mir fehlt etwas. Sie können den Austausch einfach nach dem Drucken und Inline durchführenz
.Ruby,
111109 ZeichenEingabe: Array von 2 Strings; Ausgabe: Array von 2 Zeichenfolgen.
Probelauf:
quelle
JavaScript,
194185 BytesNimmt zwei Zeichenfolgen als Parameter und gibt zwei Zeichenfolgen als Array / Liste aus
Code-Snippet anzeigen
quelle
Mathematica 223
Es muss einen kürzeren Weg geben, dies zu tun.
Probelauf
quelle
Gema,
208203 ZeichenNur weil Gema die perfekte Funktion für diese Aufgabe hat : .
@fill-center{background;value}
Eingabe: 2 durch Zeilenumbrüche getrennte Zeilen (keine endgültige Zeilenumbruch); Ausgabe: 2 durch Zeilenumbrüche getrennte Zeilen (mit nachgestellten Leerzeichen - scheinen nicht verboten zu sein).
Probelauf:
quelle
C 197 Bytes
Ausgabe
quelle
ES6, 122 Bytes
Nimmt ein Array mit zwei Zeichenfolgen als einen einzelnen Parameter und gibt ein weiteres Array mit zwei Zeichenfolgen zurück.
quelle