投稿者「オオタ」のアーカイブ

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

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

詳しくはコチラ

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

問題4 1 つの実数を出力 4 (paizaランク C 相当)

実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。
また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。

なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。

入力される値
N M

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

N

末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は 0.001 以上 99.999999 未満
* M は 1 以上 5 未満
* N の小数第 M 位が 5 になることはありません。
* N に小数第 7 位以下の数値が含まれる入力は与えられません (0.1234567, 0.0000001 などは与えられません)。
* N の最も小さな位の値が 0 である入力は与えられません (0.8130, 10 などは与えられません)。
入力例1
0.813 1
出力例1
0.8
入力例2
0.813 2
出力例2
0.81
入力例3
0.813 3
出力例3
0.813
入力例4
0.813 4
出力例4
0.8130

解答  sprintf()を使うことで桁数を指定して表示させることができる

#入力値(浮動小数値)を受け取り変数に代入していく
n,m = gets.split.map(&:to_f)
## 桁数を指定して表示させるmは浮動小数から数値に変換する
puts sprintf("%.#{m.to_i}f", n)

または

#変数を初期化する
n,m = 0,0

#nに浮動小数点として変数に代入し、mに数値として変数に代入する
gets.split.map.with_index { |val, i| i == 0 ? n = val.to_f : m = val.to_i }

# 桁数を指定して表示させる
puts sprintf("%.#{m}f", n)

※ポイント (入力例4で解説)

puts sprintf("%.#{m}f", n)

↑は splintf(“%.4f”, 0.813)となり

0.813の小数点4桁まで表示してねという命令になるので

0.8130が出力された。

“#{m}”で式展開をすることで4にしている。(式展開しないと文字列mとして扱われる)

左側(第一引数)が何桁でどういう表示にするか
右側(第2引数)に表示させたい文字または数値を記述する

FINAL問題【実数をフォーマット指定して出力】複数の実数を出力 (paizaランク C 相当)

自然数 Q が与えられます。Q 回以下の問題に答えてください。

* 実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。

なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。

入力される値
Q
N_1 M_1
N_2 M_2
...
N_Q M_Q

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

Ans1
Ans2
...
Ans_Q

末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* Q は 1 以上 101 未満
* N は 0.001 以上 99.999999 未満
* M は 1 以上 5 未満
* N の小数第 M 位が 5 になることはありません。
* N に小数第 7 位以下の数値が含まれる入力は与えられません (0.1234567, 0.0000001 などは与えられません)。
* N の最も小さな位の値が 0 である入力は与えられません (0.8130, 10 などは与えられません)。
入力例1
4
0.813 1
0.813 2
0.813 3
0.813 4
出力例1
0.8
0.81
0.813
0.8130

解答

#1行目の入力値(数値)を受け取る
q = gets.to_i
#q回繰り返す
q.times do |i|

# 半角スペース刻みの入力値を浮動小数として受け取る
  n,m = gets.split.map(&:to_f)

# 桁数を指定して表示させる(このとき丸める(四捨五入する))
   puts sprintf("%.#{m.to_i}f", n.round(m))
end

または

#1行目の入力値(数値)を受け取る 
q = gets.to_i

#変数nとmを初期化する
n,m = 0,0

#q回繰り返す
q.times do |i|

#nに浮動小数点として代入し、mに数値として代入する
  gets.split.map.with_index { |val, i| i == 0 ? n = val.to_f : m = val.to_i }

# 桁数を指定して表示させる(このとき丸める(四捨五入する))
  puts sprintf("%.#{m}f", n.round(m))
end

※ポイント 問題4で流用できるところは使おう

 (入力例1で解説)

↓について

puts sprintf("%.#{m}f", n.round(m))

↑は splintf(“%.mf”, 0.813.round(m))となり

mが4のとき

0.813を小数点4桁で丸めて(四捨五入)から小数点4桁まで表示(このとき小数点4桁は0で埋める)してねという命令になるので

0.8130が出力された。

“#{m}”で式展開をすることで4にしている。(式展開しないと文字列mとして扱われる)

