【问题标题】:Ruby - Divide Items from one array by the items of a different array, one by one, and throw a new array [closed]Ruby - 将一个数组中的项目逐一除以不同数组的项目,然后抛出一个新数组[关闭]
【发布时间】:2023-03-29 10:23:01
【问题描述】:

我有两个数组

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

y = [2, 4]

我想从我的数组 x 中找到可以被我的数组 y 的项整除的项,并创建一个带有结果编号的新数组。在这种情况下 [4, 8, 12, 16, 18]。 我想找到一个代码,它可以使用不同的数组长度和不同的数字,而不仅仅是上面示例中的数字。

【问题讨论】:

  • “我想找一个代码”,但是,你试过了吗?
  • 我尝试过使用 .find 方法,但我没有找到一种方法将项目逐个除以第二个数组的项目。我尝试过这样的事情:x.find {|item| item % ...(这是我卡住的地方)= 0}
  • 你的意思是y中的所有项目都可以整除吗? 18 是这样吗?
  • 您遇到问题的代码是什么?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?请提供minimal reproducible example。请注意Stack Overflow不是代码编写服务,你需要展示你的努力!

标签: arrays ruby math operation items


【解决方案1】:

假设数组如下。

x = [12, 24, 36, 54, 72, 96, 108] 
y = [12, 9]

我们可以看到x的元素可以被y的所有元素整除:

[36, 72, 108]

为了有效地获得这个数组,我们可以首先将y 的每个元素转换为其主要除数:

require 'prime'

ypd = y.map { |n| Prime.prime_division(n) }
  #=> [[[2, 2], [3, 1]], [[3, 2]]] 

Prime::prime_division

例如,考虑12 的主要除数。我们看到它们是由数组给出的

[[2, 2], [3, 1]]

这只是意味着

(2**2)*(3**1) #=> 4*3 #=> 12

我们观察到x 的元素要被y 的两个元素整除,它必须能被素数除数由下式给出的单个数字整除

[[2, 2], [3, [1, 2].max]] #=> [[2, 2], [3, 2]]

这是

(2**2)*(3**2) #=> 36

通过扩展,我们可以简单地将y 的所有元素组合成一个数字,而不管y 的大小。可以这样做。

h = ypd.each_with_object({}) do |a,h|
  a.each do |prime,count|
    h.update(prime => count) { |_,o,n| [o,n].max }
  end
end  
  #=> {2=>2, 3=>2}

因此,那个单一的数字是:

z = h.reduce(1) { |n,(prime,count)| n*(prime**count) }
  #=> 36

最后,我们可以从x中选择感兴趣的元素:

x.select { |n| (n % z).zero? }
  #=> [36, 72, 108]

【讨论】:

  • 您也可以通过[12, 9].inject(:lcm) 获得 36(尽管根据输入,它可能比素数分解要慢)
  • @Stefan,也许 lcm 应该从 lcm(n) 更改为 lcm(*args)
  • 是的,这很有用(诚然,我不是 Ruby 的 first.something(*rest) 方法的忠实粉丝 - IMO 这些应该是 class 方法,例如 Array.union(foo, bar, baz) foo.union(bar, baz)productconcatzip 等)
【解决方案2】:

我会建议这个

x.each_with_object([]) do |i, new_array|
  new_array << i if divisible_by_arrays_members(y, i)
end

方法divisible_by_arrays_members

def divisible_by_arrays_members(array, number)
  array.each { |i| return false if number % i != 0 }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2019-11-29
    • 2012-04-18
    相关资源
    最近更新 更多