Programming note」カテゴリーアーカイブ

paizaCランクレベルアップ問題と解答(2)Ruby

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

詳しくはコチラ

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

問題4 入力の配列による保持 (paizaランク D 相当)

整数 n と n 個の数 a_1, …, a_n が改行区切りで与えられます。与えられた a_1, …, a_n の中で最も大きい数を出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1
...
a_n

1 行目には整数 n が与えられ、 2 行目から (n + 1) 行目にかけては n 個の整数 a_1, …, a_n が改行区切りで与えられます。

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

期待する出力
a_1, …, a_n の中で最も大きい数を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について 1 ≦ a_i ≦ 50
入力例1
2
4
7
出力例1
7
入力例2
3
20
19
2
出力例2
20

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目以降の数値を配列として変数に代入する
numbers = readlines.map(&:to_i)

#配列の最大値を出力する
puts numbers.max

問題5 半角スペース区切りでの出力 (paizaランク D 相当)

整数 n が与えられるので、n 回、半角スペース区切りで paiza と出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n

1行目に整数nが与えられます。
入力値最終行の末尾に改行が1つ入ります。

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

期待する出力
paiza と n 回、半角スペース区切りで出力してください。最後の paiza の後には半角スペースは入れず、改行を入れ、余計な文字、空行を含んではいけません。

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

・1 ≦ n ≦ 50

入力例1
2
出力例1
paiza paiza
入力例2
3
出力例2
paiza paiza paiza

解答 (入力例1で解説)

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#['paiza'] * n →["paiza", "paiza"] #↑にしてから.join(' ')で半角スペースを間に挟んで結合して出力する puts (['paiza'] * n).join(' ')

問題6 改行区切りでの出力 (paizaランク D 相当)

整数 n が与えられ、その後に n 個の整数 a_1, …, a_n が半角スペース区切りで与えられるので、a_1, …, a_n をそのままの順番で改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1 a_2 ... a_n

1 行目には整数 n が与えられ、2 行目には半角スペース区切りの n 個の数 a_1, …, a_n が 1 行で与えられます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
a_1, …, a_n をそのままの順番で改行区切りで出力してください。

a_1
...
a_n

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

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

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について、1 ≦ a_i ≦ 50

入力例1
2
1 5
出力例1
1
5
入力例2
3
4 30 12
出力例2
4
30
12

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目の半角スペース刻みの入力値を受け取り変数に代入する
numbers = gets.split.map(&:to_i)

#出力する
puts numbers

paizaCランクレベルアップ問題と解答(1)Ruby

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

詳しくはコチラ

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

問題1 単純な入出力 (paizaランク D 相当)

文字列 s が与えられるので s をそのまま出力してください。

入力される値
入力は以下のフォーマットで与えられます。

s

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

期待する出力
入力された文字列をそのまま出力してください。

s

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

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

・s は数字または大文字・小文字のアルファベットからなる長さ 1 以上 10 以下の文字列
入力例1
paiza
出力例1
paiza
入力例2
Paiza21
出力例2
Paiza21

解答  入力値を受け取り出力する

print gets

または

puts gets

問題2 複数行にわたる出力 (paizaランク D 相当)

整数 n が与えられるので、 n 回、改行区切りで paiza と出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n

整数 n が 1 行で与えられます。入力値最終行の末尾に改行が1つ入ります。

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

期待する出力
n 回 paiza と改行区切りで出力してください。

paiza
...
paiza

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

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

・1 ≦ n ≦ 50

入力例1
2
出力例1
paiza
paiza
入力例2
5
出力例2
paiza
paiza
paiza
paiza
paiza

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#n回paizaを出力する
n.times { puts 'paiza' }

問題3 複数行にわたる入力 (paizaランク D 相当)

整数 n と n 個の整数 a_1, …, a_n が改行区切りで与えられるので、 a_1, …, a_n を与えられた順に、改行区切りで出力してください。

入力される値
入力は以下のフォーマットで与えられます。

n
a_1
...
a_n

1 行目には整数 n が与えられ、2 行目から (n+1) 行目にかけては n 個の整数 a_1, …, a_n が改行区切りで与えられます。

入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
a_1, …, a_n を入力された順に改行区切りで出力してください。

a_1
...
a_n

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

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

・1 ≦ n ≦ 50
・各 a_i(1 ≦ i ≦ n)について 1 ≦ a_i ≦ 50
入力例1
2
1
2
出力例1
1
2
入力例2
3
10
5
39
出力例2
10
5
39

