裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

メビウスの亀

2017年06月23日 | ブログラミング

メビウスの亀

締め切りが 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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村