INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 041のA問題
https://atcoder.jp/contests/abc041/tasks/abc041_a
●問題文
文字列 s と整数 i (1≦i≦∣s∣) が与えられます。 s の i 文字目を出力してください。
なお、∣s∣ は文字列 s の長さを表します。
●制約
- 1≦∣s∣≦100
- s は英小文字のみからなる。
- 1≦i≦∣s∣
●入力
入力は以下の形式で標準入力から与えられる。
s
i
●出力
s の i 文字目を出力せよ。
■回答
●愚直に書く
うーん、1行目の文字列を1文字ずつ配列にして、indexで取れるかな?
s = gets.chomp.split("")
i = gets.to_i
puts s[i - 1]
通った!
文字列を配列にする方法がうろ覚えだった。
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
→今回も内容的に割愛かな…。
●リファクタリング/別アプローチ
配列にしなくても文字列のままでなんとかできそうな気はする。
あった!slice
メソッド。
s = gets.chomp
i = gets.to_i
puts s.slice(i - 1)
通った!!!
今回はコード長を短くしてみようかな。
puts gets.chomp.slice(gets.to_i - 1)
通った!
●他の方の回答例
なんと。
slice
メソッドを使わなくても、文字列は[n]
でn番目(厳密には0スタートなのでn+1番目)が取れるじゃないか…。
じゃあslice
メソッドはどういう時に使うのかなと思ったけど、slice!
という破壊的メソッドがあり、文字列を破壊的に変更する場合にslice!
の方を使う感じなのかなぁ。
ということで自分の解答を修正するとこう。
s = gets.chomp
i = gets.to_i
puts s[i - 1]
変数を使わないと、こう。
puts gets.chomp[gets.to_i - 1]
●出てきたメソッド等
公式リファレンスを見る訓練。
-
String#[]
https://docs.ruby-lang.org/ja/latest/method/String/i/=5b=5d.html -
String#slice!
https://docs.ruby-lang.org/ja/latest/method/String/i/slice=21.html
■振り返りなど
slice
を知れてよかったけど、シンプルに解けなかったのが悔しい。