裏 RjpWiki

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

正六角形の分割

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

正六角形の分割

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

正六角形があります。
正六角形の頂点と、辺の中点を全部合わせて「注目点」と呼びます。
注目点のうちいくつかを正六角形の中心と結んだ線分で、正六角形を分割します。
このとき、出来る図形が何角形なのかを計算して下さい。

【入出力】
入力は
69
のようになっています。
これは、線分に割り当てられた値(右図参照)の合計です。
69=1 + 4 + 64
なので、上図の黒い線の部分で分割されます。
出力は、
3,4,4
のような感じです。
出来上がる多角形の頂点数を、昇順にコンマ区切りで。

【例】
入力     出力
69       3,4,4
57       3,3,4,6
1170     4,4,4,4

【補足】
・ 不正な入力に対処する必要はありません。
・ 少なくとも2箇所の注目点は、中心と結ばれます。
・ 内角が180度の点は頂点ではなく、辺の途中です。
・ 入力は 3以上 4095以下の整数です。
・ 凹多角形になっても気にせず頂点数を数えて下さい。

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

f = function(k) {
    point = (1:32)[intToBits(k) == 1] # 選択される注目点の通し番号
    n = length(point)
    point = c(point, point[1] + 12) # 最後の要素は一回りした最初の注目点
    count = NULL
    for (i in 1:n) {
        x = point[i]:point[i + 1]
        m = length(x)
        if (m > 2) {
            for (j in 2:(m - 1)) {
                if (x[j]%%2 == 0) { # 奇数番号目の注目点に挟まれる偶数番号目の注目点はカドにならない
                    x[j] = 0
                }
            }
        }
        count = c(count, (sum(x != 0) + 1 - (x[1] + 6 == x[m]))) # 最初と最後を結んで直線になれば 1 を引く
    }
    cat(paste(sort(count), collapse = ","))
}

> f(4095)
3,3,3,3,3,3,3,3,3,3,3,3

> f(3)
3,8

> f(5)
3,7

> f(10)
4,8

> f(260)
4,4

> f(520)
5,5

> f(132)
5,6

> f(1898)
3,3,3,3,4,4,4

> f(268)
3,4,5

> f(2176)
5,7

> f(1088)
4,6

> f(72)
4,7


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 上下左右に箱を並べよう | トップ | 〇×ゲームの手順は何通り? »
最新の画像もっと見る

コメントを投稿

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