正六角形の分割
締め切りが 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
最新の画像[もっと見る]
- 算額(その2097) 1日前
- 算額(その2096) 1日前
- 算額(その2095) 2日前
- 算額(その2094) 3日前
- 算額(その2092) 4日前
- 算額(その2090) 5日前
- 算額(その2089) 5日前
- 算額(その2089) 5日前
- 算額(その2088) 6日前
- 算額(その2087) 6日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます