Ein zusammengesetztes Wort ist ein Wort, das zwei oder mehr Wörter enthält. Aber wir können es besser machen. Sie müssen ein (unsinniges) Wort erstellen, das jedes Wort enthält .
Wir möchten jedoch, dass dieses Wort so kurz wie möglich ist. Wir können überlappende Buchstaben verwenden, um dies zu erreichen.
Wenn Ihre Wortliste beispielsweise lautete ["cat", "atom", "a"]
, möchten Sie zurückkehren "catom"
.
Input-Output
Ihr Programm muss eine Liste von Wörtern als Eingabe und ein zusammengesetztes Wort als Ausgabe zurückgeben.
Die Wortliste, die Sie verwenden werden, ist laut Google die Liste der 10000 wichtigsten Wörter in Englisch (Wenn sich diese Liste als zu einfach herausstellt, kann ich sie durch eine längere Liste ersetzen). Wenn Sie als Referenz einfach jedes Wort anhängen, erhalten Sie eine Punktzahl von 65888.
Ihre Punktzahl ist die Anzahl der Buchstaben in Ihrem letzten Wort, niedriger ist besser. Der Krawattenbrecher geht zum ersten Plakat.
quelle
Antworten:
C ++, endgültige Wortlänge: 38272
(optimierte Version dauerte ca. 20 Minuten)
Verification Bash One-Liner:
Es hat auch einige ziemlich coole In-Progress-Wörter produziert. Hier sind einige meiner Favoriten:
Und:
Die endgültige Ausgabe ist auf Pastebin hier: http://pastebin.com/j3qYb65b
quelle
max_word_length - overlap(word[i], word[j])
(wobeioverlap
die Überlappung von rechts überprüft wird) erstes Argument links vom zweiten). Wenn Sie dies lösen (viel Glück!) Und dann die resultierende Schleife zum höchsten Preis abschneiden (geringste Überlappung), erhalten Sie eine geordnete Liste von Wörtern, die zusammengeführt werden können, um eine optimale Lösung zu erhalten.C ++ 11, 38272 Buchstaben, als optimal erwiesen
Dieser Algorithmus garantiert eine niedrigere Grenze für die Lösung. In diesem Fall ist es möglich, die Untergrenze zu erreichen und eine optimale Lösung mit 38272 Buchstaben auszugeben. (Dies entspricht der Lösung, die von Daves gierigem Algorithmus gefunden wurde. Ich war überrascht und ein wenig enttäuscht, als ich herausfand, dass es optimal ist, aber da sind wir.)
Es funktioniert durch Lösen des Minimalkostenflusses in dem Netzwerk, das wie folgt aufgebaut ist.
Jede Zeichenfolge mit der Länge n , die jedes Wort enthält, kann in diesem Netzwerk zu höchstens n Kosten in einen Datenfluss umgewandelt werden . Daher ist der minimale Kostenfluss in diesem Netzwerk eine Untergrenze für die Länge des kürzesten solchen Strings.
Wenn wir Glück haben - und in diesem Fall auch -, dann, nachdem wir den eingehenden Fluss umgeleitet haben w_1 eintritt, zurück aus w eingehenden _0 einen optimalen Fluss mit nur einer verbundenen Komponente, der den Knoten für den leeren durchläuft Zeichenfolge. In diesem Fall enthält es einen Eulerschen Kreis, der dort beginnt und endet. Eine solche Eulersche Schaltung kann als eine Kette optimaler Länge ausgelesen werden.
Wenn wir kein Glück hatten, fügen Sie einige zusätzliche Bögen zwischen der leeren Zeichenfolge und den kürzesten Zeichenfolgen in den anderen verbundenen Komponenten hinzu, um sicherzustellen, dass eine Euler-Schaltung vorhanden ist. Die Zeichenfolge wäre in diesem Fall nicht mehr unbedingt optimal.
Ich benutze die LEMON- Bibliothek für ihre Min-Cost-Flow- und Euler-Schaltungsalgorithmen. (Ich habe diese Bibliothek zum ersten Mal verwendet und war beeindruckt - ich werde sie auf jeden Fall wieder für zukünftige Anforderungen an Grafikalgorithmen verwenden.) LEMON wird mit vier verschiedenen Minimum-Cost-Flow-Algorithmen geliefert. Sie können sie hier mit versuchen
--net
,--cost
,--cap
, und--cycle
(Standard).Das Programm läuft in 0,5 Sekunden ab und erzeugt diese Ausgabezeichenfolge .
quelle
Java 8, ~ 5 Minuten, Länge 39.279
Eingang:
Ausgabe:
quelle
26,609
Charaktere losgeworden .Python 2, 39254 Zeichen
Die Ausführung auf meinem Computer dauert 1 bis 2 Minuten. Dabei wird das längste Wort verwendet und das Wort immer der Ergebniszeichenfolge hinzugefügt, die die meisten gemeinsamen Zeichenfolgen enthält. (Vorher werden alle Wörter, die Teilzeichenfolgen anderer Wörter sind, entfernt, um unnötiges Hinzufügen zur Zeichenfolge zu vermeiden.)
Update: Versucht in beide Richtungen zu schauen, aber das geht nicht besser. (Vielleicht verwendet es Wörter, die später besser verwendet werden können?)
Link zum Wort auf Pastebin.
erste 100 Zeichen:
Code:
quelle
Ruby, 39222 Zeichen
Verwendet einen ähnlichen Ansatz wie @KarlKastor in seiner Python-Antwort, aber die Startzeichenfolge ist eines der kleinsten statt der größten Wörter. Eine weitere Optimierung (ich weiß nicht, wie viel es hilft) besteht darin, dass zwischen den einzelnen Hinzufügungen alle Wörter entfernt werden, die möglicherweise aufgrund überlappender Wörter bereits in der Zeichenfolge enthalten sind.
Läuft in etwas mehr als 4 Minuten auf meinem Computer, ohne die Webanforderung zum Abrufen der Wortliste zu zählen, aber nicht ganz 4:20.
Das Wort zum Pastebin.
quelle
PowerShell v2 +, 46152 Zeichen
Nimmt die Eingabe als Liste und wandelt sie in eine ArrayList um (damit wir sie bearbeiten können). Wir
sort
es durchlength
in-des
aufsteigender reihenfolge. Dann habenwhile
wir immer noch Wörter in unserem Eingabearray, machen Sie eine Schleife. Stellen Sie den Helfer$x
bei jeder Iteration so ein, dass er der Anzahl der verbleibenden Helfer entspricht, markieren Sie das nächste Element in der Liste für unsere Ausgabe$o
und durchsuchen Sie dann alles, was noch in unserer Liste enthalten ist. Wenn das.IndexOf
nicht gleich ist-1
(dh das Wort wurde irgendwo in gefunden$o
), entfernen wir dieses Wort aus unserer Liste der verbleibenden Wörter. Schließlich am Ende Ausgabe$o
.Ich habe keinen Zugang zu einem Pastebin oder ähnlichem, also hier ist der Anfang und das Ende des Wortes für temporär -
telecommunicationscharacterizationresponsibilitiessublimedirectory...fcmxvtwvfxwujmjsuhjjrxjdbkdxqc
. Was ich denke, hat ungefähr 20.000 Zeichen von der Eingabe entfernt, also nicht so schlimm, nehme ich an.Ich arbeite an Verbesserungen.
quelle
PHP 46612 Zeichen
Dies ist nur ein Anfang. Ich hoffe es zu verbessern. Alles, was ich bisher getan habe, ist, jedes Wort zu entfernen, das eine Unterzeichenfolge eines anderen Wortes ist. Ich arbeite an 3 Kopien des Arrays, aber der Speicher scheint kein Problem zu sein.
quelle