对字符串或整数中的数字进行排序?

时间:2017-01-18 22:08:34

标签: ruby math

我有一个带10个按钮的密码锁,我必须按下4个按钮然后点击打开。按钮的顺序并不重要,每个按钮只能按一次。

我确信有一些概率论和排列会使这个问题变得容易,但我想用Ruby解决它。

我的想法是有一个while循环然后对计数器中的数字进行排序,如果每个数字只出现一次,那么尝试将其插入到散列中,我可以在最后得到散列的长度有多少组合。

但是如何对字符串中的数字进行排序呢?

或者有更聪明的算法吗?

2 个答案:

答案 0 :(得分:2)

所以,有些事情,你说订单并不重要,所以我们只需要独特的组合。你还说每个按钮只能被按一次。

你还说你想用ruby来解决它,那么为什么要用一种非常简单的方法来编写你自己的复杂方法呢?

你似乎想要一个数组,而不是哈希。

这将实现这一点,但是在数组中:

[0,1,2,3,4,5,6,7,8,9].combination(4).to_a

这将把它放在哈希。

combinations_in_hash = Hash.new
[0,1,2,3,4,5,6,7,8,9].combination(4).to_a.each_with_index { |x,i| combinations_in_hash[i] = x }
combinations_in_hash

但是,让我们说组合DID的顺序......

combinations_in_hash = Hash.new
[0,1,2,3,4,5,6,7,8,9].combination(4).to_a.each_with_index { |x,i| combinations_in_hash[x] = Array.new(x.permutation.to_a) }
combinations_in_hash

或者以数组形式:

[0,1,2,3,4,5,6,7,8,9].permutation(4).to_a

置换可以通过传递长度的参数来组合组合/置换效果。以防万一!

这是5,040种可能的组合。还不错!

答案 1 :(得分:1)

数学

如果我理解正确,“最聪明的算法”就是计算10 choose 4

您的问题

如果您只想计算独特元素,则Set可能比Hash更适合。

如果您有一个字符串并想要对数字进行排序,您可以使用:

'4132'.chars.sort
#=> ["1", "2", "3", "4"]
'4132'.chars.sort.join
#=> "1234"

替代

你没有提供任何代码,所以我只想写一些提示来计算它的替代方法:

  • 您可以使用10 10来描述按钮组合。
  • 这10个10可以看作二进制数。
  • 此二进制数介于02**10-1(1023)
  • 之间
  • 您可以迭代此范围内的每个数字,并将其转换为二进制(number.to_s(2)
  • 您可以计算1的数量以检查是否按下了4个按钮
  • 您可以计算恰好有4 1 s
  • 的二进制数字