INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 059のA問題
https://atcoder.jp/contests/abc059/tasks/abc059_a
●問題文
英小文字からなる 3 つの単語 s1, s2, s3 が空白区切りで与えられるので、単語の先頭の文字をつなげ、大文字にした略語を出力してください。
●制約
- s1, s2, s3 は英小文字からなる。
- 1≦∣si∣≦10(1≦i≦3)
●入力
入力は以下の形式で標準入力から与えられる。
s1 s2 s3
●出力
答えを出力せよ。
■回答
●愚直に書く
3つのた単語をそれぞれ変数に入れて、1文字目だけ抜き出してそれを大文字にして、繋げれば良いはず。
# 回答1
s1, s2, s3 = gets.split.map(&:chomp)
puts s1[0].capitalize + s2[0].capitalize + s3[0].capitalize
通った!
大文字への変換は1回で済ませたいな…。
# 回答2
s1, s2, s3 = gets.split.map(&:chomp)
s = s1[0] + s2[0] + s3[0]
puts s.upcase
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、メインメソッド、3つの文字の1文字目を連結するメソッド、標準入力を取るメソッドの3つ。
# 回答3
def main
s1, s2, s3 = read_str
puts join_str(s1, s2, s3).upcase
end
def join_str(s1, s2, s3)
s1[0] + s2[0] + s3[0]
end
def read_str
gets.split.map(&:chomp)
end
main
通った!
●リファクタリング/別アプローチ
回答2では大文字にする処理を1回にできたけど、文字列1文字目を抽出する作業が重複してしまっているのでもっとスマートにできるはず。
標準入力を1つの変数に配列で入れて、mapで処理できそう。
# 回答4
array = gets.split.map(&:chomp)
puts array.map { |s| s[0].capitalize }.join
通った! map
の使い方をちょっと忘れていたので汗、定期的に使わないと…。
●他の方の回答例
最上位の方々の書き方がちょっとわからないが汗、上位の回答をひと通り見てみると考え方としては自分が書いたものと一致していた。
自分の回答は標準入力の取り方にちょっと無駄があって、下記くらいが良さそう。
# 回答5
array = gets.split.map{|a| a[0]}
puts array.join.upcase
●出てきたメソッド等
公式リファレンスを見る訓練。
- String#capitalize
https://docs.ruby-lang.org/ja/latest/method/String/i/capitalize.html - String#upcase
https://docs.ruby-lang.org/ja/latest/method/String/i/upcase.html - Array#join
https://docs.ruby-lang.org/ja/latest/method/Array/i/join.html - Enumerable#collect(
map
のエイリアス)
https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/collect.html
■振り返りなど
mapをもうちょっとちゃんと理解して適切に使えるようになりたい。