境界線の長さ
締め切りが 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
最新の画像[もっと見る]
- 算額(その1553) 22時間前
- 和算の心(その010) 2日前
- 算額(その1547) 4日前
- 算額(その1546) 5日前
- 算額(その1543) 7日前
- 算額(その1543) 7日前
- 算額(その1543) 7日前
- 算額(その1543) 7日前
- 算額(その1542) 7日前
- 神秘の夜空が語る物語──Wolf Moon の美しさに魅了されて 1週間前