Ein pangram ist eine Zeichenfolge , die jeden Buchstaben enthält a
- z
die englische Alphabet, Groß- und Kleinschreibung. (Es ist in Ordnung, wenn das Pangram mehr als eine Kopie eines Buchstabens enthält oder wenn es zusätzlich zu den Buchstaben Zeichen enthält, die keine Buchstaben sind.)
Schreiben Sie ein Programm oder eine Funktion, deren Eingabe eine Liste von Zeichenfolgen ist und die eine oder mehrere Zeichenfolgen mit den folgenden Eigenschaften ausgibt:
- Jede Ausgabezeichenfolge muss ein Pangram sein.
- Jede Ausgabezeichenfolge muss durch Verketten einer oder mehrerer Zeichenfolgen aus der Eingabeliste gebildet werden, die durch Leerzeichen getrennt sind.
- Jede Ausgabezeichenfolge muss die kürzeste oder die kürzeste unter allen Zeichenfolgen mit diesen Eigenschaften sein.
Viele Programme geben nur eine Zeichenfolge aus. Sie möchten nur mehr als eine Zeichenfolge ausgeben, wenn Sie ansonsten zusätzlichen Code schreiben müssten, um die Ausgabe zu begrenzen.
Sie können davon ausgehen, dass die Eingabe keine nicht druckbaren Zeichen oder Leerzeichen enthält und dass kein Wort mehr als (26-mal der natürliche Logarithmus der Länge der Liste) Zeichen lang ist. (Sie dürfen jedoch nicht davon ausgehen, dass die Eingabe nur Buchstaben oder nur Kleinbuchstaben enthält. Satzzeichen und Großbuchstaben sind durchaus möglich.)
Eingabe und Ausgabe können in jedem vernünftigen Format erfolgen. Zum Testen Ihres Programms empfehle ich die Verwendung von zwei Testfällen: einem Wörterbuch mit englischen Wörtern (die meisten Computer haben einen) und dem folgenden Fall (für den ein perfektes Pangram (26 Buchstaben) unmöglich ist, sodass Sie einen finden müssen) mit doppelten Buchstaben):
abcdefghi
defghijkl
ijklmnop
lmnopqrs
opqrstuvw
rstuvwxyz
Sie sollten Ihrer Einreichung ein Beispiel der Ausgabe Ihres Programms beifügen. (Dies kann für verschiedene Personen aufgrund der Verwendung unterschiedlicher Wortlisten durchaus unterschiedlich sein.)
Siegbedingung
Dies ist eine Code-Golf- Herausforderung mit eingeschränkter Komplexität . Der Gewinner ist das kürzeste Programm (in Bytes), das in Polynomzeit ausgeführt wird . (Eine Zusammenfassung für Personen, die nicht wissen, was das bedeutet: Wenn Sie die Größe der Wortliste verdoppeln, sollte das Programm nur um einen konstanten Faktor langsamer werden. Der betreffende konstante Faktor kann jedoch so groß sein wie Sie Zum Beispiel ist es gültig, dass es viermal langsamer oder achtmal langsamer wird, aber nicht, dass es um einen Faktor der Länge der Wortliste kleiner wird; der Faktor, über den es langsamer wird, muss begrenzt werden.)
Antworten:
Ruby 159 (iterativ)
Rubin
227220229227221 (rekursiv)Neue iterative Lösung (basierend auf dem von @Niel beschriebenen Algorithmus):
Alte rekursive Lösung:
Die Bytemessung basiert darauf, dass die letzte neue Zeile in der Datei weggelassen wird, was nicht wichtig ist
ruby 2.3.1p112
. Die Anzahl der Bytes stieg wieder an, nachdem ein kleiner Fehler behoben wurde (Hinzufügen.downcase
.upcase
für Groß- und Kleinschreibung, wie in der Problemstellung gefordert).Hier ist eine frühere Version von vor dem Kürzen von Bezeichnern und dergleichen:
Wie funktioniert es? Grundsätzlich werden eine Reihe von Zeichen beibehalten, die noch abgedeckt werden müssen, und es wird nur dann auf ein Wort zurückgegriffen, wenn dies die nicht abgedeckte Menge reduzieren würde. Zusätzlich werden die Ergebnisse der Rekursion gespeichert. Jede Teilmenge von 2 ^ 26 entspricht einem Memoisierungstabelleneintrag. Jeder solche Eintrag wird zeitlich proportional zur Größe der Eingabedatei berechnet. Das Ganze ist also
O(N)
(woN
ist die Größe der Eingabedatei), wenn auch mit einer riesigen Konstante.quelle
JavaScript (ES6),
249248 Bytes, möglicherweise konkurrierendErläuterung: Transformiert das Array, indem die Buchstaben in eine Bitmaske konvertiert werden, wobei nur das kürzeste Wort für jede Bitmaske in einer Karte gespeichert wird. Wenn Sie dann eine Kopie der Karte durchlaufen, erweitern Sie die Karte, indem Sie jede kombinierte Bitmaske hinzufügen, wenn die resultierende Zeichenfolge kürzer wäre. Geben Sie schließlich die Zeichenfolge zurück, die für die Bitmap gespeichert wurde, die einem Pangram entspricht. (Gibt zurück,
undefined
wenn keine solche Zeichenfolge vorhanden ist.)quelle
Python 3,
98,94, 92 BytesDurchläuft die ASCII-Darstellung des Alphabets und fügt einer Liste eine 1 hinzu, wenn der Buchstabe in der Zeichenfolge gefunden wird. Wenn die Summe der Liste größer als 25 ist, enthält sie alle Buchstaben des Alphabets und wird gedruckt.
quelle
(' ')
und entfernenif
. Sie können auch ändernord(i) in range(65,91)
zu91>x>=65
. Was ist auch die Komplexität?