日別アーカイブ: 2022年8月11日

paizaLvアップ問題と解答(標準出力11)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題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

※ポイント

iは0から始まるので(0,1,2)となる

numbers.sizeは3なので

i+1 != numbers.size

↑これは3(ループの最後)以外の時に条件を満たすので
ループの1回目[“1”, “2”, “3”]とループの2回目[“4”, “5”, “6”]にカンマを挿入できた