※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
なるべくわかりやすい解説を付けました。
マップの判定・縦横
問題1:盤面の情報取得 (paizaランク C 相当)
行数 H , 列数 W の盤面があり、各マスには文字が 1 つだけ書かれています。盤面と N 個の y , x 座標 が与えられるので、与えられた座標の文字を順に出力してください。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
入力される値
-
H W N S_0 ... S_(H-1) y_1 x_1 ... y_N x_N
・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W , 与えられる座標の数を表す整数 N が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。
・ 続く N 行 には、文字を答えるための y_i , x_i 座標が与えられます。(1 ≦ i ≦ N)期待する出力
- N 行の出力
・ i 行目 (1 ≦ i ≦ N) には、i 番目の座標 y_i, x_i の盤面の文字 A_i を出力してください。
A_1 ... A_N
- 条件
- すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ H , W ≦ 20 ・ 1 ≦ N ≦ H × W ・ 0 ≦ y_i < H , 0 ≦ x_i < W (0 ≦ i < N) ・ S は W 文字の文字列 ・ S の各文字は . または #
-
入力例1
-
3 3 2 ### ### ... 2 2 1 1
-
出力例1
-
. #
-
入力例2
-
2 2 1 #. .# 0 1
-
出力例2
-
.
何が問われているか?(問題の抽象化)
多次元配列の基礎的な操作方法(出力)
解答と解説(入力例1をベースとしています)
#1行目の入力値を受け取りそれぞれの変数に代入 h,w,n = gets.split.map(&:to_i) ary = [] #盤面の情報を受取り変数に代入する。 h.times.map do ary << gets.chomp end n.times do |i| #半角スペース刻みの入力値を受け取り変数に代入 y,x = gets.split.map(&:to_i) #入力例1の時ary[2][2]とary[1][1]を取り出したいわけなので puts ary[y][x] end
問題2:盤面の情報変更 (paizaランク C 相当)
行数 H , 列数 W の盤面があり、各マスには文字が 1 つだけ書かれています。盤面と N 個 の y , x 座標 が与えられるので、盤面の与えられた座標の文字を “#” に書き換えた後の盤面を出力してください。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
- 入力される値
-
H W N S_0 ... S_(H-1) y_1 x_1 ... y_N x_N
・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W , 与えられる座標の数を表す整数 N が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
・ 続く N 行 には、 文字を書き換えるマスの y , x 座標が与えられます。(1 ≦ i ≦ N)
- 期待する出力
- H 行での出力
・ 書き換えた後の盤面を H 行で出力してください。
T_0 ... T_(H-1)
- 条件
- すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ H , W ≦ 20 ・ 1 ≦ N ≦ H × W ・ 0 ≦ y < H, 0 ≦ x < W ・ S は W 文字の文字列 ・ S の各文字は "." または "#"
- 入力例1
-
3 3 1 ... ... ... 0 0
- 出力例1
-
#.. ... ...
- 入力例2
-
4 4 2 #### #### .... ##.. 2 0 2 2
- 出力例2
-
#### #### #.#. ##..
何が問われているか?(問題の抽象化)
多次元配列の基礎的な操作方法(置き換え)
解答と解説
途中までは1と同じだけれども、指定した配列のインデックスの場所を#に変える処理を書けば良い
h,w,n = gets.split.map(&:to_i) ary = h.times.map { gets.chomp } n.times do |i| y,x = gets.split.map(&:to_i) # ここが違うよ(指定した位置を#に変える) ary[y][x] = "#" end puts ary