コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 053 A – ABC/ARC

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 053のA問題
https://atcoder.jp/contests/abc053/tasks/abc053_a

●問題文

すめけくんは現在のレートが 1200 未満ならば AtCoder Beginner Contest (ABC) に、そうでなければ AtCoder Regular Contest (ARC) に参加することにしました。 すめけくんの現在のレート x が与えられます。すめけくんが参加するコンテストが ABC ならば ABC と、そうでなければ ARC と出力してください。

●制約

  • 1≦x≦3,000
  • x は整数

●入力

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

x

●出力

答えを出力せよ。

■回答

●愚直に書く

1200未満の場合とそうでない場合で条件分岐させる。

x = gets.to_i
if x < 1200
  puts "ABC"
else
  puts "ARC"
end

通った!

三項演算子にして、

x = gets.to_i
puts x < 1200 ? "ABC" : "ARC"

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
メインメソッド、ABCかどうかの判定メソッド、標準入力を取得するメソッドを作成。

def main
  x = read_num
  puts is_ABC?(x)
end

def is_ABC?(x)
  if x < 1200
    "ABC"
  else
    "ARC"
  end
end

def read_num
  gets.to_i
end

main

通った!

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

三項演算子はもうやったし、他に思いつかないので割愛。

●他の方の回答例

面白かった回答が2つ。

<1つ目>

puts gets<"1200"?:ABC: :ARC

標準入力側をto_iするのではなくて1200の方をstringにしている。これでも比較できるんだ…?

<2つ目>

puts "A#{'RRB'[gets.to_i<=>1200]}C"

<=>見たことある!飛行船演算子だっけ、と思ったら宇宙船演算子だった笑。
これは何をしてるかというと、ABCARCのどちらでもACは確定しているので、出し分けが必要なのはBRだけ。それを判定するために宇宙船演算子で返される-101をうまく活用して

  • 'RRB'[-1]→B
  • 'RRB'[0]→R
  • 'RRB'[1]→R

となるようにしている。なるほど…!!!

●出てきたメソッド等

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

■振り返りなど

宇宙船演算子。いつかサラッと使ってみたい。