裏 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でシェアする

Colorize 問題

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

Colorize 問題

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

ある検索ワードで、ある対象ワード群を検索し,各対象ワードが完全一致していたら黄色,部分一致していたら赤,にしてください。

色付けは以下の文法とします。

例えば hoge を黄色にするなら
[hoge]
hoge の ge を赤にするなら
ho=ge=
にしてください。

標準入力
・1行目は検索ワードです。[a-z]からなる1-10文字の文字列で構成されます。
・2行目は検索対象です。[a-z]からなる1-10文字の文字列がスペース区切りで与えられます。
 スペースで区切られた各文字列を対象ワードと呼びます。
・対象ワードは1-5個入力されます。

例:
ge
hoge hige hege ge

標準出力
・対象ワード群を仕様に従って色付けした結果を出力してください
・検索ワードと対象ワードが完全一致した場合は該当対象ワードを黄色に色付けしてください
・検索ワードと対象ワードが部分一致した場合は該当対象ワードを赤に色付けしてください
・検索ワードにマッチしない箇所は色付けせずにそのまま出力してください

例(入力の例に対する出力の例)
ho=ge= hi=ge= he=ge= [ge]

その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)

Samples
Sample1
Input
hige
hoge hige hege

Output
hoge [hige] hege

Sample2
Input
ge
hoge hige hege

Output
ho=ge= hi=ge= he=ge=

Sample3
Input
ge
hoge hige hege ge

Output
ho=ge= hi=ge= he=ge= [ge]

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

f = function(o, s) {
    s = unlist(strsplit(s, " "))
    for (i in seq_along(s)) {
        if (s[i] == o) {
            s[i] = sprintf("[%s]", o)
        } else {
            s[i] = gsub(o, sprintf("=%s=", o), s[i])
        }
    }
    cat(paste(s, collapse=" "))
}

> f("ge", "hoge hige hege ge")
ho=ge= hi=ge= he=ge= [ge]


> f("hige", "hoge hige hege")
hoge [hige] hege

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

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

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