我有一个带10个按钮的密码锁,我必须按下4个按钮然后点击打开。按钮的顺序并不重要,每个按钮只能按一次。
我确信有一些概率论和排列会使这个问题变得容易,但我想用Ruby解决它。
我的想法是有一个while循环然后对计数器中的数字进行排序,如果每个数字只出现一次,那么尝试将其插入到散列中,我可以在最后得到散列的长度有多少组合。
但是如何对字符串中的数字进行排序呢?
或者有更聪明的算法吗?
答案 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"
你没有提供任何代码,所以我只想写一些提示来计算它的替代方法:
1
和0
来描述按钮组合。1
和0
可以看作二进制数。0
和2**10-1
(1023)number.to_s(2)
)1
的数量以检查是否按下了4个按钮1
s