コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 051 A – Haiku

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 051のA問題
https://atcoder.jp/contests/abc051/tasks/abc051_a

●問題文

イルカは、新年に長さ 19 の文字列 s を受け取りました。
文字列 s の形式は [英小文字 (5) 文字],[英小文字 (7) 文字],[英小文字 (5) 文字] で表されます。
イルカは、カンマで区切られた文字列 s を、スペースで区切られた文字列に変換したいと思っています。
イルカの代わりに、この処理を行うプログラムを作ってください。

●制約

  • s の長さは 19 である。
  • s の 6 文字目と 14 文字目は , である。
  • それら以外の s の文字は英小文字である。

●入力

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

s

●出力

処理した後の文字列を出力せよ。

■回答

●愚直に書く

標準入力を取るときのsplitの区切り文字を,にして3つの要素が入った配列として受け取って、半角スペース入りで3つの変数を出力すればいけるかな?

s = gets.chomp.split(',')
puts s[0] + ' ' + s[1] + ' ' + s[2]

通った!

初めから3つの変数にした方がスッキリ書けそう。

a, b, c = gets.chomp.split(',')
puts a + ' ' + b + ' ' + c

通った!

●メソッド化して書く

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

def main
  haiku = read_str
  a = haiku[0]
  b = haiku[1]
  c = haiku[2]
  puts a + ' ' + b + ' ' + c
end

def read_str
  gets.chomp.split(',')
end

main

通った!
前回手こずったのと同じ考え方が出てきて、read_strをメインメソッドで一度別の変数に入れることで一度の参照で済ませるというのが使えた。

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

初めから薄々思っていたけど、これは正規表現でしょう。matchじゃなくてgsubか。

s = gets.chomp
puts s.gsub(/,/, ' ')

通った〜嬉しい!

●他の方の回答例

最上位層の方達は謎の書き方をされていてその辺はまだちゃんとわからないけど汗、皆さんgsubを使っていた。

●出てきたメソッド等

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

■振り返りなど

「愚直にかく」「メソッド化して書く」「別アプローチで書く」の全てを実践できたので嬉しい。