Zerlegen Sie Wörter in andere Wörter (z. B. "Nachleuchten" = "Achtern" + "Erg" + "Niedrig")

13

Hier ist einer für alle, die Sie da draußen Wortschmiede! Schreiben Sie ein Programm oder eine Funktion, die eine Liste von Wörtern und eine Liste aller möglichen verketteten Zerlegungen für jedes Wort erstellt. Beispielsweise:

(Hinweis: Dies ist nur eine kleine Auswahl zur Veranschaulichung. Die tatsächliche Ausgabe ist weitaus umfangreicher.)

afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty

Ok, du kommst auf die Idee. :-)

Regeln

  • Verwenden Sie eine Programmiersprache Ihrer Wahl. Kürzester Code nach Zeichenanzahl für jede Sprache gewinnt. Dies bedeutet, dass es für jede verwendete Sprache einen Gewinner gibt. Der Gesamtsieger ist einfach der kürzeste der eingereichten Codes.
  • Die Eingabeliste kann eine Textdatei, eine Standardeingabe oder eine von Ihrer Sprache bereitgestellte Listenstruktur (Liste, Array, Wörterbuch, Gruppe usw.) sein. Die Wörter können Englisch oder eine andere natürliche Sprache sein. (Wenn es sich bei der Liste um englische Wörter handelt, sollten Sie Einträge mit einem Buchstaben außer "a" und "i" ignorieren oder herausfiltern. Ebenso sollten Sie in anderen Sprachen unsinnige Einträge ignorieren, wenn sie vorhanden sind erscheinen in der Datei.)
  • Die Ausgabeliste kann eine Textdatei, eine Standardausgabe oder eine von Ihrer Sprache verwendete Listenstruktur sein.
  • Sie können ein beliebiges Eingabewörterbuch verwenden, aber wahrscheinlich möchten Sie eines verwenden, das vernünftige Wörter enthält, anstatt eines, das zu viele dunkle, arkane oder unbewusste Wörter enthält. Dies ist die Datei, die ich verwendet habe: Die Maiskolben-Liste mit mehr als 58000 englischen Wörtern

Fragen

Bei dieser Herausforderung geht es in erster Linie darum, den Code zu schreiben , um die Aufgabe zu erfüllen, aber es macht auch Spaß, die Ergebnisse durchzukämmen ...

  1. Welche Unterwörter kommen am häufigsten vor?
  2. Welches Wort kann in die meisten Unterwörter zerlegt werden?
  3. Welches Wort kann auf die unterschiedlichsten Arten zerlegt werden?
  4. Welche Wörter setzen sich aus den größten Unterwörtern zusammen?
  5. Welche Zerlegungen fanden Sie am amüsantesten?
Todd Lehman
quelle
@ Geobits - Ah, danke! Ich habe zwei Zerlegungen verpasst, alienationals ich das ausgeschnitten und eingefügt habe. Jetzt behoben. In Bezug auf die anderen ist die obige Liste nur eine kleine Auswahl. Mein Testprogramm ergab Zehntausende von Antworten, als ich die Corncob-Liste erhielt.
Todd Lehman
1
"Welche Unterwörter kommen am häufigsten vor?" Ich werfe eine wilde Vermutung und sage 'a' könnte in der Nähe der Spitze sein.
Sellyme
@SebastianLamerichs - Ich weiß nicht ... Könnte sein, könnte nicht sein. :)
Todd Lehman
@ToddLehman Dieser Satz enthält genau 0 Unterwörter, daher ist 'a' immer noch gleich: P
Sellyme
@SebastianLamerichs Wenn Sie sich auf die Antwort von Todd beziehen, kann "Keine Ahnung" in "Keine Ahnung" + "Nein" aufgeteilt werden. ;)
Ich habe Alien

Antworten:

3

Python 186

a=open(raw_input()).read().split()
def W(r):
 if r:
    for i in range(1,len(r)+1):
     if r[:i]in a:
        for w in W(r[i:]):yield[r[:i]]+w
 else:yield[]
while 1:
 for f in W(raw_input()):print f

