裏 RjpWiki

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

算数パズルの解を求めるプログラム(その2)

2014年03月04日 | ブログラミング

子供がやってた算数問題(改)
http://r-statistics-fan.hatenablog.com/entry/2014/03/03/220956
 にあるプログラム。

あまり速くないと言われてる gtools の permutations() ではあるが,使い方によっては,べらぼうに速い。あっという間に解が得られる。(私も意外であったが)

 f3 = function() {
     library(gtools)
     x = permutations(10,4)
     apply(x, 1, function(y) {
         if (all(y != 6) && abs(y[1]-y[2]) == 6) {
             z1 = abs(diff(y))
             z2 = abs(diff(z1))
             z3 = abs(diff(z2))
             if (length(table(c(y, z1, z2, z3))) == 10) {
                 print(c(y, z1, z2, z3))
                 return
             }
         }
    })
    invisible()
 }
 > system.time(f3())
  [1]  9  3 10  8  6  7  2  1  5  4
    ユーザ   システム       経過  
       0.101      0.001      0.101

プログラム実行時間を短くするにはいくつかのやり方があるが,
1. 探索範囲を狭くする
2. 全体の実行時間を短くするためには,準備に実行時間をかければ,その努力は十分に報われることもある
というようなものもあるということで。

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

算数パズルの解を求めるプログラム

2014年03月04日 | ブログラミング

子供がやってた算数問題(改)
http://r-statistics-fan.hatenablog.com/entry/2014/03/03/220956
 にあるプログラム。

最初の部分を

    s = permutations(10)
    s = s[s[,5]==6,]

    a = b = c = d = e = f = g = numeric(nrow(s))

とするだけで,処理時間は元の 60% ほどになる。代入記号に = を使うのは,このブログの欠陥を回避するため。

permutations がほとんどの時間を取るので,それ以外の箇所をいじっても,あまり効果はなさそう。

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

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

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