LoginSignup
0
0

More than 1 year has passed since last update.

4つの数字の組み合わせの和から最大値を求める[Ruby]

Posted at

問題

 1 から 9 までの数字の中から4つの数字を選択する。
4つの数字は同じ数値が重複する事もある。

4つの数字をあらゆる並べ方を試し、和の最大値(最大スコア)を求めます。

例えば、 1 の 2, 9, 3, 8 の 4 枚を使う場合、
以下の 12 通りの和の 175 が最大となる。

4つの数値の並べ方は 4! = 24 通り存在しますが、足し算は順序に依存しないため、12 通りのみ考慮すればよいことに注意してください。
たとえば、9, 2, 3, 8 の順で並べた場合のスコアは 92 + 38 = 130 となります。

例
・92 + 38 = 130
・92 + 83 = 175
・93 + 28 = 121
・93 + 82 = 175
・98 + 23 = 121
・98 + 32 = 130
・39 + 28 = 67
・38 + 29 = 67
・82 + 39 = 121
・89 + 23 = 112
・89 + 32 = 121
・83 + 29 = 112

条件

1 ≦ a, b, c, d ≦ 9

入力例1
2 9 3 8
出力例1
175

入力例2
7 8 7 7
出力例2
164

回答

input_line = gets.split(" ").sort { |a,b| a.to_i <=> b.to_i }.reverse
puts  "#{input_line[0]}#{input_line[2]}".to_i + "#{input_line[1]}#{input_line[3]}".to_i

回答(refactoring)

input_line = gets.split(" ").sort { |a,b| a.to_i <=> b.to_i }.reverse
puts  [input_line[0], input_line[2]].join.to_i + [input_line[1], input_line[3]].join.to_i

学び

sortメソッド / sort_byメソッド

a = [2,3,1,4,5,1]
p a.sort
#=> [1, 1, 2, 3, 4, 5]

s = ["aaaaa","b","cc"]
p s.sort_by {|array| array.size}
#=> ["b", "cc", "aaaaa"]

joinメソッド

配列の要素を連結して文字列を返すjoinメソッド

array = ["1", "5", "4"]
p array.join
# => "154"

p array.join("-")
# => "1-5-4"

おわりに

最終的な出力の際に

puts  [input_line[0], input_line[2]].join.to_i + [input_line[1], input_line[3]].join.to_i

としているが、[input_line[0], input_line[2]]この部分は、もう少しスマートに書ける気がする。

配列の中から指定したindexの要素を取り出し新たな配列を作り出すメソッドがあれば、もっとスマートに書けるようになるのではないか、見つからなかったけど,,,

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0