問題。
プログラミングの質問です(VB、VC等で) | OKWave
自分は麻雀の結果の集計をしていて面倒な作業があり、プログラムを組めないだろうかと考えて
おりますが、アルゴリズムを作成してコーディングしようにもどうやればいいのか分からないの
でどうしたものかと困っております。どうしたらよいか、わかる方はどなたかお教え頂ければ助
かります。
質問01.異なる16個~24個の数字があり、その中の4つの数字の和が0ずつになるように
それぞれ分けたいのですが、どのようにすればよいでしょうか?
例えば、45、10、-25、-30、55、20、-45、-30、25、15、-10、-
30、80、25、-35、-70の16個の数字があったとすれば、(45、10、-25、
-30)、(55、20、-45、-30)、(25、15、-10、-30)、(80、25、
-35、-70)の4つずつ4組にわけられようにできるプログラムを組みたいのです。なお、
数字は整数のみで、他にも20個の場合もありますし、24個の場合もあります。
質問02.10人~20人の人数で4人ずつ麻雀卓(10~11人の場合は2つの麻雀卓、12
~15人の場合は3つの麻雀卓、16人以上は4つの麻雀卓(最大4卓))に座らせて、5回戦
を戦わせたいと考えております。その際には、できる限り違う人と戦わせたいとした場合、どの
ような組み合わせができるかをプログラムで自動的に割り出したいのですが、どのようにすれば
よいでしょうか?
なお、10人や11人などの人数の場合は2人余り、3人余りとなり、卓には座れず待つので、
その余った人は5回戦の内1回戦えないため4回戦だけとなります。さらに、できるだけばらけ
た組み合わせは表などのようにわかりやすく表示できればより幸いです。
以上ですが、両方できれば最高ですが、どちらか一方でも構いませんので宜しくお願い致します。
ANo.2
#1の者です。
麻雀の競技結果の集計だから、ゼロサムになるのは当たり前でしたね。
16個、20個、24個くらいであれば、それらから4個を選ぶ組合せを
総当たりで求めてもさほど大きな数にはならないので、
愚直ではありましょうがいちばん確実だと思います。
ANo.1
質問01についてお聞きします。
当該の16個、20個、または24個の整数の全体の合計が0であることは
保証済みなのでしょうか。
補足
はい、それはもちろん保証済みです。合計は0になり、元々4つずつの合計が0だったものなのですが、
どの4つの数字の組み合わせが0であったのかがわからなくなってしまったのです。
24C4 でも16000くらいなので、Ruby でやってみた。
combination とかいうメソッドがあるのでとても楽。
>irb
irb(main):001:0> x=[45,10,-25,-30,55,20,-45,-30,25,15,-10,-30,80,25,-35,-70]
=> [45, 10, -25, -30, 55, 20, -45, -30, 25, 15, -10, -30, 80, 25, -35, -70]
irb(main):004:0> x.combination(4){|a,b,c,d| puts "[#{a},#{b},#{c},#{d}]" if a+b+c+d == 0}
[45,10,-25,-30]
[45,10,-25,-30]
[45,10,-25,-30]
[45,10,-45,-10]
[45,10,15,-70]
[45,-25,-45,25]
[45,-25,-45,25]
[45,-25,15,-35]
[45,-30,55,-70]
[45,-30,20,-35]
[45,-30,-30,15]
[45,-30,15,-30]
[45,55,-30,-70]
[45,55,-30,-70]
[45,20,-30,-35]
[45,20,-30,-35]
[45,-30,15,-30]
[10,-25,25,-10]
[10,-25,-10,25]
[10,-30,55,-35]
[10,55,-30,-35]
[10,55,-30,-35]
[10,20,-45,15]
[-25,55,-45,15]
[-25,20,15,-10]
[-25,-45,-10,80]
[-25,15,80,-70]
[-30,55,20,-45]
[-30,20,80,-70]
[-30,25,15,-10]
[-30,15,-10,25]
[55,20,-45,-30]
[55,20,-45,-30]
[55,-45,25,-35]
[55,-45,25,-35]
[55,25,-10,-70]
[55,-10,25,-70]
[20,-30,80,-70]
[20,25,-10,-35]
[20,25,25,-70]
[20,-10,25,-35]
[20,-30,80,-70]
[-30,25,15,-10]
[-30,15,-10,25]
[25,15,-10,-30]
[25,80,-35,-70]
[15,-10,-30,25]
[80,25,-35,-70]
=> [45, 10, -25, -30, 55, 20, -45, -30, 25, 15, -10, -30, 80, 25, -35, -70]
ちょっと悪のり。
irb(main):018:0* x.combination(4).select{|x| x.inject(:+) == 0}
=> [[45, 10, -25, -30], [45, 10, -25, -30], [45, 10, -25, -30], [45, 10, -45, -10],
[45, 10, 15, -70], [45, -25, -45, 25], [45, -25, -45, 25], [45, -25, 15, -35],
[45, -30, 55, -70], [45, -30, 20, -35], [45, -30, -30, 15], [45, -30, 15, -30],
[45, 55, -30, -70], [45, 55, -30, -70], [45, 20, -30, -35], [45, 20, -30, -35],
[45, -30, 15, -30], [10, -25, 25, -10], [10, -25, -10, 25], [10, -30, 55, -35],
[10, 55, -30, -35], [10, 55, -30, -35], [10, 20, -45, 15], [-25, 55, -45, 15],
[-25, 20, 15, -10], [-25, -45, -10, 80], [-25, 15, 80, -70], [-30, 55, 20, -45],
[-30, 20, 80, -70], [-30, 25, 15, -10], [-30, 15, -10, 25], [55, 20, -45, -30],
[55, 20, -45, -30], [55, -45, 25, -35], [55, -45, 25, -35], [55, 25, -10, -70],
[55, -10, 25, -70], [20, -30, 80, -70], [20, 25, -10, -35], [20, 25, 25, -70],
[20, -10, 25, -35], [20, -30, 80, -70], [-30, 25, 15, -10], [-30, 15, -10, 25],
[25, 15, -10, -30], [25, 80, -35, -70], [15, -10, -30, 25], [80, 25, -35, -70]]
irb(main):019:0> x.combination(4).select{|x| x.inject(:+) == 0}.length
=> 48
お粗末。
最初、x.sum とかやったのはナイショだ :)