将单词分解为其他单词(例如,“余辉” =“尾部” +“ erg” +“低”)


13

这是供您所有词匠使用的工具!编写一个程序或函数,该程序或函数接受单词列表并为每个单词生成所有可能的级联分解的列表。例如:

(注意:这仅是一个小样本,用于说明目的。实际输出量要大得多。)

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

好的,您知道了。:-)

规则

  • 使用您选择的任何编程语言。每种语言的字符数最短的代码获胜。这意味着每种使用的语言都有一个赢家。总冠军将是所有提交者中最短的代码。
  • 输入列表可以是文本文件,标准输入或您的语言提供的任何列表结构(列表,数组,字典,集合等)。单词可以是英语或任何其他自然语言。(如果列表是英文单词,则您将忽略或预过滤除“ a”和“ i”之外的单字母项目。类似地,对于其他语言,如果它们不合逻辑,则将它们忽略。出现在文件中。)
  • 输出列表可以是文本文件,标准输出或您的语言使用的任何列表结构。
  • 您可以使用任何喜欢的输入词典,但是您可能想要使用提供有意义的单词的词典,而不是提供太多晦涩,奥秘或难以理解的单词的词典。我使用的这个文件:超过58000个英语单词的Corncob列表

问题

这个挑战主要是关于编写代码来完成任务,但是梳理结果也很有趣...

  1. 哪些子词最常出现?
  2. 哪个单词可以分解为最多的子单词?
  3. 哪个词可以以最不同的方式分解?
  4. 什么词由最大的子词组成?
  5. 您发现哪些分解最有趣?

@Geobits —啊,谢谢!我错过了alienation剪切和粘贴时的两个分解。立即修复。在其他方面,上面的列表只是一个小样本。当给出玉米芯列表时,我的测试程序生成了数以万计的答案。
Todd Lehman

1
“哪些子词最常出现?” 会在外面大肆猜测,并说“ a”可能在顶部附近。
Sellyme

@SebastianLamerichs-我不知道...可能是,也许不是。:)
托德·雷曼

@ToddLehman该句子正好包含0个子词,因此'a'首先仍然相等:P
Sellyme'Sep

@SebastianLamerichs,如果您指的是托德对您的回复,则“ dunno”可以分为“ dun” +“ no”。;)
我惊吓了外星人

Answers:


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

不是特别有效,但实际上并不可怕。它只是天真地(我想这是可能的,尽管我认为python不太可能进行一些聪明的优化)检查子词是否存在于corncob词典中,然后递归地找到尽可能多的词。当然,这本词典非常广泛,您可以尝试其中一种不包含各种缩写词和首字母缩略词的字典(导致类似的现象bedridden: be dr id den)。另外,链接的字典似乎没有将“ A”或“ I”列为单词,因此我手动添加了它们。

编辑:

现在,第一个输入是要使用的字典的文件名,其他每个输入都是一个单词。


值得说明的是,这是Python 2,因为该代码无法在Python 3中运行,因为print f应该是print(f)

另外,我该如何运行?echo archer|python2 filename.py输出最后一行的EOFError

您仍然可以更改某些内容(我还没有测试过这些,但是我很确定它会起作用):for f in W(raw_input()):print f=> ''.join(W(raw_input()); a=open('c').read().split('\n')=>a=open('c').readlines()
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎs您的第一个可以工作,但是readlines将换行符保留在行尾,这就是我这样做的原因。
KSab 2014年

@ɐɔıʇǝɥʇuʎs哦,看来join所有元素都必须是字符串,我无法以比我已经拥有的形式小的形式得到它。
KSab 2014年

2

眼镜蛇-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]:')

这是一个函数(由两个函数组成),带List<of String>*,并打印包含参数列表中每个字符串可能的子单词排列的字符串。

*该类型实际上是List<of dynamic?>,但提供List<of String>可能会破坏它的其他方法。


2

斯卡拉,132 129

编辑:从stdin读取的循环比函数短一点

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

运行为

scala decompose.scala aft after erg glow low

(或使用更长的单词列表:))

原版的:

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 _))}

从Seq [String]到Seq [Seq [List [String]]]的函数。将字典作为命令行参数。

取消高尔夫:

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
  }

方法是生成所有可能的子字符串列表,并过滤掉那些不在字典中的字符串。请注意,生成的某些子字符串包含一个额外的空字符串,我假设该空字符串将不在字典中(无论如何也无法在命令行中将其传递)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.