Ruby - 查看数字的倍数是否与原始数字完全相同(重新排列)

时间:2014-07-11 02:13:32

标签: ruby algorithm range permutation digit

我有一个号码,并且想看看我是否将该号码乘以实数,如果新号码与前一个号码具有完全相同的数字,则仅重新排列。例如,如果我想将数字乘以2并查看数字是否保持不变,我会这样做

125874
=> 251748

251748是125874乘以2并且两个数字具有完全相同的数字,仅重新排列。为简单起见,我现在只用2的倍数来测试它。这就是我试图做的并且失败了。

x = 125874
array = x.to_s.chars.map{|x|x.to_i}
  => [1,2,5,8,7,4]
array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i}
  => true

现在,我尝试在循环中运行它,以查找符合此条件的100,000以下的所有数字。

range = (1..100000).to_a
range.select do |x|
  array = x.to_s.chars.map{|x|x.to_i}
  array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i}
end
  => []

现在,它应该在该数组中记录至少125874,因为125874 * 2等于251748,这是125874的排列。

我想我在这个问题上让自己感到困惑。

1 个答案:

答案 0 :(得分:3)

首先假设如果给定的数字包含重复的数字,我们要求数字和乘数的数量和乘积包含出现在任一数字中的每个数字的相同数字:

def same_digits?(nbr, mult)
  nbr.to_s.chars.sort == (nbr * mult).to_s.chars.sort
end

same_digits?(125874,2) #=> true  (125874*2 => 251748)
same_digits?(125874,3) #=> false (125874*3 => 377622)

如果nbrnbr*prod必须包含相同的数字,但每个数字的数字不一定相同,则方法略有不同:

def same_digits?(nbr, mult)
   nbr.to_s.chars.uniq.sort == (nbr * mult).to_s.chars.uniq.sort
end

same_digits?(10255,2) #=> true   (10255*2 => 20510)
same_digits?(10255,3) #=> false  (10255*3 => 30765)

在第二种情况下,还有许多其他方法可以确定在删除重复项后两个数组是否包含相同的元素。让:

a = nbr.to_s.chars.uniq
b = (nbr*mult).to_s.chars.uniq

上面我使用a.sort == b.sort来检查匹配。以下是其他一些方法:

(a&b)==a && (a&b)==b         # Array intersection

(a-b).empty? && (b-a).empty? # Array difference

require 'set'
a.to_set == b.to_set