日別アーカイブ: 2022年11月12日

PaizaAランクLvアップ問題と解説(Ruby)その3

その2から続いています

※スキルチェック問題ではありません。

規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

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

1:マップからの座標取得 (paizaランク C 相当)

マップの行数 H と列数 W とマップを表す H 行 W 列の文字列 S_1 …S_H が与えられます。
要素が ‘#’ になっているマスが 1 つあるので、その y , x 座標 を答えてください。

なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

入力される値

H W     
S_0     
...     
S_(H-1)

・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
入力値最終行の末尾に改行が1つ入ります。

期待する出力
1行の出力

・ 要素が ‘#’ になっているマスの y , x 座標を 1 行で出力してください。

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

・ 1 ≦ H, W ≦ 20
・ S は W 文字の文字列
・ S の各文字は '.' または '#'
・ '#' のマスは必ず1つ
入力例1

1 1
#
出力例1

0 0
入力例2

3 3
.#.
...
...
出力例2

0 1

解答と解説(入力例2の場合)

#1行目の入力値を各変数に代入
h,w = gets.split.map(&:to_i)

#縦(盤面の行数)の回数分繰り返す
h.times do |i|

#入力値を受け取り改行を打ち消しバラバラにする(例;[".", "#", "."])
  line = gets.chomp.chars
 
  #横(盤面の列数)の回数分繰り返す
  w.times do |j|
  #"#"のときに現在地を出力する(後置if)
    puts i.to_s + " " + j.to_s if line[j] == "#"
  end
end

2:座標系での移動・方角 (paizaランク C 相当)

開始時点の y , x 座標 と移動の回数 N が与えられます。
続く N 行で移動の方角 d_1 … d_N が与えられるので、与えられた順に移動をしたときの各移動後の y , x 座標 を答えてください。

ただし、図の通り、上側( y 軸の負の向き)を北とします。

なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

入力される値
Y X N       
d_1     
...     
d_N

・ 1 行目には、開始時点の y , x 座標を表す Y , X, 移動の回数 N が与えられます。
・ 続く N 行 (1 ≦ i ≦ N) には、盤面の i 回目の移動の方角を表す文字 d_i が与えられます。入力値最終行の末尾に改行が1つ入ります。

期待する出力
N 行での出力

・ 各移動後の y , x 座標を出力してください。

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

・ 0 ≦ Y, X, N ≦100
・ d_i は、N, S, E, W のいずれかでそれぞれ 北・南・東・西 を意味する。
入力例1

0 0 1
N
出力例1

-1 0
入力例2

5 10 4
N
W
E
S
出力例2

4 10
4 9
4 10
5 10

解答 普通にやる場合

y,x,n = gets.split.map(&:to_i)
command = readlines.map(&:chomp)
command.size.times do |i|
  if command[i] == "N"
     puts (y-1).to_s + " " + x.to_s 
      y += - 1
  elsif command[i] == "W"
     puts y.to_s + " " + (x-1).to_s
     x += - 1
  elsif command[i] == "E"
     puts y.to_s + " " + (x+1).to_s 
     x += + 1
  elsif command[i] == "S"
     puts (y + 1).to_s + " " + x.to_s 
     y += + 1
  end
end

別解 ハッシュを使う場合(こっちのほうがいいかも)

y, x, n = gets.split.map(&:to_i)
direction = { N: [-1, 0], S: [1, 0], E: [0, 1], W: [0, -1] }
n.times do
  command = gets.chomp
  y += direction[command.to_sym][0]
  x += direction[command.to_sym][1]
  puts y.to_s + ' ' + x.to_s
end

その4に続きます