【Ruby基礎】AtCoder Beginner Contest 018 A – 豆まき

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

■問題

●出典

AtCoder Beginner Contest 018のA問題
https://atcoder.jp/contests/abc018/tasks/abc018_1

●問題文

太郎君と次郎君と三郎君の 3 人の人が豆まきで対戦をした。得点が高いほうが上の順位である。それぞれの得点が与えられるので、それぞれの順位を答えよ。

●入力

入力は以下の形式で標準入力から与えられる。

A
B
C
  • 1 行目には、太郎君の得点を表す整数 A(1≦A≦100) が与えられる。
  • 2 行目には、次郎君の得点を表す整数 B(1≦B≦100) が与えられる。
  • 3 行目には、三郎君の得点を表す整数 C(1≦C≦100) が与えられる。
  • A, B, C は互いに異なる。

●出力

出力は 3 行からなる。

  • 1 行目には太郎君の順位を表す整数を出力せよ。
  • 2 行目には次郎君の順位を表す整数を出力せよ。
  • 3 行目には三郎君の順位を表す整数を出力せよ。

■回答

●愚直に書く

まずは3つの標準入力を取って配列に入れる。

a = gets.to_i
b = gets.to_i
c = gets.to_i
ary = [a, b, c]

数字は3つと限定されており尚且つ3つの数字はそれぞれ異なるから、「最大値=1位」と「最小値=3位」と「それ以外=2位」という分岐ができそう。

ary.map do |n|
  if n == ary.max
    puts 1
  elsif n == ary.min
    puts 3
  else
    puts 2
  end
end

これらを組み合わせて、

a = gets.to_i
b = gets.to_i
c = gets.to_i
ary = [a, b, c]

ary.map do |n|
  if n == ary.max
    puts 1
  elsif n == ary.min
    puts 3
  else
    puts 2
  end
end

通った!

●リファクタリング/別アプローチ

もうちょいスマートな方法がありそうだけど思いつかない…

●他の方の回答例

最上位の方々の回答は相変わらず難しいが汗、上位層の回答を眺めていて自分なりに書いてみた。

ary = 3.times.map{gets.to_i}

ary.map do |x|
  puts ary.sort.reverse.index(x) + 1
end

ポイントは2つ。

  • 3行からなる標準入力を1行で取ってくる
  • .sort.reverseで降順に並べて、indexメソッドで要素が何番目にあるのか調べる(0始まりなので1を足す)

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

  • indexメソッドを使う回答を朧げながらも知ることができて良かった。