コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 063 A – Restricted

  • by

INDEX

■はじめに

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

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

■問題

●出典

AtCoder Beginner Contest 063のA問題
https://atcoder.jp/contests/abc063/tasks/abc063_a

●問題文

二つの整数 A, B が入力されます。A+B の値を出力してください。

ただし、A+B が 10 以上の場合は、代わりに error と出力してください。

●制約

  • A, B は整数である。
  • 1 ≤ A, B ≤ 9

●入力

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

A B

●出力

A+B が 10 以上の場合は、文字列 error を英小文字で出力せよ。そうでない場合は、A+B の値を出力せよ。

■回答

●愚直に書く

電卓のような挙動を作る、ということか。
まずは愚直に条件分岐。

a, b = gets.split.map(&:to_i)
if a + b < 10
  puts a + b
else
  puts "error"
end

通った!
三項演算子にして、

a, b = gets.split.map(&:to_i)
puts a + b < 10 ? a + b : "error"

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
メインメソッド、計算するメソッド、標準入力を取るメソッドの3つ。

def main
  a, b = read_nums
  puts calculate(a, b)
end

def calculate(a, b)
  a + b < 10 ? a + b : "error"
end

def read_nums
  gets.split.map(&:to_i)
end

main

通った!

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

標準入力を1つの変数に配列で入れてsumを使うという手もあるか。

a = gets.split.map(&:to_i)
puts a.sum < 10 ? a.sum : "error"

通った!

あとはifを使わずに実現できるかなぁと思ったけど断念…。

●他の方の回答例

sumは変数に入れる前に実行すれば、1回の記述で済む。なるほど。

a = gets.split.map(&:to_i).sum
puts a < 10 ? a : "error"

あとsumの代わりにinjectを使っている方も結構いた。inject、ちゃんと理解しきれていないけどひとまず今回はinject(:+)で 配列の要素をすべて足す、という用法を把握。

a = gets.split.map(&:to_i).inject(:+)
puts a < 10 ? a : "error"

●出てきたメソッド等

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

■振り返りなど

今回はsumを使ったけど、それに限らず「1つの配列で処理していく」という考え方は常に頭に置いておきたい。