裏 RjpWiki

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

CodeIQ 7 を数える。の解答例

2014年07月08日 | ブログラミング

CodeIQ 7 を数える
http://blog.goo.ne.jp/r-de-r/e/5de4a4c285dfdbf0dc86dedf85ebfcfd

ソースをどこに置いたか,失念していたのでちょっと遅れた。
基本的には,このようなプログラムは,ブルートフォースはもってのほか。
理論的に証明は難しくても,規則性を発見してそれを利用しなくては,有限の計算時間で解を求めるようなプログラムを得るのは難しい。

偉そうに言っていて,外していたら,非常に恥ずかしいかも知れないが,別に私は天才的なプログラマでもないし,ほかの人から「こんなことに気づかない程の馬鹿と思われても一向に気にしない(本当は,すごく気にして,落ち込んで,再起不能になる)。

で,解説抜きでプログラム提示(解説した文書も行方不明なんですよね...)

func1 = function(n) {
    return(sum(unlist(strsplit(as.character(1:n), "")) == "7"))
}

func2 = function(n) {
    ans = 0
    repeat {
        keta = nchar(n) - 1
        m = n %/% (10 ^ keta)
        ans = ans + m * keta * 10 ^ (keta - 1)
        if (m == 7) {
            ans = ans + n - 7 * 10 ^ keta + 1
        } else if (m > 7) {
            ans = ans + 10 ^ keta
        }
        n = n %% (10 ^ keta)
        if (n == 0)
            break
    }
    return(ans)
}

func1 は真っ正直なプログラムで,間違いない答えを出してくれる(と,思うし,思いたい)。けれども,計算時間がかかりすぎる。
func2 が,回答候補プログラム。

両方のプログラムで,実行可能範囲で両者の解が一致することを確認した。

それでもなお間違えていたとすれば,申し訳ない。

以上で~~す

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

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

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