※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。
詳しくはコチラ
なるべくわかりやすい解説を付けました。
3:座標系での移動・向き (paizaランク B 相当)
開始時点の y , x 座標 と向いている方角 D が与えられます。
続く 1 行で移動の向き d が与えられるので、その向きに移動した後の y , x 座標 を答えてください。
移動前に向いている方角によって同じ移動の向きでも座標の変化が違うことに気をつけてください。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
以下の図を参考にしてみてください。
- 入力される値
-
Y X D d
・ 1 行目には、開始時点の y , x 座標を表す Y , X, 現在の向いている方角を表す文字 D が与えられます。
・ 2 行目には、移動の向きを表す文字 d が与えられます。
- 期待する出力
- 1 行での出力
・ 移動した後の y , x 座標を出力してください。
y x
条件
すべてのテストケースにおいて、以下の条件をみたします。 ・ -100 ≦ X, Y ≦ 100 ・ D は、N, S, E, W のいずれかでそれぞれ 北・南・東・西 を意味する。 ・ d は、L, R のいずれかでそれぞれ 左・右 に 1 マス進むことを表す。
入力例1
4 2 N
R
出力例1
4 3
入力例2
6 9 E
R
出力例2
7 9
解答と解説
#1行目の入力値を各変数に代入yとxは数値に変換してDは文字列として代入
y, x, D = gets.split.map.with_index { |val, i| i != 2 ? val.to_i : val }
#移動の向きを表す文字を代入
d = gets.chomp
#Rが来たときの移動パターンを設定する
operateR = { N: [0, 1], S: [0, -1], E: [1, 0], W: [-1, 0] }
#Lが来たときの移動パターンを設定する
operateL ={ N: [0, -1], S: [0, 1], E: [-1, 0], W: [1, 0] }
if d == "R"
y += operateR[D.to_sym][0]
x += operateR[D.to_sym][1]
elsif d == "L"
y += operateL[D.to_sym][0]
x += operateL[D.to_sym][1]
end
#移動後の座標を出力する
puts y.to_s + ' ' + x.to_s
別解 3項演算子でLとRのときに値を変数に代入するだけ
y, x, now = gets.split.map.with_index { |val, i| i != 2 ? val.to_i : val }
d = gets.chomp
d == 'L' ? direction = -1 : direction = 1
if now == 'N'
x += direction
elsif now == 'S'
x -= direction
elsif now == 'E'
y += direction
elsif now == 'W'
y -= direction
end
puts y.to_s + ' ' + x.to_s
4:座標系での規則的な移動 (paizaランク B 相当)
開始時点の x , y 座標と移動の歩数 N が与えられます。
以下の図のように時計回りに渦を巻くように移動を N 歩行った後の x , y 座標 を答えてください。
なお、マスの座標系は下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
- 入力される値
-
X Y N
・ 1 行で、開始時点の x , y 座標を表す X , Y, 移動の歩数 N が与えられます。
入力値最終行の末尾に改行が1つ入ります。
- 期待する出力
- 1行での出力
・ 移動を N 歩行った後の x , y 座標を出力してください。
x y
- 条件
-
すべてのテストケースにおいて、以下の条件を満たします。 ・ -100 ≦ X, Y ≦ 100 ・ 0 ≦ N ≦ 100
- 入力例1
0 0 3
- 出力例1
0 1
- 入力例2
38 47 27
- 出力例2
41 47
解答