はじめに
Ruby学習の一環として「アルゴリズム実技検定」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「第一回アルゴリズム実技検定」の一問目(2倍チェック)より。
第一回アルゴリズム実技検定 過去問
自分の解答と、解答する中で学んだ表現・メソッドなどを紹介していきます。
問題
3桁の整数を受け取り、それを2倍にして出力するプログラムの作成をします。
しかし、入力される文字列 S には英小文字が紛れ込むことがあります。その場合はエラーを出力します。
S が3桁の整数である場合('0'で始まる場合も含む)はその2倍の整数を出力し、そうでない場合は'error'と出力すること。
制約
・S は長さ3の文字列である
・S の各文字は、数字もしくは英小文字である
入力は以下の形で与えられる。
S
入力例①
678
入力例②
4g4
出力例
# 入力例①678
=> 678
# 入力例②4g4
=> error
解答
まずは僕が提出した解答から。
s = gets.chomp
print /^[0-9]+$/ === s ? s.to_i * 2 : "error"
受け取った文字列を、正規表現を用いて各桁の文字列が0から9であるかを判定し、
真ならInteger型に変換した後に2倍した数字を、偽ならerrorと出力するようにしました。
正規表現
ここで、正規表現とは何か、を改めて確認しておきたいと思います。
初めは、「正規表現」という言葉自体わかりづらかったのですが、
こちらの記事を読んでなんとなく腑に落ちました。
正規表現とは?
正規表現とは**「様々な文字列をひとつの文字列で表現する表現法」**
そして**「文字列の検索や置換に便利」**。
他にもあるかもしれませんが、"他"は、その"他"に出会った時に覚えることにします。
整数を表現した正規表現で判定する
正規表現とは何かをひとまず定義したところで、今回用いた正規表現を見ていきます。
/^[0-9]+$/ === s
ここで使用している正規表現に関係するものは以下の通り
===
左辺の正規表現の文字列パターンが、右辺の文字列に含まれているかを判定します。
左辺と右辺は入れ替えて記述してはいけません。
/ /
//で囲むことで正規表現オブジェクトを生成することが出来ます。
つまり、「//で囲まれたものが正規表現だよ」という宣言になります。
[ ]
角括弧[ ]で挟まれた部分を文字クラスと言います。
1個以上の文字を列挙したもので、いずれかの1文字にマッチします(上記では0から9のうち1文字)。
-(ハイフン)
文字の範囲を示します。
[A-C]ならA,B,Cのいずれか、[0-9]なら0から9のうちいずれか、となります。
^(/^xxx/)
行頭。文字列の先頭や改行文字の直後の位置にマッチします。
+
1回以上の繰り返しを表します。
$****(/xxx$/)
行末。文字列の末尾や改行文字の直前の位置にマッチします。
よって、下記の記述の意味は、
「sは、全ての文字が0から9の数字から成る文字列か」を判定していることになります。
/^[0-9]+$/ === s
最後に
以上、「第一回アルゴリズム実技検定」の一問目(2倍チェック)を解く中で学んだ正規表現についてまとめました。
正規表現は、とにかく問題をこなして慣れていくのが大事かなと思います。
使えそうな場面では、積極的に調べながら使っていきたいです。
もし間違いなどございましたら、ご指摘いただけると嬉しいです。