裏 RjpWiki

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

マス目を回す

2017年11月17日 | ブログラミング

マス目を回す

締め切りが 2017/11/17 10:00 AM なので,その 1 分後に投稿されるように予約

【概要】
4×4 のマス目があります。
マス目のうちいくつかは穴になっています。
abc-/d-ef/g-hi/opqr codeiqのような形で盤面の初期状態(abc-/d-ef/g-hi/opqr)と一連の操作(codeiq)を与えます。

操作は一連の文字です。
各文字は「その文字を中心として、隣接(斜め含む)しているマスの文字を時計回りに回す」という操作を示しています。

ただし、穴の位置は変えないようにします。

一連の操作を終えたあとのマス目の状態を出力して下さい。

【入出力】
入力は
abc-/d-ef/g-hi/opqr codeiq
のようになっています。
空白の前が4×4のマス目、空白の後が一連の操作です。

マス目はスラッシュ区切りで各行を表しています。
a~z は普通のマス、「-」は穴を意味します。

c を中心として回した後は,以下のようになります。


出力は、最終的なマス目の状態です。
形式は入力の空白の前の文字列と同じです。
abc-/d-ef/g-hi/opqr codeiqに対応する出力は
pac-/o-dh/e-qf/grbi
です。

【例】
入力                              出力
abc-/d-ef/g-hi/opqr codeiq        pac-/o-dh/e-qf/grbi
na-c/d-be/t---/g-hi nabetani      ab-t/c-en/d---/g-hi
ab--/----/----/---c abcabc        ab--/----/----/---c

【補足】
    •    不正な入力に対処する必要はありません。
    •    異なるマス目に同じアルファベットが割り当てられることはありません。
    •    操作を表すアルファベットは、1文字以上10文字以下です。
    •    マス目に含まれない文字が、操作を表す文字に含まれることはありません。

----------------------------------------------------------------------------------------------------

f = function(s) {
    s = unlist(strsplit(s, " "))
    s1 = matrix("-", 6, 6)
    s1[2:5, 2:5] = t(matrix(unlist(strsplit(gsub("/", "", s[1]), "")), 4, 4))
    s2 = unlist(strsplit(s[2], ""))
    modify.i = c(-1, -1, -1, 0, 1, 1, 1, 0)
    modify.j = c(-1, 0, 1, 1, 1, 0, -1, -1)
    for (char in s2) {
        suf = which(s1 == char, arr.ind=TRUE)
        suf.i = suf[1]
        suf.j = suf[2]
        i = j = integer(8)
        cell = 0
        for (k in 1:8) {
            if (s1[suf.i+modify.i[k], suf.j+modify.j[k]] != "-") {
                cell = cell+1
                i[cell] = suf.i+modify.i[k]
                j[cell] = suf.j+modify.j[k]
            }
        }
        if (cell > 1) {
        temp = s1[i[cell], j[cell]]
        for (k in cell:2) {
            s1[i[k], j[k]] = s1[i[k-1], j[k-1]]
        }
        s1[i[1], j[1]] = temp
        }
    }
    result = character(4)
    for (i in 2:5) {
        result[i-1] = paste(s1[i, 2:5], collapse="")
    }
    cat(result, sep="/")
}
#f(readLines(file("stdin", "r")))

f("abc-/d-ef/g-hi/opqr codeiq")     # pac-/o-dh/e-qf/grbi
f("---y/-x--/----/---z xyz")        # ---y/-x--/----/---z
f("al-d/yteq/ukwg/-pmc yptawa")     # ka-d/luye/cmpq/-wtg
f("y---/-o-e/v--b/---a eaeyyvva")   # y---/-o-e/v--b/---a
f("s-jq/----/p---/-cy- yccpyycs")   # s-jq/----/y---/-cp-
f("epns/cvbz/igrd/mqyo ydcmzvs")    # iebn/cpqy/mogs/rvdz
f("kiy-/-ogn/ebua/vq-l euvoei")     # bqo-/-vik/engy/lu-a
f("-ply/-wb-/zg-s/m-e- zpgeyelz")   # -blp/-wm-/gz-s/e-y-
f("e-sr/l---/----/---k lslek")      # e-sr/l---/----/---k
f("---q/-wr-/---a/---- qrqwawqrww") # ---a/-qr-/---w/----
f("fhkr/-qip/zldy/cgvu pcgvrpkciu") # gfdi/-cvh/lzyk/ruqp
f("klfs/r-cw/mdnb/tp-- ppsffmpw")   # kbfm/r-tw/dncl/sp--
f("tm--/ukfh/oldy/jcxa dyxjcuo")    # ht--/jolm/cfuk/xayd

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« そこまで強弁する? | トップ | Python で素因数分解 --- R ... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事