Bei einer Wörterbuchdatei (eine Textdatei, die ein Wort oder eine Phrase in jeder Zeile enthält, mit möglicher Interpunktion, aber ohne Zahlen; Zeilen sind alphabetisch sortiert) müssen Sie jede Kombination von Wörtern ausgeben, bei der ein Buchstabe aus einem Wort entfernt werden kann, um ein anderes zu bilden. Der entfernte Buchstabe sollte in Klammern gesetzt werden.
Zum Beispiel die Eingabe
cat
cart
code
golf
ode
verify
versify
sollte eine Ausgabe von geben
ca(r)t
(c)ode
ver(s)ify
Mehrere Möglichkeiten, um dasselbe Paar zu erhalten, müssen nur einmal angezeigt werden. Sie können scra(p)ped
oder ausgeben scrap(p)ed
, aber nicht beide.
Die Ausgabe sollte alphabetisch nach dem längeren Eintrag sortiert sein .
mart
mar
mat
ma
sollte eine Ausgabe von haben
ma(r)
ma(t)
ma(r)t
mar(t)
und die beiden letzteren könnten in jeder Reihenfolge sein.
Die Wörterbuchdatei kann Großbuchstaben, Leerzeichen, Bindestriche oder Apostrophe enthalten. diese sollten ignoriert werden. Zum Beispiel,
inlay
in-play
sollte produzieren in(p)lay
. Ihre Ausgabe sollte alle im selben Fall sein. Zusätzliches Leerzeichen ist zulässig.
Die Eingabe kann STDIN oder aus einer Datei erfolgen. Es wird durch Zeilenumbrüche getrennt. Die Ausgabe kann der Rückgabewert einer Funktion oder von STDOUT sein (oder, falls gewünscht, in eine Datei geschrieben werden).
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
(Dies ist meine erste Herausforderung bei PPCG - lassen Sie mich wissen, wenn ich etwas falsch gemacht habe und ich werde es beheben.)
mart mar mat ma
? Wäre esmar(t) ma(r)t ma(r) ma(t)
?Antworten:
Perl -an0, 101 + 3 Bytes
wo
@F
ist das in einem Array gespeicherte Wörterbuch, das von Runtime Flag Magic bereitgestellt wird. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
Entfernt alle Symbole aus den Wörtern und dreht alles in Kleinbuchstaben. (Boost, Boot)sort{length$b<=>length$a}
sortiert nach Länge. (Booten, Boosten)map{ (...) while/(.)(?!\1)/g}@F
stimmt mit allen Zeichen überein, denen nicht dasselbe Zeichen folgt ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
druckt die Teile, die vor, in Klammern und nach einer Übereinstimmung stehen ... (boo (s) t)if $`.$'~~@F
... wenn die Verkettung von allem vor und nach dem Match im Wörterbuch steht. ([boo] s [t])quelle
JavaScript (ES6), 225
Eine Funktion mit einem Zeichenfolgenparameter, keine Eingabe aus der Datei. Ich fragte OP, ob dies gültig sein könnte.
Testausführung des Snippets in einem EcmaScript 6-kompatiblen Browser (Implementierung von Pfeilfunktionen, Vorlagenzeichenfolge, Verteilungsoperator - Firefox, möglicherweise Safari oder MS Edge, nicht Chrome)
quelle
Ruby, 173
Testen Sie es hier: http://ideone.com/86avbe
Lesbare Version hier: http://ideone.com/ynFItB
quelle
['jacklantern','jackslantern','jack-o-lantern']
Diktat.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Rubin, 211
Ich entschied mich für einen anderen Lösungsansatz mit Regex.
quelle
Perl 5, 210
Der Code lädt die Eingabe in ein sortiertes Array und vergleicht jeden Wert mit allen Werten im Array, die 1 Byte länger sind.
Prüfung
quelle
Haskell, 201 Bytes
Ich bin nicht sicher, welches Eingabeformat zulässig ist.
f
Nimmt eine Liste von Zeichenfolgen. Wenn nur eine einzige Zeichenfolge (mit nl getrennten Wörtern) zulässig ist, fügen Sie hinzu.lines
Sie zuf
(6 Bytes).Anwendungsbeispiel:
So funktioniert es: Verwandle jedes Wort in Kleinbuchstaben und behalte nur die Buchstaben.
x
Teilen Sie jedes Wort an jeder möglichen Stelle in zwei Teile und verdreifachen Sie,(i,j,k)
wobeii
der erste Teil,j
der erste Buchstabe des zweiten Teils undk
der Schwanz des zweiten Teils ist. Bewahren Sie die Tripel dort auf, wo siei++k
auch in der Wortliste erscheinen. Wenn diese Liste nicht leer ist, nehmen Sie das erste Element und rufen Sie es auf(l,m,n)
. Stellen Sie alle diese Listenköpfe in das gewünschte Ausgabeformat, indem Sie siem
mit()
und umgeben und zwischenl
und setzenn
.quelle