LoginSignup
0
0

More than 3 years have passed since last update.

AtCoderでRuby学習8【第一回アルゴリズム実技検定 2倍チェック 】正規表現

Posted at

はじめに

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倍チェック)を解く中で学んだ正規表現についてまとめました。
正規表現は、とにかく問題をこなして慣れていくのが大事かなと思います。
使えそうな場面では、積極的に調べながら使っていきたいです。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0