【问题标题】:How do I get the sorting right in my algorithm's output?如何在算法的输出中正确排序?
【发布时间】:2013-12-28 03:43:04
【问题描述】:

我正在尝试构建一个简单的算法来检测数组中的两个或多个字符串是否与更大数组中的给定单词列表唯一匹配,例如 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'] 目标3: ['发光','欢乐','babss'] 目标4: ['basatragl', 'glee', 'bass']

我得到了这个输出(对于目标),但我不确定如何让输出更漂亮地排序:

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

我不确定我哪里出错了。如何将输出放入正确的存储桶中,并摆脱 \'s?

【问题讨论】:

  • 最近几周,这个问题或变种已经多次出现在 SO 上,例如here。你搜索过吗?
  • 看起来像一个家庭作业,尽管这似乎是一个不同的变体
  • 我在阅读您的更改后修改了我的答案。你会看到我也修改了我对问题的陈述,因为我现在明白了。如果这是正确的,我建议您编辑您的问题以合并它。就目前而言,您的问题仍然不清楚,如果您不解决它可能会被删除。 (无论如何它可能会被删除,因为您之前没有修复它。)您收到的答案不仅仅是为了您的利益;他们还可以帮助将来阅读您的问题的其他人。你应该感谢他们,感谢那些试图帮助你的人,写出清晰、简洁和完整的问题。
  • 我同意,对我来说很清楚,让我知道你还不清楚什么?

标签: ruby arrays algorithm


【解决方案1】:
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"]]

【讨论】:

  • 与 OP 预期输出不匹配
  • @user3125373 除了转义之外,输出和 OP 的预期输出没有区别
  • [['base', 'true', 'glee'], ['bees', 'true', 'glee']] 是预期的输出
  • @user3125373 你的问题和预期的答案似乎有冲突“我想返回一个数组数组,其中包含与他们自己数组中每个单独字符串的所有匹配项。” base、true 和 glee 如何证明这一点?
【解决方案2】:

如果我正确理解您的问题,这应该有效:

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 =&gt; {"base"=&gt;"bs", "true"=&gt;"tr",...,"basatragl"=&gt;"bstrgl"} 简化了后面的表达式。
  • each_with_object 枚举arr,对象是由表达式Hash.new{|h, k| h[k] = []} 创建的散列。以这种方式创建散列会使默认值成为空数组。如果h 是那个散列,h[k] &lt;&lt; vv 附加到数组h[k],如果散列有一个键k;否则将h[k] 设置为[],然后附加v,因此h[k] = [v]
  • 以下假设为target = ['bs', 'bbss', 'tr']
  • ht =&gt; {"bs"=&gt;["base", "bees"], "tr"=&gt;["true"], "bbss"=&gt;["babss"]}
  • a = target.reduce([]) {|ar, s| ar &lt;&lt; ht[s]} 创建和数组 a,由散列 ht[k] 的值 ht 组成,键为 k,按 target 中的顺序排列。 a =&gt; [["base", "bees"], ["babss"], ["true"]]
  • a.first = ["base", "bees"]a[1..-1] = [["babss"], ["true"]],所以 ["base", "bees"].product(*[["babss"], ["true"]]) # =&gt; [["base", "babss", "true"], ["bees", "babss", "true"]]

您需要澄清您的问题。如果你不这样做,它可能会吸引反对票并最终被删除。我的理解主要基于您引用的预期答案。这是我试图回答的问题:

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

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

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

【讨论】:

  • 我知道,这是一个棘手的问题,很难用语言表达。您的示例有效,除非目标数组中有更多长度不同的项目(即超过长度 = 2)。例如,如果我将“bss”放入数组中,它返回的输出顺序不正确。 Glee 将出现在 bass 之后,这让我意识到必须按照我的意愿进行一些字母排序;)
  • 如果您编辑问题以阐明您想要的内容,我将更改我的解决方案以满足您的要求,并提供一些输入/预期输出示例。
  • 谢谢,我已经这样做了,如果还有什么不清楚的地方告诉我?
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2021-04-12
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多