解答

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#n回入力値(数値)を出力する
n.times { puts gets.to_i }

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

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

詳しくはコチラ

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

FINAL問題【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 (paizaランク C 相当)

自然数 H, W, A, B が与えられます。縦に H 行、横に W 行で計 H * W 個の (A, B) という形式で文字列を出力してください。ただし、横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。また、縦の文字列間で = を出力する際は、その上の行と文字数がそろうように出力します。また、A と B は 9 けたになるように半角スペースを数値の前(右詰め)に埋めて出力してください。

入力される値
H W A B

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

期待する出力
答えの文字列を出力してください。

(A_{1,1}, B_{1,1}) | (A_{1,2}, B_{1,2}) ... (A_{1,W}, B_{1,W})
=================== ... ====================
(A_{2,1}, B_{2,1}) | (A_{2,2}, B_{2,2}) ... (A_{2,W}, B_{2,W})
=================== ... ====================
...
...
...
=================== ... ====================
(A_{H,1}, B_{H,1}) | (A_{H,2}, B_{H,2}) ... (A_{H,W}, B_{H,W})

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

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

* H, W は 1 以上 100 以下
* A, B は 0 以上 999,999,999 以下

入力例1
2 3 7 8
出力例1
( 7, 8) | ( 7, 8) | ( 7, 8)
========================================================================
( 7, 8) | ( 7, 8) | ( 7, 8)
入力例2
3 2 999999999 0
出力例2
(999999999, 0) | (999999999, 0)
===============================================
(999999999, 0) | (999999999, 0)
===============================================
(999999999, 0) | (999999999, 0)

解答 (出力例2で解説します)

#1行目の入力値を数値として各変数に代入する 
h, w, a, b = gets.split.map(&:to_i)

#空の配列で初期化する 
answer = []

#(999999999,           0) ←のようにするために式展開を利用する 
#{"%9d" % a}, #{"%9d" % b}と書くことで9桁の半角スペース埋めを表現できる
strings = ["(#{"%9d" % a}, #{"%9d" % b})"]

#縦の回数分繰り返す
h.times do |i|

#(999999999,           0) | (999999999,          0)
#↑のようにするためstringsを横(w)の回数で掛けて.join(" | ")でつなぎanswerに挿入する 
  answer << ( strings * w).join(" | ")

#"="を間に挟む(ループの最後は"="を挟まないようにする) 
  answer << "=" * (25 * w - 3) if i + 1 != h
end

# 出力する
puts answer

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

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

詳しくはコチラ

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

問題4 ペアの数値の入った表を罫線入りで出力 (paizaランク C 相当)

自然数 H, W, A, B が与えられます。縦に H 行、横に W 行で計 H * W 個の (A, B) という形式の文字列を出力してください。ただし、横は | (半角スペース 2 つとバーティカルライン) 区切りで、縦は = で区切って出力してください。また、縦の文字列間で = を出力する際は、その上の行と文字数が等しくなるように出力します。

入力される値
H W A B

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

期待する出力
答えの文字列を出力してください。

(A_{1,1}, B_{1,1}) | (A_{1,2}, B_{1,2}) ... (A_{1,W}, B_{1,W})
=================== ... ====================
(A_{2,1}, B_{2,1}) | (A_{2,2}, B_{2,2}) ... (A_{2,W}, B_{2,W})
=================== ... ====================
...
...
...
=================== ... ====================
(A_{H,1}, B_{H,1}) | (A_{H,2}, B_{H,2}) ... (A_{H,W}, B_{H,W})

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

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

* H, W は 1 以上 100 以下
* A, B は 0 以上 9 以下
入力例1
2 3 7 8
出力例1
(7, 8) | (7, 8) | (7, 8)
========================
(7, 8) | (7, 8) | (7, 8)
入力例2
3 2 0 0
出力例2
(0, 0) | (0, 0)
===============
(0, 0) | (0, 0)
===============
(0, 0) | (0, 0)

解答  (入力例1で解説)

#1行目の入力値を数値として各変数に代入する
h, w, a, b = gets.split.map(&:to_i)

#空の配列で初期化する
answer = []
#(7, 8) ←ようにするために式展開を利用する
strings = ["(#{a}, #{b})"]

#縦の回数分繰り返す
h.to_i.times do |i|

#(7, 8) | (7, 8) | (7, 8)
#↑のようにするためstringsを横の回数で掛けて(" | ")でつなぎanswerに挿入する
  answer << (strings * w).join(" | ")

