■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。 基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
■問題
●出典
AtCoder Beginner Contest 083のA問題 https://atcoder.jp/contests/abc083/tasks/abc083_a
●問題文
上皿天秤は、左の皿に乗っているおもりの重さの合計を L
とし、右の皿に乗っているおもりの重さの合計を R
としたとき、 L > R
なら左に傾き、L = R
なら釣り合い、L < R
なら右に傾きます。
高橋君は、上皿天秤の左の皿に重さ A のおもりと重さ B のおもりを、右の皿に重さ C のおもりと重さ D のおもりを置きました。
上皿天秤が左に傾くなら Left を、釣り合うなら Balanced を、右に傾くなら Right を出力してください。
●制約
- 1≤A,B,C,D≤10
- 入力はすべて整数である
●入力
入力は以下の形式で標準入力から与えられる。
A B C D
●出力
上皿天秤が左に傾くなら Left を、釣り合うなら Balanced を、右に傾くなら Right を出力せよ。
■回答
●愚直に書く
直感的に宇宙船演算子が使えないかなと思ったけど、まずは愚直に書いていく。
a, b, c, d = gets.split.map(&:to_i)
ab = a + b
cd = c + d
if ab > cd
puts "Left"
elsif ab == cd
puts "Balanced"
else
puts "Right"
end
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をするコーナー。
今日はスキップ。
●リファクタリング/別アプローチ
宇宙船演算子、調べてやってみた。
a, b, c, d = gets.split.map(&:to_i)
answer = ["Balanced", "Left", "Right"]
puts answer[a + b <=> c + d]
通った!うれしい〜!!
●他の方の回答例
上位の方々も、変数に入れないとか色々コードを短くする技は使っているけど宇宙船演算子を使っていた。
●出てきたメソッド等
公式リファレンスを見る訓練。
- module Comparable
https://docs.ruby-lang.org/ja/latest/class/Comparable.html
<=>
、いわゆる宇宙船演算子。
■振り返りなど
宇宙船演算子を使えて嬉しかった。 直感的に思いつけたのと、実際使うにあたって一回配列に入れてそのインデックスを取るという流れも調べずに思いつけて良かった。