ruby - 无法通过 Ruby 将字母中的英文单词组合起来

标签 ruby knuth

我需要找到可以由字符串中的字母组成的所有英文单词

 sentence="Ziegler's Giant Bar"

我可以制作一个字母数组

 sentence.split(//)  

如何从 Ruby 中的句子中拼出超过 4500 个英文单词?

[编辑]

最好将问题分成几个部分:

  1. 仅制作一个不超过 10 个字母的单词数组
  2. 较长的单词可以单独查找

最佳答案

[假设您可以在一个词中重复使用源字母]:对于词典列表中的每个词,构造两个字母数组 - 一个用于候选词,一个用于输入字符串。从单词字母数组中减去输入的字母数组,如果没有剩下任何字母,则匹配成功。执行此操作的代码如下所示:

def findWordsWithReplacement(sentence)
    out=[]
    splitArray=sentence.downcase.split(//)
    `cat /usr/share/dict/words`.each{|word|
        if (word.strip!.downcase.split(//) - splitArray).empty?
            out.push word
        end
     }
     return out
end

您可以像这样从 irb 调试器调用该函数:

output=findWordsWithReplacement("some input string"); puts output.join(" ")

...或者这是一个包装器,您可以使用它从脚本中以交互方式调用该函数:

puts "enter the text."
ARGF.each {|line|
    puts "working..."
    out=findWordsWithReplacement(line)
    puts out.join(" ")
    puts "there were #{out.size} words."
}

在 Mac 上运行时,输出如下所示:

$ ./findwords.rb
enter the text.
Ziegler's Giant Bar
working...
A a aa aal aalii Aani Ab aba abaiser abalienate Abantes Abaris abas abase abaser Abasgi abasia Abassin abatable abate abater abatis abaze abb Abba abbas abbasi abbassi abbatial abbess Abbie Abe abear Abel abele Abelia Abelian Abelite abelite abeltree Aberia aberrant aberrate abet abettal Abie Abies abietate abietene abietin Abietineae Abiezer Abigail abigail abigeat abilla abintestate
[....]
Z z za Zabaean zabeta Zabian zabra zabti zabtie zag zain Zan zanella zant zante Zanzalian zanze Zanzibari zar zaratite zareba zat zati zattare Zea zeal zealless zeallessness zebra zebrass Zebrina zebrine zee zein zeist zel Zelanian Zeltinger Zen Zenaga zenana zer zest zeta ziara ziarat zibeline zibet ziega zieger zig zigzag zigzagger Zilla zing zingel Zingiber zingiberene Zinnia zinsang Zinzar zira zirai Zirbanit Zirian Zirianian Zizania Zizia zizz
there were 6725 words.

这远远超过 4500 个单词,但那是因为 Mac 单词词典非常大。如果您想准确重现 Knuth 的结果,请从此处下载并解压缩 Knuth 的词典:http://www.packetstormsecurity.org/Crackers/wordlists/dictionaries/knuth_words.gz并将“/usr/share/dict/words”替换为解压缩替代目录的路径。如果你做对了,你会得到 4514 个单词,以这个集合结尾:

zanier zanies zaniness Zanzibar zazen zeal zebra zebras Zeiss zeitgeist Zen Zennist zest zestier zeta Ziegler zig zigging zigzag zigzagging zigzags zing zingier zings zinnia

我相信这回答了最初的问题。

或者,提问者/读者可能希望列出可以从字符串构造的所有单词, 不重复使用任何输入字母。我建议的代码如下:复制候选词,然后对于输入字符串中的每个字母,从副本中破坏性地删除该字母的第一个实例(使用“切片!”)。如果此过程吸收了所有字母,则接受该词。

def findWordsNoReplacement(sentence)
    out=[]
    splitInput=sentence.downcase.split(//)
    `cat /usr/share/dict/words`.each{|word|
        copy=word.strip!.downcase
        splitInput.each {|o| copy.slice!(o) }
        out.push word if copy==""
     }
     return out
end

关于ruby - 无法通过 Ruby 将字母中的英文单词组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843034/

相关文章:

ruby - 如何进行 Mechanize 多重搜索?

assembly - MIX DIV 运算符,以及打包字节数的转换

algorithm - 较大循环串中的最小循环子串

java - 优化 Leaper Graph 算法?

assembly - MIX 中的除法是如何进行的?

Ruby:将可变数量的参数(包括可选 block )转发到不同的函数

ruby - 如何从正在运行的脚本转到 IRB 提示符?

ruby - ljust 可以在每个 block 中使用吗?

ruby - 如何在使用 "peek"的同时遍历 Ruby 中的文件而不丢失一半数据?