#ループの最後以外に"="を間に挟む
  answer << "=" * (9 * w - 3) if i + 1 != h
end

# 出力する
puts answer

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

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

詳しくはコチラ

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

問題3 九九表を罫線入りで出力 (paizaランク C 相当)

九九表を、横の数値間では | (半角スペース 2 つとバーティカルライン)、縦の数値間では = で区切って出力してください。
ただし、数値を出力する際は 2 けたになるよう半角スペース埋めで出力します。また、縦の数値間で = を出力する際は、その上の行と文字数が等しくなるように出力します。

入力される値
なし

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

期待する出力
答えの文字列を出力してください。

S1
S2
S3
...
S9

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

条件
なし

解答

#九九の計算結果に" | "でつないで末尾に"\n"(改行コード)を追加する
line = 1.upto(9).map do |i|

# i 段の答えを" | "で連結し末尾に"\n"(改行コード)を追加
  1.upto(9).map { |j| "%2d" % (i * j) }.join(" | ") + "\n"
  end

# 配列 line を "=" * 42 + "\n"(改行コード)でつなぐ
answer = line.join("=" * 42 + "\n")

# 出力する
puts answer

または

#空の配列を作成
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)).to_s + " "

# ループの8回まで|(パイプ)を付加する 
    answer << ('|') if j <= 7

# ループの最後(9の倍数回)に"\n"(改行コード)を付加する
    answer << "\n" if j == 8

  end

# 1の段と2の段の間、2の段と3の段の間のように、段の間に=42個と改行コード"\n"を付加する
    answer << ("=" * 42) + "\n"
  end

# 繋げて出力する
puts answer.join

 

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

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

詳しくはコチラ

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

問題1 2 つの文字列を出力 (paizaランク D 相当)

文字列 S, T が与えられます。S + T = ST という形式で文字列を出力してください。

入力される値
S
T

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

期待する出力
答えの文字列を出力してください。

S + T = ST

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

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

* S, T の長さは 1 以上 100 以下
* S, T の各文字はアルファベット大文字または小文字である

入力例1
kirishima
kyoko
出力例1
kirishima + kyoko = kirishimakyoko
入力例2
S
T
出力例2
S + T = ST

解答

#2行の入力値を受け取る
a, b = readlines.map(&:chomp)
#問題文のようになるように記述する(半角スペースの数に注意する)
puts a + " + " + b + " = " + a + b

問題2 文字列と N 個の整数の出力 (paizaランク C 相当)

自然数 N, A, B が与えられます。(A, B) という形式の文字列を N 回、カンマと半角スペース区切りで出力してください。

入力される値
 

N A B

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

期待する出力
答えの文字列を出力してください。

(A_1, B_1), (A_2, B_2), ... , (A_N, B_N)

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

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

* N は 1 以上 100 以下
* A, Bは 10 以上 99 以下

入力例1
3 10 99
出力例1
(10, 99), (10, 99), (10, 99)
入力例2
2 33 44
出力例2
(33, 44), (33, 44)

解答

#1行目の入力値を文字列として受け取る
n,a,b = gets.split

#問題文のようになるように記述する(半角スペースの数に注意する)
puts (["(" + a + ", " + b + ")"] * n.to_i).join(',')

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

 (["(" + a + ", " + b + ")"])

↑の部分を出力すると["(10, 99)"]

* n.to_i).join(',')

↑の部分で

①nを文字列から数値に変換して

②n倍する(入力例1の場合3)

③.join(‘,’)でカンマを繋げた時に付加することで末尾にカンマを付けさせないようにする。

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

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

詳しくはコチラ

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

問題4 数値を M けた半角スペース埋めで出力 (paizaランク D 相当)

自然数 N, M が与えられます。N が M けたになるよう数値の前に半角スペースを埋めて出力してください。

入力される値
N M

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

期待する出力
答えの数値を解答の形式に従った形で出力してください。

N

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

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

* N, Mは自然数
* N は 0 以上 999 以下
* M は 1 以上 10 以下
* (N のけた数) ≦ M
入力例1
813 4
出力例1
813
入力例2
813 8
出力例2
813

解答

#1行目の入力値(数値)を受け取る
n, m = gets.split.map(&:to_i)
#半角スペースで埋めてnをm桁まで表示する
puts("%#{m}d".%(n))

または

