沖縄読書会
今日は 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)))
一応動いてる模様。