Geben Sie bei einer gegebenen Buchstabenfolge und einer Reihe von Wörtern eine Reihenfolge der Wörter aus, damit sie in der Zeichenfolge gefunden werden können, indem Sie nicht benötigte Buchstaben löschen. Wörter können im Wortsatz mehrmals vorkommen. Die Eingabezeichenfolge und alle Wörter bestehen jeweils aus 1 bis 1000 Kleinbuchstaben. Die zu löschenden Buchstaben können innerhalb von Wörtern oder zwischen Wörtern vorkommen.
Ihr Programm oder Ihre Funktion kann die Buchstabenfolge und Wörter als Listen, Zeichenfolgen oder von STDIN akzeptieren und muss alle Wörter in der richtigen Reihenfolge als Listen- oder Zeichenfolgenausgabe ausgeben. Wenn es mehr als eine richtige Lösung gibt, geben Sie nur eine davon aus. Wenn es keine mögliche richtige Lösung gibt, geben Sie eine leere Liste oder eine leere Zeichenfolge aus.
Beispiele:
dogcatfrog cat frog dog
-> dog cat frog
xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd
flea antelope
->
(no solution)
Das ist Code Golf. Die niedrigste Anzahl von Bytes gewinnt.
Bearbeiten: Erklärt, dass zusätzliche Zeichen in Wörtern enthalten sein können.
cc
vor,bb
aber die Teilzeichenfolgenbb
und werdencc
nur einmalbb
angezeigt, und die Teilzeichenfolge wird zuerst angezeigt.ccbcb
Teil des Strings geben wir diecc
dann-Ausgabe aus,bb
nachdem wir die Mitte fallen gelassen habenc
.Antworten:
Pyth,
2024 BytesMein erster Versuch auf Pyth :)
Wie es funktioniert:
Anmerkungen: Im dritten Beispiel (
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
) dauert es lange .quelle
Pyth, 10 Bytes
Demonstration
Dieses Programm ist sehr brutal. Es erstellt zuerst jede Teilmenge der Eingabe, dann jede Partition der Teilmengen und sucht dann nach der ersten, bei der die Wortliste neu angeordnet wird. Es werden keine Möglichkeiten durch Fehler ohne Ausgabe an stdout behandelt, was durch Metakonsens zulässig ist. Der Fehler kann für 2 zusätzliche Bytes entfernt werden.
Beachten Sie, dass das Programm für viele der angegebenen Testfälle nicht in einem angemessenen Zeitraum abgeschlossen wird.
quelle
JavaScript (ES6), 119 Byte
Akzeptiert eine Zeichenfolge und ein Array von Wörtern und gibt ein Array von Wörtern oder
undefined
bei einem Fehler zurück. Fügen Sie 2 Bytes hinzu, wenn die leere Zeichenfolge bei einem Fehler zurückgegeben werden muss (?q:``
). In diesem Fall beträgt diese alternative Version nur 120 Byte und gibt die leere Zeichenfolge bei einem Fehler zurück. Sie kann sogar 2 Byte speichern, wenn bei einem Fehler 0 zurückgegeben werden darf:(Nachdem ich dies geschrieben hatte, bemerkte ich, dass der Algorithmus im Grunde der gleiche ist wie die Pyth-Antwort von @ KennyLau.)
Bearbeitet Bearbeiten: Nach Klärung der Frage aktualisiert, ist aber beim dritten Testfall sehr langsam. Ich habe es in der vorletzten Nacht ausgelöst und heute Morgen habe ich gerade bemerkt, dass es tatsächlich die Lösung gefunden hat, irgendwo zwischen 30 und 40 Stunden später. Ich war wirklich gemein und fütterte es mit der Lösung (es funktioniert am besten mit der umgekehrten Lösung, die sofort überprüft wird).
quelle
Java 7, 256 Bytes
Es sollte definitiv möglich sein, dies mehr mit einem anderen Ansatz zu spielen, aber dies wird vorerst reichen.
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Groovy (44 Bytes)
Ich kann nicht glauben, dass sonst niemand Regexe dafür verwendet hat ...
Erläuterung
/${b.join('|')}/
- Erstellen Sie einen regulären Ausdruck, um eines der Wörter in einer Zeichenfolge zu finden..findAll(...)
- Suchen und sammeln Sie alle Vorkommen in der Zeichenfolge in einem Array..join(" ")
- Verbinden Sie das Array mit Leerzeichen.Wenn keine Vorkommen vorhanden sind, ist das Array grundsätzlich leer und gibt implizit eine leere Zeichenfolge zurück. Wenn es Vorkommen findet, gibt es ein Array-Objekt mit den Vorkommen zurück und glättet es dann zu einer Zeichenfolge.
quelle