如何在算法输出中获得排序?

时间:2013-12-28 03:43:05

标签: ruby arrays algorithm

我正在尝试构建一个简单的算法来检测数组中的两个或多个字符串是否在一个更大的数组中唯一匹配给定的单词列表,例如g中只有一个字符的外观,和元音的无限量出现aeiou

较短阵列中的辅音应保持与目标中相同的顺序。

我想返回一个数组数组,其中所有匹配项都在自己的数组中的每个字符串中:

示例:

target = ["bs", 'tr', 'gl',...] #etc...(Imagine if there were n items in the array, an each array item need not be only 2-chars long.

target2 = ['bs', 'tr', 'bbss']
target3 = ['glw', 'gl', 'bbss']
target4 = ['bstrgl', 'gl', 'bss']

arr = ['base', 'true', 'glow', 'bees', 'bass', 'sabb', 'babss', 'glee', 'basatragl']

q = []


for x in 0..s.length
word = arr.collect{ |z| [z, z.gsub(/[aeiou]/,"")] }.select{ |z| z[1] == s[x]}.collect{|z| z[0]}

q << word
end

p q

编辑: 对于目标,预期输出为:

#=> [['base', 'true', 'glee'], ['bees', 'true', 'glee']]

# for this example, this is the total amount of answers possible given array arr.  

# all others either have more than 1 b or s, or contain other consonants.

对于目标2:     ['base','true','babss'],['bees','true','babss'] target3:     ['glow','glee','babss'] target4:     ['basatragl','glee','bass']

我正在获取此输出(对于目标),但我不确定如何将输出排序更加漂亮如上所述:

[[\"base"\, \"bees"\], [\"true"\,], [\"glee"\]]  

我不确定我哪里出错了。如何将输出转换为正确的桶,还可以摆脱它的?

2 个答案:

答案 0 :(得分:0)

arr = ['base', 'true', 'glow', 'bees', 'bass', 'sabb', 'babss', 'glee', 'basatragl']
target = ["bs", 'tr', 'gl']

arr.each_with_object({}) do |word,hash| 
   if target.include? word.tr("aeiou","")
     hash[word.tr("aeiou","")] ||= []
     hash[word.tr("aeiou","")] << word
   end
 end.values
=> [["base", "bees"], ["true"], ["glee"]]

答案 1 :(得分:0)

如果我理解你的问题,这应该有效:

def doit(arr, target)
 hh = Hash[arr.map {|w| [w, w.tr('aeiou', '')]}]
 ht = arr.each_with_object(Hash.new{|h, k| h[k] = []}) \
   {|w, h| h[hh[w]] << w if target.include?(hh[w])}
 a = target.reduce([]) {|ar, s| ar << ht[s]}
 a.first.product(*a[1..-1])
end

arr = %w[base true glow bees bass sabb babss glee basatragl]
  # => ["base", "true", "glow",..., "basatragl"] 

doit(arr, ["bs", 'tr', 'gl'])
  # => [["base", "true", "glee"], ["bees", "true", "glee"]] 
doit(arr, ['bs', 'tr', 'bbss'])
  # => [["base", "true", "babss"], ["bees", "true", "babss"]] 
doit(arr, ['glw', 'gl', 'bbss'])
  # => [["glow", "glee", "babss"]] 
doit(arr, ['bstrgl', 'gl', 'bss'])
  # => [["basatragl", "glee", "bass"]]

让我们看看这里发生了什么:

  • 创建哈希hh => {"base"=>"bs", "true"=>"tr",...,"basatragl"=>"bstrgl"}简化了后面的表达式。
  • each_with_object枚举arr,其对象是由表达式Hash.new{|h, k| h[k] = []}创建的哈希。以这种方式创建哈希会使默认值为空数组。如果h是该哈希值,则h[k] << v会将v附加到数组h[k],如果哈希值具有密钥k;其他h[k]设置为[],然后追加v,因此h[k] = [v]
  • 对于以下内容,请假设为target = ['bs', 'bbss', 'tr']
  • ht => {"bs"=>["base", "bees"], "tr"=>["true"], "bbss"=>["babss"]}
  • a = target.reduce([]) {|ar, s| ar << ht[s]}创建数组a,其中包含哈希ht[k]的值ht,其密钥k的排序方式与target中的密钥相同。 a => [["base", "bees"], ["babss"], ["true"]]
  • a.first = ["base", "bees"]a[1..-1] = [["babss"], ["true"]],所以["base", "bees"].product(*[["babss"], ["true"]]) # => [["base", "babss", "true"], ["bees", "babss", "true"]]

你需要澄清你的问题。如果你不这样做,它可能会吸引负面投票并最终被删除。我的理解很大程度上取决于你引用的预期答案。这是我试图回答的问题:

给定数组arrtarget,每个数组都不包含重复值,构造一个数组数组(后者中的每一个都称为asub),这样:

  • 每个数组asub的大小为target.size,由arr的唯一元素组成;和
  • 如果从a, e, i, o, u的每个元素中删除了元音asubasub等于target

是的,这有点拗口,但准确一点很重要。如果您编辑问题,可以免费使用这些单词或其中的一些变体。