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

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