裏 RjpWiki

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

カーペット

2017年10月27日 | ブログラミング

カーペット

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



【概要】
上図のように、正の整数が全て並んでいます。
数をひとつ指定しますので、その数に上下左右に隣接しているマスの数を、昇順にコンマ区切りで出力して下さい。

【入出力】
入力は
3
のようになっています。
ふつうに10進数です。

出力は、入力で指定された数に上下左右に隣接しているマスの数を、昇順にコンマ区切りで出力して下さい。
2,4,9
のような感じです。

【例】
入力        出力
3        2,4,9
20        19,21,72
100        99,101,184

【補足】
    •    不正な入力に対処する必要はありません。
    •    入力は、1以上 100万 以下です。
    •    Wikipedia - シェルピンスキーのカーペットが参考になるかもしれません(ならないかもしれません)。

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

規則性をプログラムできれば簡単。

f = function(n) {
    x = 8^(0:6)
    
    size = 1
    result = matrix(NA, 2187, 2187)
    result[1, 1] = 1
    for (k in 1:7) {
        a = result[1:size, 1:size]
        size0 = 1:size
        size1 = size + 1:size
        size2 = size * 2 + 1:size
    
        result[size0, size1] = a + x[k]
        result[size0, size2] = a + x[k]*2

        result[size1, size0] = a + x[k]*7
        result[size1, size2] = a + x[k]*3

        result[size2, size0] = a + x[k]*6
        result[size2, size1] = a + x[k]*5
        result[size2, size2] = a + x[k]*4
        size = size * 3

    }
    result = cbind(result, result[,1]+8^7) # 次のレベルの 1 列を付加
    index = which(result == n, arr.ind = TRUE)
    i = index[1]
    j = index[2]
    ans = c(result[i-1, j], result[i+1, j], result[i, j-1], result[i, j+1])
    cat(sort(ans[!is.na(ans)]), sep = ",")
}

# f(scan(file("stdin", "r")))
f(1) # 2,8
f(2) # 1,3
f(4) # 3,5,16
f(10) # 9,11
f(101) # 100,102,183
f(1011) # 1001,1010,1012,1021
f(10008) # 9996,10001,10007
f(2341) # 2340,2342,7607,29843
f(16385) # 15799,16386,16392,21651
f(18725) # 18724,18726,60855,238739
f(902876) # 902875,902877,4190208
f(1000000) # 999580,999993,999999

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

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

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