Gaucheで魔方陣に挑戦その3
Gaucheで魔方陣に挑戦その3
たぶんループも途中で諦めるようにしているので速度的にはそろそろ限界に近いはず。
コード的にはfor-each使ったので負けという感が否めない。
たぶん、Scheme的にはもっと違う書き方するんだろうな。というかこの程度しか改善できないならその2が一番よかった。
でも、rubyと同じアルゴリズムのはずなのになぁ。なぜこんなに速度差があるんだろう。
汎用データ構造だからかな?
(use srfi-1) (use util.combinations) (use gauche.collection) (define (npermutations x y) (append-map permutations (combinations x y))) (for-each (lambda (a) (let ((x (fold + 0 a))) (for-each (lambda (b) (for-each (lambda (c) (if (= x (fold + 0 c) (+ (list-ref a 0) (list-ref b 0) (list-ref c 0)) (+ (list-ref a 1) (list-ref b 1) (list-ref c 1)) (+ (list-ref a 2) (list-ref b 2) (list-ref c 2)) (+ (list-ref a 0) (list-ref b 1) (list-ref c 2)) (+ (list-ref a 2) (list-ref b 1) (list-ref c 0))) (print (append a b c) x))) (permutations (lset-difference eq? (iota 9 1) a b)))) (filter (lambda (n) (= x (fold + 0 n))) (npermutations (lset-difference eq? (iota 9 1) a) 3))))) (npermutations (iota 9 1) 3)) ;=>real 0m1.088s ;=>user 0m0.676s ;=>sys 0m0.004s