Sha*_*rog 1 ruby string algorithm
给定一组字符串,说:
"Alice"
"Bob"
"C"
"Ca"
"Car"
"Carol"
"Caroling"
"Carousel"
Run Code Online (Sandbox Code Playgroud)
并给出一个字符串,说:
"Carolers"
Run Code Online (Sandbox Code Playgroud)
我想要一个函数,它返回数组中尚未包含的最小前缀.
对于上面的示例,函数应返回:"Caro".(随后的电话将返回"Carole")
我是Ruby的新手,虽然我可能会破解丑陋的东西(使用我的C/C++/Objective-C大脑),但我想学习如何正确(优雅地?)编写代码.
Ruby中有一个鲜为人知的神奇模块叫做Abbrev.
require 'abbrev'
abbreviations = Abbrev::abbrev([
"Alice",
"Bob",
"C",
"Ca",
"Car",
"Carol",
"Caroling",
"Carousel"
])
carolers = Abbrev::abbrev(%w[Carolers])
(carolers.keys - abbreviations.keys).sort.first # => "Caro"
Run Code Online (Sandbox Code Playgroud)
上面我拿了第一个元素,但这显示了还有什么可用.
pp (carolers.keys - abbreviations.keys).sort
# >> ["Caro", "Carole", "Caroler", "Carolers"]
Run Code Online (Sandbox Code Playgroud)
将所有上述内容包装在一个函数中,计算生成的缺失元素,然后迭代它们,将它们放到一个块中,或者使用枚举器逐个返回它们.
这是为单个单词生成的内容.对于阵列来说,它更复杂.
require 'pp'
pp Abbrev::abbrev(['cat'])
# >> {"ca"=>"cat", "c"=>"cat", "cat"=>"cat"}
pp Abbrev::abbrev(['cat', 'car', 'cattle', 'carrier'])
# >> {"cattl"=>"cattle",
# >> "catt"=>"cattle",
# >> "cat"=>"cat",
# >> "carrie"=>"carrier",
# >> "carri"=>"carrier",
# >> "carr"=>"carrier",
# >> "car"=>"car",
# >> "cattle"=>"cattle",
# >> "carrier"=>"carrier"}
Run Code Online (Sandbox Code Playgroud)