#1行目の入力値(数値)を受け取る
n, m = gets.split.map(&:to_i)
#半角スペースで埋めてnをm桁まで表示する
puts sprintf("%#{m}d".%(n))

FINAL問題【出力幅を指定して出力】N 個の数値を M けた半角スペース埋めで出力 (paizaランク D 相当)

自然数 N, M と N 個の自然数 A_1, A_2, …, A_N が与えられます。それぞれの数値が M けたになるよう数値の前に半角スペースを埋めて、改行区切りで出力してください。

入力される値
N M
A_1
A_2
A_3
...
A_N

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

期待する出力
答えの数値を解答の形式に従った形で出力してください。

A_1
A_2
A_3
...
A_N

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

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

* N, Mは自然数
* N は 1 以上 99 以下
* M は 1 以上 10 以下
* A_i は 0 以上 999 以下
* (A_i のけた数の最大値) ≦ M
入力例1
4 3
0
8
81
813
出力例1
0
8
81
813

解答

#1行目の入力値(数値)を受け取る
n, m = gets.split.map(&:to_i)

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

#数値を受け取り変数に代入する
  number = gets.to_i

#↑のnumbersの数値を半角スペースで埋めてm桁まで表示する
  puts ("%#{m}d".%("#{number}"))
end

または

#1行目の入力値(数値)を受け取る
n, m = gets.split(' ').map(&:to_i)

#半角スペースで埋めて3桁まで表示する
n.times do |i|

#数値を受け取り変数に代入する 
  number = gets.to_i

#↑のnumbersの数値を半角スペースで埋めてm桁まで表示する 
  puts sprintf("%#{m}d".%("#{number}"))
end

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

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

詳しくはコチラ

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

問題1 数値を半角スペース埋めで出力 (paizaランク D 相当)

自然数 N が与えられます。N が 3 けたになるよう数値の前に半角スペースを埋めて出力してください。

入力される値
N

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

期待する出力
答えの数値を解答の形式に従った形で出力してください。

N

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

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

* N は自然数
* N は 0 以上 999 以下

入力例1
12
出力例1
12
入力例2
0
出力例2
0

解答  putsを使う場合

#1行目の入力値(数値)を受け取る
n = gets.to_i
#半角スペースで埋めて3桁まで表示する
puts("%3d".%(n))

または  sprintfを使う場合

#1行目の入力値(数値)を受け取る
n = gets.to_i
#半角スペースで埋めて3桁まで表示する
puts sprintf("%3d",n)

問題2 数値をゼロ埋めで出力 (paizaランク D 相当)

自然数 N が与えられます。N が 3 けたになるよう数値の前に 0 を埋めて出力してください。

入力される値
N

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

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

N

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

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

* N は自然数
* N は 0 以上 999 以下

入力例1
12
出力例1
012
入力例2
0
出力例2
000

解答  putsを使う場合  (問題1とほぼ同じ)

#1行目の入力値(数値)を受け取る
n = gets.to_i
#3桁まで0で埋めて表示する
puts("%03d".%(n))

または  sprintfを使う場合 (問題1とほぼ同じ)

#1行目の入力値(数値)を受け取る 
n = gets.to_i
#3桁まで0で埋めて表示する
puts sprintf("%03d",n)

問題3 複数の数値を半角スペース埋めで出力 (paizaランク D 相当)

自然数 N が与えられます。N 個の自然数が与えられるので、それぞれを数値 M_i について以下の処理を行ってください。
* M_i が 3 けたになるよう数値の前に半角スペースを埋めて出力してください。

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

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

期待する出力
答えの数値を解答の形式に従った形で出力してください。

M_1
M_2
M_3
...
M_N

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

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

* N, M_iは自然数
* N は 0 以上 9,999 以下
* M_i は 0 以上 999 以下
入力例1
12
0
8
81
813
0
0
0
0
0
0
0
0
出力例1
0
8
81
813
0
0
0
0
0
0
0
0

解答

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

#複数行の入力値を受け取り配列として代入していく↓
#["0", "8", "81", "813", "0", "0", "0", "0", "0", "0", "0", "0"]
numbers = readlines.map(&:chomp)


numbers.each do |i|
#半角スペースで埋めて3桁まで表示する 
  puts sprintf ("%3d".%(i))
end

または

n = gets.to_i
numbers = readlines.map(&:chomp)
#半角スペースで埋めて3桁まで表示する
numbers.each do |i|
puts ("%3d".%(i))
end

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