その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