メビウスの亀
締め切りが 2017/06/23 10:00 AM なので,その 1 分後に投稿されるように予約
【概要】
右写真のようなメビウスの帯の上を、不思議な亀が歩いています。
亀の初期位置は「1a」のマスで「2a」の方を向いています。
亀はコマンドのとおりに進みます。コマンドは下表のとおりです:
コマンド 意味
R 90度右に向きます。
L 90度左に向きます。
B 紙の裏側に移動します。向きは変わりません。この記述が誤解を生みやすい。以下の解説をちゃんと読むこと。
たとえば、
「1a」の位置にいて「1b」の方を向いている
↓Bコマンド
「1E」の位置で「1D」の方を向いている
という具合です。
1〜9 1〜9マス 進みます。紙のフチに到達したら、裏側に行きます。
たとえば、
1c→1d→1e→1A→1B→1C
という具合です。
最終的に到達するマスの名前を計算して下さい。
メビウスの帯は、片面が (1〜32)×(a〜e)、反対側の面が(1〜32)×(A〜E) となっている紙をメビウスの帯になるようにしたものです。
【入出力】
入力は
L9R9B9
のようになっています。
コマンドの列が区切り文字なしで並んでいます。
出力は、
19a
のような感じです。
最終的に到達するマスを答えて下さい。
【例】
入力 出力
L9R9B9 19a
RRRB1 1D
【補足】
不正な入力に対処する必要はありません。
コマンドの長さは1以上 20 以下です。
================================================
f = function(s) {
a = cbind(
rbind(outer(1:32, letters[1:5], paste0), outer(1:32, LETTERS[1:5], paste0)),
rbind(outer(1:32, LETTERS[1:5], paste0), outer(1:32, letters[1:5], paste0))
)
locationX = locationY = 0
b = strsplit(s, "")[[1]]
xy = rbind(c(0,1), c(-1,0), c(0,-1), c(1,0))
p = 0
for (i in seq_along(b)) {
c = b[i]
if (c == "R") {
p = (p+1) %% 4
} else if (c == "L") {
p = (p-1) %% 4
} else if (c == "B") {
if (p == 1) p = 3 else if (p == 3) p = 1 # ここに注意!!
locationX = (9-locationX) %% 10
} else {
step = as.integer(c)
deltaX = xy[p+1, 1]
deltaY = xy[p+1, 2]
locationX = (locationX+deltaX*step) %% 10
locationY = (locationY+deltaY*step) %% 64
}
}
cat(a[locationY+1, locationX+1])
}
f("99999999999999999999") # 21A
f("LL999999999999999999") # 31a
f("9B9R7L9B9R7L9B9R7LB1") # 24c
f("8L8L7L4R2B8R9R6BL3L6") # 24d
f("6BR9B1BR2B4LB9L6LBL4") # 23B
f("2BR4B3L6BLL8B3R7L6RB") # 14E
f("RB4R6B3LLLL1B6L4BLB3") # 20C
f("R1B3B7LL9BL3R4R7L6RR") # 29B
f("L8R6L7L9LL3L2L7B6BR2") # 20e
f("B3R1B6LB5L6RBLL4L3L7") # 28b
f("1L8B1L4L6R9R8L6L3R9L") # 30b
f("8L3BR3L4B6LL6LB4B5RB") # 15c