日別アーカイブ: 2022年2月6日

PaizaLvアップ問題集(標準出力)

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

詳しくはコチラ

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

問題1

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

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

入力例
0.813 4

出力例4
0.8130

解答

n,m = gets.split(' ').map(&:to_f)
# 小数点以下の桁数を指定しています
printf("%.#{m.to_i}f", n)

問題2 複数の実数を出力 (paizaランク C 相当)

自然数 Q が与えられます。Q 回以下の問題に答えてください。
実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。

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

入力例1

4
0.813 1
0.813 2
0.813 3
0.813 4

出力例1

0.8
0.81
0.813
0.8130

問題3 直角三角形の出力

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

入力例1
4

出力例1

1
1 2
1 2 3
1 2 3 4

解答

  1. 入力Nを代入

  2. 配列[1, 2, 3, 4]を作る

  3. timesで繰り返し処理をする

  4. a.takeを使うことで配列をiずつ取り出して半角スペースを間に入れて出力する

n = gets.to_i
a = *(1..n)
1..n.times do |i|
  puts a.take(a[i]).join(' ')
end

 

問題4 すべての行の長さが不定な 2 次元配列の出力

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

入力例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を受け取る

  2. 数列Mを受け取る

  3. N回繰り返す

  4. mの配列の数字−1回繰り返し(m[0]のときは2−1で1回)、1から初めて

  5. 繰り返しが終わったら、mの配列を加える1 2

  6. 2回目は(m[1]なので4−1で3回繰り返し)1 2 3までやったら

  7. puts m[i]で1 2 3 4が出力されて

  8. 以下繰り返していく

n = gets.to_i
m = gets.split(' ').map(&:to_i)
n.times do |i|
# ここで先に1,2,3,とやってから
  (m[i]-1).times { |j| print "#{j +1 } "}
# 最後にmの配列を足す
  puts m[i]
end