Ruby学習のためにpaizaで問題集やスキルチェックをしています。
Dランクを飛ばしてCランクの問題集を挑戦し始めました。
標準出力メニューの問題集「大きな数値を 3 けたごとにカンマ区切りで出力」を解いて学んだこと、理解できていなかったことなど学習備忘録で記載していこうと思います。
問題
標準入力で与えられた数値を3桁ごとにカンマで区切って出力するという問題。
入力例
123456789
期待する出力
123,456,789
自分が書いたコード
ary = gets.chomp.split("")
count = ary.size
i = 1
while i < count do
print ary[i-1].to_i
if i%3==0
print ","
end
i = i + 1
end
print ary[i-1].to_i
書く前に考えたこと
どういう手順で解答に辿り着くか
①入力を受け取る
②一文字ずつ入力内容から取り出す
③何かしらのループ処理で3回取り出したらカンマを出力する
④最後の一文字はループを抜けてから出力する
コードの解説
・入力をgetsメソッドで受け取ると文字列"123456789"となる。一文字ずつ出力するのに配列の方が扱いやすいと考え、splitで一文字ずつを要素にもつ配列として受け取った。
・ループ処理で処理回数を指定するためにcount = ary.sizeで配列の要素数をcountに代入。
・処理回数が3の倍数の時にカンマを出力するため、3の倍数回処理を行ったことがわかりやすいようiを1から開始した。
・ary配列から要素を1つずつ取り出し、to_iで数値型へ変換する。
・iが3の倍数、つまり3回処理を行ったごとにカンマを出力
・処理後にiに1を足し、i<count(今回の場合はiが9以下)の間、while文内の処理を続ける。
・8回目の処理が終わったら、while文を抜け、最後のary[8](つまり9)を数値で出力して終了。
この処理コードで提出し、正解になった。
解答例
解答例より、pythonコードをchatGPT先生にrubyへ変換してもらったのが以下コード。
N = gets.chomp
N.length.times do |i|
if i % 3 == 0 && i != 0
print ","
end
print N[i]
end
puts
シンプル!
気づいたこと
・必ずしも数値型で出力する必要はなかった(問題文に答えの数値を出力と書いてあったため数値型にする必要があると思った)
・[]でインデックス番号を指定して一文字(一要素)ずつ処理ができるのは配列の場合だけだと思っていたが、文字列の場合も可能だと学んだ。
例)N = "Qiita"
N[0] = "Q"
N[1] = "i"
・while文は最後の文字出力がループを抜けてからになり、処理回数が決まっているためtimesの方がシンプルでわかりやすい。
・カンマをつける、つけないの判断(if文)を文字出力の前に行うという発想はなかった。インデックスが0から始まってもわかりやすい。(3の倍数の前にカンマをつける)
こんな方法もある
def format_number(number)
number.reverse.scan(/.{1,3}/).join(',').reverse
end
N = gets.chomp
puts format_number(N)
メソッドを作成、数値列を位の小さい方から3桁ごとに区切って戻している。
1〜3文字単位で区切るため、お金の表示などで使用できる。
まとめ
自分の知っているコードで答えに辿り着くにはどうしたらいいか考える過程が楽しかったです。
Qiitaとpaizaコラボキャンペーン中だったのに、キャンペーン問題ではなく、普通の問題を解いてしまいました。