Was ist der kürzeste Weg, um zu sehen, ob eine Eingabe mit einer Programmiersprache ein Wordinian ist?
Ein Wordinian ist ein Wort, das Wörter der Länge 1 bis zur Länge des ursprünglichen Wortes enthält. Beispielsweise,
Behälter
"Ich" ist ein Wort
"in" ist ein Wort
"bin" ist ein Wort
Oder,
Bühne
'a' ist ein Wort
'ta' ist ein Wort ( ja es ist )
'age' ist ein Wort
'stag' ist ein Wort
'stage' ist ein Wort
Eingang
Ihr Code sollte ein Wort und ein Wörterbuch als Eingabe in einem angemessenen Format enthalten.
Ausgabe
Die Ausgabe sollte ein Wert sein, der "wahr" oder "falsch" anzeigt, um uns mitzuteilen, ob das Wort ein Wortinier ist.
Weitere Informationen zu Wordinians finden Sie hier .
Hier ist eine Liste von Wörtern , die ich als Eingaben und Unterwörter verwenden werde. Als Antwort auf @xnor muss es auch Unterwörter jeder Länge enthalten, keine Kette von Unterwörtern. Beachten Sie, dass nur ein Wort als Eingabe verwendet wird.
quelle
Antworten:
Pyth,
2016151311 BytesVielen Dank an Leaky Nun für das Speichern von 4 Bytes! Leider habe ich die gesamte Methode nachträglich geändert, aber es hat trotzdem geholfen.
Erwartet die Eingabe als Wörterbuch, gefolgt von einem Wort. Gibt True oder False aus.
Probieren Sie es hier aus!
Erläuterung:
Dies funktioniert nicht, wenn die leere Zeichenfolge
""
ein gültiges Wort ist.quelle
.E
kann ersetzt werden durchs
m}kH
kann ersetzt werden durch}RH
Python, 52 Bytes
Eine anonyme Funktion, die ein Wort
w
und ein Wörterbuch benötigtd
. Es nimmt die Wörterd
, die Teilzeichenfolgen von sindw
, nimmt eine Menge ihrer Längen vor und prüft dann, ob es so viele unterschiedliche Längen gibt, wie Buchstaben enthaltenw
.quelle
[
stattdessen verwendet{
.{...}
ist ein Mengenverständnis (dasselbe wieset([...])
).Python 3, 108 Bytes
Eine anonyme Funktion, die die Eingabe eines Wortes
w
als Zeichenfolge und eines Wörterbuchsd
als Liste von Zeichenfolgen akzeptiert undTrue
oder zurückgibtFalse
.Wie es funktioniert
Der erste Schritt ist ein Listenverständnis, das eine Liste von Listen aller
w
auszuschließenden Teilzeichenfolgenw
, gruppiert nach Länge , generiert . Beispielsweise wird für'stage'
die Liste[['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]
generiert. Dies wird erreicht, indem alle gültigen Startindizesi
fürs
jedes
Teilzeichenfolgenlänge durchlaufen werden und jede -lange Teilzeichenfolge mit in Scheiben geschnitten wirdw[i:i+s]
. Für jede Liste in dieser Liste wird das Vorhandensein jeder Teilzeichenfolge im Wörterbuch überprüft. Aufrufenany
gibt einen Treffer zurück, wenn mindestens eine Übereinstimmung für eine bestimmte Länge gefunden wird. Abschließend wird beim Aufrufenall
geprüft, ob für alle Teilzeichenfolgenlängen eine Übereinstimmung gefunden wurde, und das Ergebnis wird zurückgegeben.Probieren Sie es auf Ideone
quelle
Ruby, 44 Bytes
w[x]&.size
:)Es handelt sich um anonyme Funktionen, die ein Wort
w
und ein Wörterbuch (eine Reihe von Wörtern) enthaltend
. Erstellt zwei Arrays: Das erste enthält die Zahlen 1 bis einschließlich der Länge vonw
; Das zweite Array wirdd
mit jedem Wort auf seine Größe abgebildet, wenn es sich um eine Teilzeichenfolge handeltw
, andernfallsnil
. Dann setzt es eine Subtraktion, um zu prüfen, ob das zweite Array alle Elemente des ersten Arrays enthält.quelle
w[x]&.size==i
stattx.size==i&&w[x]
.uniq
und löschen-[p]
und die Subtraktionsfunktion verwenden:[*1..w.size]-d.map{...}==[]
PowerShell
v3 +v2 +,1271107065 Byte(Ich sehe jetzt, dass mein Ansatz dem von @ xnor ähnelt, obwohl ich ihn unabhängig entwickelt habe.)
Nimmt Eingangswort
$a
und das Wörterbuch$d
, erwartet$d
als Array (siehe Beispiele unten). Durchläuft die Gesamtheit von$d
und führt ein ausWhere-Object
, um die Einträge herauszuziehen, bei denen das aktuelle Wort$_
ein regulärer Ausdruck-match
gegenüber dem Eingabewort ist$a
(dh, das aktuelle Wort ist eine Teilzeichenfolge des Eingabeworts).Wir sammeln alle diese Teilworte und leiten sie
Select-Object
an denlength
Parameter und die-U
Nique-Einschränkung weiter. Dadurch werden die eindeutigen Längen der einzelnen Teilzeichenfolgen herausgezogen. Für das Eingabewortcomb
ist dies beispielsweise ein Array von(4,2)
for('comb','om')
.Wir nehmen das
.count
resultierende Array und vergleichen es mit dem Eingabewort.length
. Wenn es gleich ist, bedeutet dies, dass jede Teilzeichenfolgenlänge im Wörterbuch enthalten ist$TRUE
, andernfalls fehlt mindestens eine$FALSE
. Dieser Boolesche Wert verbleibt in der Pipeline und die Ausgabe ist implizit.NB - Dies sollte in v2 + funktionieren, da der
-in
Operator nicht mehr vorhanden ist, aber ich habe diese Version nicht getestet.Beispiele
quelle
Perl, 86 Bytes
Benötigt
-E
keine zusätzlichen Kosten.Akzeptiert alle Eingaben über STDIN. Die erste Eingabe ist das Zielwort, der Rest der Eingabe ist das Wörterbuch. Druckt
1
bei Erfolg, leere Zeichenfolge bei Fehler.Verwendung
quelle
Mathematica, 90 Bytes
Verwendet das eingebaute von Mathematica
DictionaryWordQ
.Die Eingabe
d
als Wörterbuch ist 5 Byte kürzer, bei langen Listen jedoch viel langsamer:quelle
MATL , 15 Bytes
1 Byte gespeichert mit einer Idee aus der Antwort von @ xnor .
Ausgänge
1
oder0
für wahr oder falsch.Probieren Sie es online!
quelle
Perl,
4241 BytesBeinhaltet +2 für
-p0
Geben Sie ein Wort gefolgt vom Wörterbuch auf STDIN ein:
(Stellen Sie beim Testen unter Unix sicher, dass dictionary.txt
\n
als Zeilenabschluss verwendet wird, nicht\r\n
)wordinian.pl
:quelle
JavaScript (Firefox 30-57), 68 Byte
Durch die Verwendung eines Generatorverständnisses wird das Erstellen eines Zwischenarrays vermieden. 73 Byte ES6-Version:
quelle
05AB1E , 8 Bytes
Wort als erste Eingabe, Wörterbuchliste als zweite Eingabe.
Probieren Sie es online aus oder überprüfen Sie ein paar weitere Testfälle .
Erläuterung:
quelle
Kotlin , 51 Bytes
Probieren Sie es online!
quelle
SQF , 147 Bytes
Verwenden des Formats "Funktion als Datei":
Anrufen als:
["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION
Ungolfed:
quelle