裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

境界線の長さ

2017年04月19日 | ブログラミング

境界線の長さ

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

【概要】
下図のように、8×8のマス目を白と黒で塗り分けます。
黒と白の境界に線を引きます。
黒い領域の上下左右にある境界線(右図の、赤・緑・青・黄色)の総延長をそれぞれ数えるプログラムを書いてください。
マス目の外側との境界線は数えません。



【入出力】
入力は
f78f447ae68f20af
のように、16進数16桁で来ます。
2桁の16進数が1行を表します。
MSBが左で、1が黒を表します。
上記の入力が、右図に対応します。

出力は、
16,17,11,12
のような感じです。
上下左右の境界線の総延長をコンマ区切りでならべてください。
こちらは10進数です。

【例】
入力             出力
f78f447ae68f20af     16,17,11,12     
ffbc94fc89a34523     10,15,12,13     

【補足】
    不正な入力に対処する必要はありません。

===============================

f = function(s) {
    g = function(s) {
        i = utf8ToInt(s)
        i-48-(i >= 97)*39
    }
    h = function(i) {
        as.integer(rev(c(intToBits(i[2])[1:4], intToBits(i[1])[1:4])))
    }
    s = unlist(strsplit(s, ""))
    a = matrix(sapply(s, g), 2)
    b = matrix(9, 10, 10)
    b[2:9, 2:9] = t(apply(a, 2, h))
    red = green = blue = yellow =0
    for (i in 1:8+1) {
        for (j in 1:8+1) {
            if (b[i, j] == 1) {
                red    = red    + (b[i-1, j] == 0)
                green  = green  + (b[i+1, j] == 0)
                blue   = blue   + (b[i, j-1] == 0)
                yellow = yellow + (b[i, j+1] == 0)
            }
        }
    }
    cat(red, green, blue, yellow, sep=",")
}
f("f78f447ae68f20af") # 16,17,11,12
f("ffbc94fc89a34523") # 10,15,12,13

ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« ダイヤルロックを解除して! | トップ | Re: 日本の高校数学の四分位... »
最近の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む