新手问题 数字分组 1

bluexuemei · 2014年04月30日 · 最后由 5swords 回复于 2014年05月01日 · 1891 次阅读

question:0-9共10个数字按2-4-4的长度分成3组,组成像01-2345-6789这样的组合,每组中的数字从小到大,列出所有的组合。 求简洁优雅高效的代码,高手们出招吧!

共收到 7 条回复

我能想出拆成好几个小方法的代码来,但是不好意思贴,还是等楼下一行党现身吧...

先完成再优化

(a=(0..9).to_a).combination(2).to_a.each {|b| (a-b).combination(4).to_a.each {|c| puts "#{b.join}-#{c.join}-#{(a-b-c).join}"}}

2:

(a=(0..9).to_a).combination(2).map {|b| (a-b).combination(4).map {|c| "#{b.join}-#{c.join}-#{(a-b-c).join}"}}.flatten

#2楼 @5swords 我还以为要自己实现组合,原来有 combination 方法,学习了。

文档不熟啊 T_T

#3楼 @blacktulip 哈哈,我也不熟,都是做一行党的时候逼的去翻文档,排列都有现成的。

arr = (0..9).to_a.shuffle
[arr[0, 2], arr[2, 4], arr[6, 4]].map &:sort

两行不行么

没看见所有

#2楼 @5swords 这个方法和我的思路一样,但是如果是分为5组的话,这个方法就比较麻烦。有没有更通用的方法?

#6楼 @bluexuemei

def combinations_string(a,n)
  return unless a.length == n.inject(:+)
  s=a.combination(n[0]).to_a
  n[1..-1].each do |i|
    s.length.times do
      x = s.pop
      (a-x).combination(i){|b| s.unshift x+b}
    end
  end
  s.map {|t| n.map{|r| t.shift(r).join }.join('-')}
end

combinations_string [*0..9],[2,4,2]
combinations_string [*0..9],[2,2,2,2,2]
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册