はじめに
学習記録のために自分なりに解説したいと思います。
問題
大きな数値 N が入力されます。3 けたごとにカンマ区切りで出力してください。
ただし、N のけた数は 3 の倍数です。
解答例
num = gets.chomp # 数値を入力
reversed_num = num.to_s.reverse # 数値を文字列に変換し、逆順にする
comma_separated = reversed_num.gsub(/(\d{3})(?=\d)/, '\1,') # 3桁ごとにカンマを挿入
puts comma_separated.reverse # 文字列を再度逆順にして出力
考え方
Rubyには組み込みの形式設定機能があり、それを利用して数値を指定した桁数ごとに区切って出力します。まず、to_s
を用いて数値を文字列に変換し、その後にreverse
とgsub
を使って3桁ごとにカンマを挿入します。最終的にreverse
で文字列を正しい順序に戻します。
使用したメソッドについて
reverseメソッド
文字列や配列の要素を逆順にするためのものです。たとえば "Hello"という文字列に対して reverse
メソッドを呼ぶと "olleH"という文字列が返ります。
gsub メソッド
文字列中の特定のパターンに一致するすべての部分を置換するためのものです。引数として2つ受け取ります。最初の引数がマッチさせたいパターンで、2番目の引数がそのパターンに一致した部分を置換する新しい文字列です。パターンは通常、正規表現で指定します。たとえば "Hello, world!"という文字列に対して gsub(' ', '_')
を呼ぶと "Hello,_world!"という文字列が返ります。これは半角スペースをアンダースコアに置換しています。
正規表現 /(\d{3})(?=\d)/, '\1,
について
このコードでは、正規表現 /(\d{3})(?=\d)/
を使用して3桁の数字を探しています。
-
\d
は全ての数字にマッチします(0-9)。 -
{3}
は直前のパターン(この場合は\d
)がちょうど3回続くところにマッチします。つまり、\d{3}
は3桁の数値にマッチします。 -
( )
はグループを作り、その中のパターンにマッチする部分をキャプチャします。この部分は後で参照することが可能となります。 -
(?=\d)
は先読みアサーションと呼ばれ、これによりマッチする部分の後ろに直接数字が続くところにマッチします。しかし、ここでマッチした部分はキャプチャや置換の対象にはなりません。 -
'\1,'
は置換する新たな文字列を表します。ここでの\1
は最初のキャプチャグループ(この場合は(\d{3})
)にマッチした文字列を参照します。つまり、3桁の数値の後にカンマ (,
) を挿入します。
終わりに
プログラミング初心者のため、間違いあればご指摘ください。
また別の解答あれば教えてください。