左側(第一引数)が何桁でどういう表示にするか
右側(第2引数)に表示させたい文字または数値を四捨五入して記述する

ちなみに

puts sprintf(“%.#{0}f”, 0.813round(0))

0.813の0.8を四捨五入して小数点0桁まで表示なので1となる

puts sprintf(“%.#{2}f”, 0.813round(2))

0.813の0.813を四捨五入して小数点2桁まで表示なので0.81となる

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

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

詳しくはコチラ

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

問題1 1 つの実数を出力 (paizaランク D 相当)

実数Nが入力されます。Nをそのまま出力してください。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

N

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* Nは 0.001 以上 99.999 未満
* Nに小数第 4 位以下の数値が含まれる入力は与えられません( 0.1234 、 0.00001 などは与えられません)。

入力例1
0.813
出力例1
0.813
入力例2
99
出力例2
99

解答  文字列として出力する

puts gets.chomp

問題2 1 つの実数を出力 2 (paizaランク D 相当)

実数 N が入力されます。N をそのまま出力してください。
なお、末尾に余分な 0 を出力しないでください。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

N

末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は 0.001 以上 999,999,999,999.999 未満
* N に小数第 4 位以下の数値が含まれる入力は与えられません (0.1234 、 0.0001 などは与えられません)。
* N の最も小さな位の値が 0 である入力は与えられません (0.8130 、 10 などは与えられません)。
入力例1
0.813
出力例1
0.813
入力例2
10000000000.5
出力例2
10000000000.5

解答 文字列として出力する

puts gets.chomp

問題3 1 つの実数を出力 3 (paizaランク D 相当)

実数 N が入力されます。N を丸めて小数第 3 位まで出力してください。
また、N の小数部が小数第 3 位に満たない場合は 0 で埋めて出力してください。

なお、小数第 4 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

N

末尾に改行を入れ、余計な文字 (とくに、813.00000 のような余分な 0)、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は 0.001 以上 99.999999 未満
* N の小数第 4 位が 5 になることはありません。
* N に小数第 7 位以下の数値が含まれる入力は与えられません (0.1234567 、 0.0000001 などは与えられません)。
* N の最も小さな位の値が 0 である入力は与えられません (0.8130 、 10 などは与えられません)。
入力例1
0.813
出力例1
0.813
入力例2
8.13
出力例2
8.130
入力例3
3.141692
出力例3
3.142

解答 文字列として出力する

puts gets.chomp

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

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

詳しくはコチラ

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

FINAL問題 行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力 (paizaランク B 相当)

自然数 N, M と N 個の自然数からなる数列 A と M 個の自然数からなる数列 B が与えられます。1 行目には数列 A の最初の B_1 個の値を出力し、 2 行目にはその次から B_2 個の値を出力します。このように、i 行目には数列 A の 1 + B_1 + B_2 + … + B_{i – 1} 番目の値から B_i 個の値を出力してください。言い換えると、数列 A の値を B_1 個、B_2個、… B_M 個で分割し、それぞれの数列を改行区切りで出力してください。

入力される値
N M
A_1 A_2 A_3 ... A_N
B_1 B_2 B_3 ... B_M

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

A_1 ... A_{B_1}
A_{B_1+1} ... A_{B_1+B_2-1}
A_{B_1+B_2} ... A_{B_1+B_2+B_3-1}
...
A_{B_1+...+B_{M-1}} ... A_{B_1+B_2+...+B_M}

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N, Mは 1 以上 100 以下
* M ≦ N
* A, Bの各要素の値は 1 以上 100 以下
* B_1 + B_2 + B_3 + … + B_M = N

入力例1
10 4
1 2 3 4 5 6 7 8 9 10
2 6 1 1
出力例1
1 2
3 4 5 6 7 8
9
10
入力例2
1 1
1
1
出力例2
1

解答 (入力例1で解説)

# 1行目の半角スペース刻みの入力値を各変数に代入
n,m = gets.split.map(&:to_i)

# 2行目の半角スペース刻みの入力値を配列として変数に代入
numbers = gets.split.map(&:to_i)

# 3行目の半角スペース刻みの入力値を配列として定数に代入
B = gets.split.map(&:to_i)

#変数に初期値を代入(理由は後述)
count = 0

#m回繰り返す
m.times do |i|
  
# 計算しやすいように変数に代入する(やらなくてもOK)
  x = B[i]

#  配列のnumbersの出力範囲をきめて出力する(このとき半角スペースを間に挟む)
#※解説は後述
    puts numbers[count..(count + x - 1)].join(' ')
  
# countにxを加算することで次のループの最初の地点を設定する
  count += x

end

※ポイント

iは0からはじまる

1回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[0..1].join(‘ ‘)となるので

1 2が出力されて

count に 2が加算され2になる(B[0] = 2 なので)

2回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[2..7].join(‘ ‘)となるので

3 4 5 6 7 8が出力されて

count に 6が加算され8になる(B[1] = 6 なので)

3回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[8..8].join(‘ ‘)となるので

9が出力されて

count に 1が加算され9になる(B[2] = 1 なので)

4回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[9..9].join(‘ ‘)となるので

10が出力されて

count に 1が加算され10になる(B[3] = 1 なので)

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

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

詳しくはコチラ

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

問題3 直角三角形の出力 (paizaランク D 相当)

自然数 N が与えられます。1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。
* 1 以上 i 以下の数値をすべて、半角スペース区切りで出力してください

入力される値

N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

1
1 2
1 2 3
...
1 2 3 ... N-1
1 2 3 ... N-1 N

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は 1 以上 100 以下

入力例1

4

出力例1

1
1 2
1 2 3
1 2 3 4

入力例2

1

出力例2

1

解答

# 1行目の入力値(数値)を受け取る 
n = gets.to_i 
# 1からi+1まで出力することをn回繰り返す 
n.times do |i|
  puts [*1..i+1].join(' ')
end

短くすると

# 1行目の入力値(数値)を受け取る
n = gets.to_i
# 1からi+1まで出力することをn回繰り返す
n.times { |i| puts [*1..i+1].join(' ') }

※ポイント

iは0から始まるのでi+1とすることを意識する

問題4 すべての行の長さが不定な 2 次元配列の出力 (paizaランク C 相当)

自然数 N と N 個の要素の数列 M が与えられます。1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。
* 1 以上 M_i 以下のすべての自然数を昇順、半角スペース区切りで出力してください。

入力される値
N
M_1 M_2 M_3 ... M_N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

1 2 3 4 ... M_1
1 2 3 4 ... M_2
...
1 2 3 4 ... M_N

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は 1 以上 100 以下
* M の各要素の値は 1 以上 100 以下

入力例1
4
2 4 3 1
出力例1
1 2
1 2 3 4
1 2 3
1
入力例2
1
1
出力例2
1

解答 (入力例1で解説)

# 1行目の入力値(数値)を受け取る
n = gets.to_i
# 半角スペース刻みの入力値を受け取る配列として代入していく
m = gets.split.map(&:to_i)
n.times do |i| 
# 1から2,1から4.1から3,1から1を出力する(半角スペースを間に挟んで) 
  puts [*1..m[i]].join(' ')
end

短くすると

# 1行目の入力値(数値)を受け取る 
n = gets.to_i 
# 半角スペース刻みの入力値を受け取る配列として代入していく 
m = gets.split.map(&:to_i) 
# 1から2,1から4.1から3,1から1を出力する(半角スペースを間に挟んで) 
n.times { |i| puts [*1..m[i]].join(' ') }

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

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

詳しくはコチラ

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

問題1 N 個の文字を半分ずつ出力 (paizaランク D 相当)

偶数 N が入力されます。まず、 1 行目には 1 以上 N / 2 以下の数値を半角スペース区切りですべて出力してください。次に、 2 行目には N / 2 + 1 以上 N 以下の数値を半角スペース区切りですべて出力してください。
各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

1 2 3 ... N/2
N/2+1 N/2+2 ... N

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N は偶数
* N は 1 以上 1,000 以下

入力例1
8
出力例1
1 2 3 4
5 6 7 8

解答

# 入力値(数値)を受け取る 
n = gets.to_i

#[1, 2, 3, 4, 5, 6, 7, 8]を作成
numbers = [*1..n]

#(n / 2)の長さで分割する→[[1, 2, 3, 4], [5, 6, 7, 8]]
ary = numbers.each_slice(n / 2).to_a
# 出力する(このとき半角スペースを間に挟んで結合する) 
ary.size.times { |i| puts ary[i].join(' ') }

問題2 数値を異なる長さで 2 行出力 (paizaランク D 相当)

自然数 N, M が与えられます。1 行目には 1 以上 N 以下の数値を半角スペース区切りで出力してください。また、2 行目には 1 以上 M 以下の数値を半角スペース区切りで出力してください。
さらに、各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
N M

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

1 2 3 ... N
1 2 3 ... M

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N, Mは 0 以上 1,000 以下
入力例1
3 5
出力例1
1 2 3
1 2 3 4 5

解答

# 半角スペース刻みの入力値を受け取り変数に代入
n, m = gets.split.map(&:to_i)
# 1からnまで半角スペースを間に挟んで出力する
puts [*1..n].join(' ')
# 1からmまで半角スペースを間に挟んで出力する
puts [*1..m].join(' ')

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

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

詳しくはコチラ

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

問題3 九九表の出力 (paizaランク D 相当)

九九表を出力してください。具体的には、出力のi行j列目 (1 ≦ i, j ≦ 9) の数値は i * j になるように出力してください。
ただし、数値の間には半角スペースを、各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
答えの数値を出力してください。

1 2 3 4 5 ...
2 4 6 8 ...
3 6 9 ...
...
9 18 27 ... 81

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
なし

解答

#空の配列を作成
answer = []
#9回繰り返す
9.times do |i|
  #9回繰り返す
  9.times do |j|
  # 1 * 1, 1 * 2, 1 * 3, 1 * 4, 1 * 5, 1 * 6, 1 * 7, 1 * 8, 1 * 9,
  # 2 * 1, 2 * 2, 2 * 3・・・,と計算結果を配列に挿入していく。
    answer << (i + 1) * (j + 1)
  end
end
# .each_slice(9).to_aで9この長さで分割していく
ary = answer.each_slice(9).to_a
# 9個ずつ出力する(このとき半角スペースを間に挟んで結合する)
ary.size.times { |i| puts ary[i].join(' ') }

FINAL問題【n * n の 2 次元配列の表示】N * N の九九表の出力 (paizaランク C 相当)

自然数 N が入力されます。N 行 N 列の九九表を出力してください。具体的には、出力の i 行 j 列目 (1 ≦ i, j ≦ N ) の数値は i * j になるように出力してください。
ただし、数値の間には半角スペースを、各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

A_{1,1} A_{1,2} A_{1,3} ... A_{1,N}
A_{2,1} A_{2,2} A_{2,3} ... A_{2,N}
...
A_{N,1} A_{N,2} ... A_{N,N}

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* 1 ≦ N ≦ 100

入力例1
3
出力例1
1 2 3
2 4 6
3 6 9

解答 問題3を少し変えるだけで良い

# 入力値(数値)を受け取る
n = gets.to_i
#空の配列を作成 
answer = []

#n回繰り返す 
n.times do |i|

  #n回繰り返す 
  n.times do |j|

    answer << (i + 1) * (j + 1)
  end
end
# .each_slice(n).to_aでn個の長さで分割していく 
ary = answer.each_slice(n).to_a
# 9個ずつ出力する(このとき半角スペースを間に挟んで結合する) 
ary.size.times { |i| puts ary[i].join(' ') }

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

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

詳しくはコチラ

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

問題1 2 * 2 の出力 (paizaランク D 相当)

4 つの数値 0, 8, 1, 3 をこの順に、2 行 2 列の形で出力してください。
ただし、数値の間には半角スペースを、各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
ありません。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

0 8
1 3

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
なし

解答

puts "0 8"
puts "1 3"

または

puts [["0 8"],["1 3"]]

問題2 3 * 3 の出力 (paizaランク D 相当)

9 個の数値が半角スペース区切りで入力されます。この数値を 3 行 3 列の形式で出力してください。
具体的には、入力された数値を N_1 , N_2 , N_3 , …, N_9 とするとき、 1 行目にはN_1 からN_3 を、2 行目には N_4 から N_6 を、3 行目には N_7 から N_9 を出力してください。
ただし、数値の間には半角スペースを、各行の末尾には、半角スペースの代わりに改行を入れてください。

入力される値
N_1 N_2 N_3 ... N_9

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

N_1 N_2 N_3
N_4 N_5 N_6
N_7 N_8 N_9

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* 入力される数値はすべて 0 以上 1,000 以下

入力例1
0 1 2 3 4 5 6 7 8
出力例1
0 1 2
3 4 5
6 7 8

解答

numbers = gets.split.each_slice(3).to_a
numbers.size.times do |i|
  puts numbers[i].join(' ')
end

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

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

詳しくはコチラ

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

FINAL問題【特定の文字で区切り 1 行で出力】大きな数値を 3 けたごとにカンマ区切りで出力 2 (paizaランク C 相当)

大きな数値Nが入力されます。 位の小さい方から 3 けたごとにカンマ区切りで出力してください。
ただし、Nのけた数は 3 の倍数とは限りません。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

M

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* Nは自然数
* Nは 0 以上 10 ^ 1,000 以下

入力例1
123456789
出力例1
123,456,789
入力例2
813
出力例2
813
入力例3
12345678901234567890
出力例3
12,345,678,901,234,567,890

解答 (入力例3で解説)

#↓入力値を文字列として受け取りバラバラにして反転する(gets.chars.reverse)
#["0", "9", "8", "7", "6", "5", "4", "3", "2", "1", "0", "9", "8", "7", "6", "5", "4", "3", "2", "1"]
numbers = gets.chars.reverse

#配列の長さの回数分繰り返す(20回) 
numbers.size.times do |i|

#3の倍数かつループの最後以外の時 
  if (i + 1) % 3 == 0 && i + 1 != numbers.size

#,(カンマ)を挿入する 
    numbers[i] << ','
  end
end
#繋げて反転して出力する
puts numbers.join.reverse

※ポイント

①入力値が3桁の倍数の桁ではないことに注意する

文字列として受け取りバラバラにしてから反転(numbers = gets.chars.reverse)

カンマを挿入していくことでどの桁でも対応をすることができる。

②あとは問題5と同じやり方をしてから最後にまた反転してもとに戻せば良い

#繋げて反転して出力する puts numbers.join.reverse

numbers[i] << ‘,’の意味

配列[ 1 , 2 ] << 3   は   配列[1,2,3]となるので

配列の3の倍数のあとに,(カンマ)を挿入しているよ

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”]にカンマを挿入できた

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

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

詳しくはコチラ

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

問題3 カンマ区切りで 10 個出力 1 (paizaランク D 相当)

10 個の数値が半角スペース区切りで与えられます。これらの数値すべて受け取り、そのまま出力してください。ただし、数値を出力した直後に必ずカンマを、末尾にはさらに改行も出力してください。

入力される値
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
994 267 101 579 874 986 32 528 253 822
出力例2
994,267,101,579,874,986,32,528,253,822,

解答

#半角スペース刻みの入力値を受け取り配列を作成して変数に代入[5, 1] 
numbers = gets.split
#,(カンマ)を間に結合し、末尾にもカンマをつけて出力する 
puts numbers.join(',') + ","

問題4 カンマ区切りで 10 個出力 2 (paizaランク D 相当)

10 個の数値が半角スペース区切りで与えられます。これらの数値をカンマ区切りで出力してください。ただし、末尾にはカンマではなく改行を出力してください。

入力される値
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
462 218 867 547 11 630 845 689 891 630
出力例2
462,218,867,547,11,630,845,689,891,630
#半角スペース刻みの入力値を受け取り配列を作成して変数に代入[5, 1] 
numbers = gets.split.map(&:to_i) 
#,(カンマ)を間に結合して出力する 
puts numbers.join(',')