問題4.41 – SICP(計算機プログラムの構造と解釈)その214

問題4.41

手を抜いて、順列リストの生成には Gauche の permutations 手続き(Gauche ユーザリファレンス: 11.41 util.combinations – 組み合わせ)を利用する。

(use srfi-1) ; for filter
(use util.combinations) ; for permutations

(define (multiple-dwelling lis)
  (let ((baker (car lis))
        (cooper (cadr lis))
        (fletcher (caddr lis))
        (miller (cadddr lis))
        (smith (cadddr (cdr lis))))
       (and (distinct? (list baker cooper fletcher miller smith))
            (not (= baker 5))
            (not (= cooper 1))
            (not (= fletcher 5))
            (not (= fletcher 1))
            (> miller cooper)
            (not (= (abs (- smith fletcher)) 1))
            (not (= (abs (- fletcher cooper)) 1)))))

(define (distinct? items)
  (cond ((null? items) #t)
        ((null? (cdr items)) #t)
        ((member (car items) (cdr items)) #f)
        (else (distinct? (cdr items)))))

(filter multiple-dwelling (permutations '(1 2 3 4 5)))
gosh> ((3 2 4 5 1))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»