沖縄読書会

今日は 70p の問題 2.38 から。色々脱線しまくって進捗は実質 2 頁だったりして。

問題 2.40

sw@mac の中の人は

(define (prime-sum-pairs n)
  (map make-pair-sum
       (filter prime-sum?
               (flatmap
                 (lambda (i)
                   (map (lambda (j) (list i j))
                        (enumerate-interval 1 (- i 1))))
                 (enumerate-interval 1 n)))))

を以下にすれば良い、と主張。

(define (unique-pairs n)
  (flatmap
    (lambda (i)
      (map (lambda (j) (list i j))
           (enumerate-interval 1 (- i 1))))
    (enumerate-interval 1 n)))

(define (prime-sum-pairs n)
  (map make-pair-sum
       (filter prime-sum? (unique-pairs n))))

わしは 72p にある permutations を何か応用するんじゃね? と言いつつ解散だったんですが、確かに問題の意図としてはそうかも。難しく考え杉。

宿題

問題 2.43 あたりまでが宿題な模様。そーゆー意味では 3 問分なのか。とりあえず問題 2.41 をヤッツけてみる。とりあえず数え上げから。
三つ、ってのがポイント高いな。ざっくり以下をでっち上げた。

(define (unique-pairs n)
  (flatmap
    (lambda (i)
      (flatmap
        (lambda (k)
          (map (lambda (j) (list j k i))
               (enumerate-interval 1 k)))
        (enumerate-interval 1 i)))
    (enumerate-interval 1 n)))

なんか微妙。これを s と = か? な手続きで filter すれば OK と見た。filter に渡す述語てきには s が分かってないと微妙って事で以下?

(define (2-41 n s)
  (define (equal-sum? pair)
    (= (apply + pair) s))
  (map equal-sum? (unique-pairs n)))

で実行したら以下が出てきた。

gosh> (2-41 2 6)
(#f #f #f #t)
gosh>

わはは。filter してない。以下じゃねぇか。

(define (filter pred seq)
  (cond ((null? seq) '())
	((pred (car seq))
	 (cons (car seq)
	       (filter pred (cdr seq))))
	(else
	 (filter pred (cdr seq)))))

(define (2-41 n s)
  (define (equal-sum? pair)
    (= (apply + pair) s))
  (filter equal-sum? (unique-pairs n)))

一応動いてる模様。