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