Nicht besonders effizient, aber eigentlich nicht schrecklich langsam. Es ist nur naiv (ich nehme an, es ist möglich, obwohl ich es für unwahrscheinlich halte, dass Python einige clevere Optimierungen vornimmt), überprüft, ob Unterwörter im Maiskolbenwörterbuch enthalten sind, und findet rekursiv so viele Wörter wie möglich. Natürlich ist dieses Wörterbuch ziemlich umfangreich und Sie können eines ausprobieren, das keine verschiedenen Abkürzungen und Akronyme enthält (was zu Dingen wie führt bedridden: be dr id den). Auch das verknüpfte Wörterbuch schien kein "A" oder "I" als Wörter zu haben, so dass ich sie manuell hinzufügte.

Bearbeiten:

Jetzt ist die erste Eingabe der Dateiname des zu verwendenden Wörterbuchs, und jede weitere Eingabe ist ein Wort.

KSab
quelle
Es ist erwähnenswert, dass dies Python 2 ist, da der Code in Python 3 nicht ausgeführt wird, da dies print fsein sollteprint(f)
Wie führe ich das aus? echo archer|python2 filename.pygibt einen EOFError für die letzte Zeile aus
Einige Dinge, die Sie noch ändern könnten (ich habe diese noch nicht getestet, aber ich bin mir ziemlich sicher, dass es funktionieren würde): for f in W(raw_input()):print f=> ''.join(W(raw_input()); a=open('c').read().split('\n')=>a=open('c').readlines()
Dienstag,
@ ɐɔıɐɔuʇǝɥʇs Dein erstes würde funktionieren, aber readlinesdie Zeilenumbrüche bleiben am Ende der Zeilen, weshalb ich es so gemacht habe, wie ich es getan habe.
KSab
@ ɐɔıɐɔuʇǝɥʇs Oh, anscheinend joinmüssen alle Elemente Zeichenfolgen sein, und ich kann sie nicht in einer kleineren Form erhalten, als ich sie bereits habe.
KSab
2

Cobra - 160

sig Z(x,y)
def f(b)
    c as Z=do(x,y)
        if x.length<1,print y
        for z in File.readLines('t'),if z==x[:e=z.length].toLower,c(x[e:],y+' '+z)
    for t in b,c(t,'[t]:')

Dies ist eine Funktion (eine Art von zwei Funktionen), die a übernimmt List<of String> * und die Zeichenfolgen ausgibt, die die möglichen Unterwortanordnungen für jede Zeichenfolge in der Argumentliste enthalten.

* der Typ ist tatsächlich List<of dynamic?>, aber wenn Sie etwas anderes angeben, List<of String>wird es wahrscheinlich nicht funktionieren.

Οurous
quelle
2

Scala, 132, 129

Edit: etwas kürzer als eine Schleife, die von stdin liest als eine Funktion

while(true)print(readLine.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _)))

Rennen wie

scala decompose.scala aft after erg glow low

(oder benutze eine längere Wortliste :))

Original:

def f(s:Seq[String])=s.map{_.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _))}

Funktion von Seq [String] bis Seq [Seq [List [String]]]. Nimmt das Wörterbuch als Befehlszeilenargument.

Ungolfed:

def decompose(wordList: Seq[String]) =
  wordList.map{ word =>                              // for each word
    word.foldRight(Seq(List(""))){ (char, accum) =>  // for each character
      accum.flatMap{list =>
        Seq(char+""::list,char+list.head::list.tail) // add it as both a new list and 
      }                                              // the to start of the first list
    }.filter(_.forall(args contains _))              // filter out lists w/ invalid words
  }

Ansatz ist es, alle möglichen Listen von Teilzeichenfolgen zu generieren und diejenigen herauszufiltern, die eine Zeichenfolge enthalten, die nicht im Wörterbuch enthalten ist. Beachten Sie, dass einige der generierten Teilzeichenfolgen eine zusätzliche leere Zeichenfolge enthalten. Ich gehe davon aus, dass die leere Zeichenfolge nicht im Wörterbuch enthalten ist (es gibt sowieso keine Möglichkeit, sie in der Befehlszeile weiterzugeben).

Paradigmensort
quelle