※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
問題5 半角スペースとバーティカルライン区切りで 10 個出力 (paizaランク D 相当)
10 個の数値が改行区切りで与えられます。これらの数値を半角スペース 2 つとバーティカルライン |
区切りで出力してください。ただし、末尾には改行を出力してください。
- 入力される値
-
N1 N2 N3 ... N10
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
- 期待する出力
- 答えの数値を出力してください。
N1 | N2 | N3 | ... | N10
末尾に改行を入れ、余計な文字、空行を含んではいけません。
- 条件
- すべてのテストケースにおいて、以下の条件をみたします。
* 入力される数値はすべて 0 以上 1,000 以下
入力例1
0 1 2 3 4 5 6 7 8 9
出力例1
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
入力例2
804 42 547 203 795 607 922 378 268 979
出力例2
804 | 42 | 547 | 203 | 795 | 607 | 922 | 378 | 268 | 979
解答
numbers = readlines.map(&:chomp) puts numbers.join(' | ')
問題6 大きな数値を 3 けたごとにカンマ区切りで出力 (paizaランク C 相当)
大きな数値 N が入力されます。3 けたごとにカンマ区切りで出力してください。
ただし、N のけた数は 3 の倍数です。
- 入力される値
-
N
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
- 期待する出力
- 答えの数値を出力してください。
M
末尾に改行を入れ、余計な文字、空行を含んではいけません。
- 条件
- すべてのテストケースにおいて、以下の条件をみたします。
* N は自然数かつ、けた数が 3 の倍数
* N は 0 以上 10 ^ 1,000 以下
- 入力例1
-
123456789
- 出力例1
-
123,456,789
- 入力例2
-
813
- 出力例2
-
813
- 入力例3
-
123456789123456789
- 出力例3
-
123,456,789,123,456,789
解説
#↓入力値を文字列として受け取りバラバラにする(gets.chars) ["1", "2", "3", "4", "5", "6", "7", "8", "9"] numbers = gets.chars #配列の長さの回数分繰り返す(9回) numbers.size.times do |i| #3の倍数かつループの最後以外の時 if (i + 1) % 3 == 0 && i + 1 != numbers.size #,(カンマ)を挿入する numbers[i] << ',' end end #繋げて出力する puts numbers.join
短くすると
numbers = gets.chars numbers.size.times { |i| numbers[i] << ',' if (i + 1) % 3 == 0 && i + 1 != numbers.size } puts numbers.join
※ポイント
①(i + 1) % 3 == 0とすることで3の倍数の時とすることができる
iは0から始まるので(i+1)とすること
%は余りなので 3 % 3 = 0, 6 % 3 = 0 となり3の倍数を表現できる
②数字の末尾にはカンマを入れたくない(NG:123,456,789,)ので↓を記述する
i + 1 != numbers.size
最後のループの時iは8となる(0から数えるため)ので(i + 1)にする
ことで9にする
numbers.sizeは配列の長さなので9
!=はNot Equalなので
最後のループの時には条件を満たさないのでカンマを挿入しない
別解 (入力例1で解説)
#↓入力値を文字列として受け取りバラバラにする(gets.chars) ["1", "2", "3", "4", "5", "6", "7", "8", "9"] #長さが3の要素数になるようにスライスして配列にする(.each_slice(3).to_a) [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]] numbers = gets.chars.each_slice(3).to_a #配列の長さの回数分繰り返す(配列が3つあるので3回) numbers.size.times do |i| #["7", "8", "9"]にはカンマを入れたくないのでifで条件を追加する #ループの1~2回目(最後以外)のとき if i + 1 != numbers.size #配列の["1", "2", "3"]と["4", "5", "6"]の末尾に,(カンマ)を挿入する numbers[i] << "," end end #.joinで繋げて出力する puts numbers.join
短くすると
#↓入力値を文字列として受け取りバラバラにする(gets.chars) ["1", "2", "3", "4", "5", "6", "7", "8", "9"] #長さが3の要素数になるようにスライスして配列にする(.each_slice(3).to_a) [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]] numbers = gets.chars.each_slice(3).to_a #配列の長さの回数分繰り返す(配列が3つ有るので3回)(numbers.size.times) #配列の["1", "2", "3"]と["4", "5", "6"]の末尾に,(カンマ)を挿入する #(numbers[i] << "," if i + 1 != numbers.size) #["7", "8", "9"]にはカンマを入れたくないので後置ifで条件を追加する numbers.size.times { |i| numbers[i] << "," if i + 1 != numbers.size } #.joinで繋げて出力する puts numbers.join