※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
問題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
