Betrachten Sie die folgende alphabetisch sortierte Liste von Wörtern:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Alle Wörter beginnen mit b
und die ersten 5 beginnen mit bal
. Wenn wir uns nur die ersten beiden Wörter ansehen:
balderdash
ballet
wir könnten stattdessen schreiben:
balderdash
+let
wobei das verwendet ' '
wird, wenn ein Wort ein Präfixzeichen mit dem vorherigen Wort teilt; mit Ausnahme des '+'
Zeichens, das das letzte Zeichen angibt, bei dem das zweite Wort ein Präfix mit dem vorherigen Wort teilt.
Dies ist eine Art "Trie" -Visualisierung: Das übergeordnete Element ist " bal
" und hat 2 Nachkommen: 'derdash'
und 'let'
.
Mit einer längeren Liste, wie zum Beispiel:
balderdash
ballet
brooding
Wir können zusätzlich das Pipe-Zeichen verwenden '|'
, um zu verdeutlichen, wo das gemeinsame Präfix endet, wie folgt:
balderdash
| +let
+rooding
und der äquivalente Baum hätte eine Wurzel aus 'b'
zwei Kindern: der Teilbaum hätte Wurzel 'al'
und und seine zwei Kinder 'derdash'
und 'let'
; und 'rooding'
.
Wenn wir diese Strategie auf unsere ursprüngliche Liste anwenden,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Wir erhalten eine Ausgabe, die wie folgt aussieht:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Wenn zwei aufeinanderfolgende Wörter in der Liste kein gemeinsames Präfix haben, werden keine Sonderzeichen ersetzt. zB für die Liste:
broom
brood
crude
crumb
Wir wollen die Ausgabe:
broom
+d
crude
+mb
Eingang
Die Wörter in der Eingabe bestehen nur aus alphanumerischen Zeichen (keine Leerzeichen oder Satzzeichen). Dies kann in Form einer Liste von Zeichenfolgen, einer einzelnen Zeichenfolge oder einer anderen sinnvollen Methode erfolgen, sofern Sie das von Ihnen gewählte Format angeben. Keine zwei aufeinander folgenden Wörter werden gleich sein. Die Liste wird alphabetisch sortiert.
Ausgabe
Ihre Ausgabe kann nachgestellte Leerzeichen pro Zeile oder insgesamt enthalten, jedoch keine führenden Leerzeichen. Eine Liste von Zeichenketten oder ähnlichem wäre ebenfalls akzeptabel.
Das ist Code-Golf ; Der kürzeste Code in jeder Sprache behält sich prahlerische Rechte vor. Es gelten die üblichen Lückenverbote.
Testfälle
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
nachballoon
. Mit welcher Leistung sollten wir rechnen?+
unter der ersteno
, aber ich habe die Herausforderung nicht geschrieben, deshalb bin ich nicht sicher.Antworten:
Retina 0.8.2 ,
5857 BytesProbieren Sie es online! Link enthält einen Testfall. Bearbeiten: 1 Byte dank @FryAmTheEggman gespeichert, der darauf hinweist, dass ich einen Wechsel von
\b
zu übersehen^
habe, der durch das ermöglicht wurdem)
. Erläuterung:Pro Zeile
^
für das gesamte Programm einschalten.Versuchen Sie, für jedes Wort so viele Übereinstimmungen wie möglich vom Anfang des vorherigen Wortes an zu finden. Ändern Sie die Übereinstimmung in Leerzeichen, mit Ausnahme des letzten Zeichens, das zu a wird
+
.Ersetzen Sie wiederholt alle Leerzeichen unmittelbar über
+
s oder|
s durch|
s.quelle
m)
speziell hinzugefügt, um das zu können, also ärgere ich mich, dass ich eine Instanz verpasst habe.JavaScript (ES6), 128 Byte
Erwartet eine Liste mit Zeichenlisten und gibt diese zurück.
Probieren Sie es online!
Wie?
Leerzeichen und
+
's können eingefügt werden, indem das erste bis zum letzten Wort der Reihe nach|
durchgegangen wird. Sie können jedoch erst a posteriori eingefügt werden, wenn a+
identifiziert wurde. Dies könnte durch zwei verschiedene Durchläufe erreicht werden. Stattdessen speichern wir einen Zeiger auf jeden geänderten Eintrag,a[~y]
damit er später innerhalb derselbenmap()
Schleife erneut aktualisiert werden kann .Theoretisch wäre es eine einfachere Lösung, die Wörter in umgekehrter Reihenfolge durchzugehen und die Ausgabe am Ende des Prozesses ebenfalls umzukehren. Aber das ist in JS ein bisschen teuer und ich habe mit dieser Methode keinen Weg gefunden, eine kürzere Version zu bekommen.
quelle
JavaScript (Node.js) ,
125122118117 BytesProbieren Sie es online!
quelle
Python,
263260 Bytes- 3 Bytes dank Jonathan Frech
Code:
Probieren Sie es online!
Erläuterung:
Diese Lösung baut einen Versuch aus den Eingabewörtern auf und analysiert ihn rekursiv in die erforderliche Ausgabe. Die a-Funktion nimmt einen Versuch und einen String s und addiert x zu t. Versuche werden als verschachtelte Wörterbücher implementiert. Jedes Wörterbuch repräsentiert einen Knoten im Trie. Das Wörterbuch, das den vom ersten Testfall generierten Test darstellt, sieht beispielsweise folgendermaßen aus:
Die p-Funktion rekursiert durch diese Struktur und generiert die Zeichenfolgendarstellung des von der Challenge erwarteten Tries. Die Funktion f nimmt eine Reihe von Zeichenfolgen als Argumente, fügt sie alle zu einem Trie mit a hinzu und gibt dann das Ergebnis des Aufrufs von p für den Trie zurück.
quelle
C (gcc) ,
165–155BytesNimmt drei Argumente:
char** a
: ein Array von nullterminierten Wörternchar* m
: Ein Array der Länge jedes Wortesint n
: Die Anzahl der Wörter im ArrayProbieren Sie es online!
quelle
++i<n&j<m[i]&a[i--]
undefiniertes Verhalten? Kann ich mich darauf verlassen, dass gcc es von links nach rechts auswertet?Perl 6 ,
149 144142 BytesProbieren Sie es online!
Ich bin mir sicher, dass man hier mehr Golf spielen kann, zumal ich kein Experte für Regex bin. Dies funktioniert ähnlich wie Neils Retina-Antwort .
quelle
Python 2 , 191 Bytes
Probieren Sie es online!
quelle
Ruby , 118 Bytes
Probieren Sie es online!
Akzeptiert ein Array von Zeichenfolgen und gibt es aus, indem das ursprüngliche Eingabearray direkt geändert wird.
Erläuterung
Die grundlegende String-Transformation ist nicht zu komplex, aber um vertikale Pipes richtig einzufügen, müssen wir in umgekehrter Reihenfolge iterieren, und da die
reverse
Methode ziemlich ausführlich ist, werden wir es auf eine schwierigere Weise tun. Hier verwenden wirmap
nur, um die Schleife auszuführen, das erste Wort in Ruhe zu lassen und dann am Ende mit negativen Indizes zu iterieren:quelle