コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 042 A – 和風いろはちゃんイージー

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 042のA問題
https://atcoder.jp/contests/abc042/tasks/abc042_a

●問題文

日本の誇る美しいリズムとして、五七五というものがあります。いろはちゃんは五七五が大好きです。

3 つの文節の並びの長さがそれぞれ 5,7,5 となるようにこの順番で並んでいるとき、その 3 つの文節の並びは五七五であると言います。

並び替えたい 3 つの文節の長さを表す整数 A,B,C が与えられるので、それらの文節を並び替えて五七五にできるか判定してください。

●制約

  • 1≦A,B,C≦10

●入力

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

A B C

●出力

文節の並びを五七五にすることができるなら YES 、そうでないなら NO を出力せよ。

■回答

●愚直に書く

1つの配列に入れて、sortして、5, 5, 7になればOK、という感じかな?

nums = gets.split.map(&:to_i)

if nums.sort == [5, 5, 7]
  puts 'YES'
else
  puts 'NO'
end

通った!

三項演算子にしよう。

nums = gets.split.map(&:to_i)
puts nums.sort == [5, 5, 7] ? 'YES' : 'NO'

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

def main
  nums = read_nums
  puts iroha?(nums)
end

def iroha?(nums)
  if nums.sort == [5, 5, 7]
    'YES'
  else
    'NO'
  end
end

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

main

通った!

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

思いつかないけど、他の方法もあるような気はする…。

●他の方の回答例

整数で配列にするのではなく文字列のまま処理する方法もあるか。

●出てきたメソッド等

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

■振り返りなど

メソッド化、少しやらないとすぐ忘れる。
コツコツRubyに触れてないとダメだなぁと反省。