INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 048のA問題
https://atcoder.jp/contests/abc048/tasks/abc048_a
●問題文
すぬけ君は、AtCoder s Contest という名前のコンテストを開こうとしています。 ここで、s は長さ 1 以上の文字列であり、1 文字目は英大文字、2 文字目以降は英小文字です。
すぬけ君は、このコンテストの略称を AxC に決めました。 ここで、x は s の先頭の英大文字です。
コンテストの名前が与えられるので、コンテストの略称を出力してください。
●制約
- s の長さは 1 以上 100 以下である。
- s の 1 文字目は英大文字である。
- s の 2 文字目以降は英小文字である。
●入力
入力は以下の形式で標準入力から与えられる。
AtCoder s Contest
●出力
コンテストの略称を出力せよ。
■回答
●愚直に書く
文字列として3単語を取得して、print
で改行無しで1文字目だけ出力をすればうまく出るかな?
a, b, c = gets.split
print a[0]
print b[0]
print c[0]
通った!
なんとなくもっとスマートにできそうだけど…。
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は割愛する。
●リファクタリング/別アプローチ
絶対もう少しスマートに描ける気がする。
1つの変数に配列で入れて、配列の要素1つずつから1文字めを取ってくる。
a = gets.split
puts a[0][0] + a[1][0] + a[2][0]
通った!
とはいえこれも美しいかというとどうなんだろう…。
時間切れなので他の方の回答を見る。
●他の方の回答例
最短コード長の回答がすごかった。
puts"A#{gets[8]}C"
AとCはもう決まっていて、間に入る文字はAtcoder
という半角スペース含めて9番めなので、gets[8]
で取れるのか。ほえ〜。
最短はすごいなと思ったら、結構な人たちがAとCは直接書いていた。
僕の書いた回答をリファクタリングするとしたら下記のような感じか。
a = gets.split
puts "A" + a[1][0] + "C"
●出てきたメソッド等
公式リファレンスを見る訓練。
今回は特になし。
■振り返りなど
AとCはわざわざ割り出さなくても直接書けば良いという考えに至らなかったのが反省点。