(sicp17)m2.40〜m2.42
久しぶりなので復習もした。
問題2.42にとても時間がかかった。(解けてしまえばそんなに難しくなかった)
(use pre-sicp) ;;この中にaccumurateとかが定義されている。 ;;復習する。 (define (flatmap proc seq) (accumulate append '() (map proc seq))) (define (permutations s) (if (null? s) (list '()) (flatmap (lambda (x) (map (lambda (p) (cons x p)) (permutations (remove x s)))) s))) (define (remove item sequence) (filter (lambda (x) (not (= x item))) sequence)) ;;m2.40 ;prime-sum-pairsの改良は省略 (define (unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n))) ;;m2.41 (define (triple-sum-is-s s n) (filter (lambda (xs) (= s (accumulate + 0 xs))) (flatmap (lambda (i) (map (lambda (j) (append (list i) j)) (unique-pairs (- i 1)))) (enumerate-interval 1 n)))) ;;面倒なので確認ようの関数を作る。 (define (check-sum-is-s? s n) (map (lambda (xs) (list xs (accumulate + 0 xs))) (triple-sum-is-s s n))) ;;ついでにlistの要素ごとに改行しつつ出力する関数を作る。 (define (outputs-list seq) (cond ((null? seq) " END") (else (display (car seq)) (newline) (outputs-list (cdr seq))))) ; gosh> (outputs-list (check-sum-is-s? 13 10)) ; ((6 4 3) 13) ; ((6 5 2) 13) ; ((7 4 2) 13) ; ((7 5 1) 13) ; ((8 3 2) 13) ; ((8 4 1) 13) ; ((9 3 1) 13) ; ((10 2 1) 13) ; " END" ;;m2.42 (define (queens board-size) (define (queen-cols k) (if (= k 0) (list empty-board) (filter (lambda (positions) (safe? k positions)) (flatmap (lambda (rest-of-queens) (map (lambda (new-row) (adjoin-position new-row k rest-of-queens)) (enumerate-interval 1 board-size))) (queen-cols (- k 1)))))) (queen-cols board-size)) ;;未実装の関数を実装する (define empty-board '()) (define (safe? k positions) (define (iter x y target) (if (null? target) #t (let ((next-x (caar target)) (next-y (cadar target))) (if (and (not (= x next-x)) (not (= y next-y)) (not (= (abs (- next-x x)) (abs (- next-y y))))) (iter x y (cdr target)) #f)))) (iter k (cadar positions) (cdr positions))) (define (adjoin-position new-row k rest-of-queens) (append (list (list k new-row)) rest-of-queens)) ;;ここでも出力 ; gosh> (outputs-list (queens 8)) ; ((8 4) (7 2) (6 7) (5 3) (4 6) (3 8) (2 5) (1 1)) ; ((8 5) (7 2) (6 4) (5 7) (4 3) (3 8) (2 6) (1 1)) ; ((8 3) (7 5) (6 2) (5 8) (4 6) (3 4) (2 7) (1 1)) ; ((8 3) (7 6) (6 4) (5 2) (4 8) (3 5) (2 7) (1 1)) ; ((8 5) (7 7) (6 1) (5 3) (4 8) (3 6) (2 4) (1 2)) ; ((8 4) (7 6) (6 8) (5 3) (4 1) (3 7) (2 5) (1 2)) ; ((8 3) (7 6) (6 8) (5 1) (4 4) (3 7) (2 5) (1 2)) ; ((8 5) (7 3) (6 8) (5 4) (4 7) (3 1) (2 6) (1 2)) ; ((8 5) (7 7) (6 4) (5 1) (4 3) (3 8) (2 6) (1 2)) ; ((8 4) (7 1) (6 5) (5 8) (4 6) (3 3) (2 7) (1 2)) ; ((8 3) (7 6) (6 4) (5 1) (4 8) (3 5) (2 7) (1 2)) ; ((8 4) (7 7) (6 5) (5 3) (4 1) (3 6) (2 8) (1 2)) ; ((8 6) (7 4) (6 2) (5 8) (4 5) (3 7) (2 1) (1 3)) ; ((8 6) (7 4) (6 7) (5 1) (4 8) (3 2) (2 5) (1 3)) ; ((8 1) (7 7) (6 4) (5 6) (4 8) (3 2) (2 5) (1 3)) ; ((8 6) (7 8) (6 2) (5 4) (4 1) (3 7) (2 5) (1 3)) ; ((8 6) (7 2) (6 7) (5 1) (4 4) (3 8) (2 5) (1 3)) ; ((8 4) (7 7) (6 1) (5 8) (4 5) (3 2) (2 6) (1 3)) ; ((8 5) (7 8) (6 4) (5 1) (4 7) (3 2) (2 6) (1 3)) ; ((8 4) (7 8) (6 1) (5 5) (4 7) (3 2) (2 6) (1 3)) ; ((8 2) (7 7) (6 5) (5 8) (4 1) (3 4) (2 6) (1 3)) ; ((8 1) (7 7) (6 5) (5 8) (4 2) (3 4) (2 6) (1 3)) ; ((8 2) (7 5) (6 7) (5 4) (4 1) (3 8) (2 6) (1 3)) ; ((8 4) (7 2) (6 7) (5 5) (4 1) (3 8) (2 6) (1 3)) ; ((8 5) (7 7) (6 1) (5 4) (4 2) (3 8) (2 6) (1 3)) ; ((8 6) (7 4) (6 1) (5 5) (4 8) (3 2) (2 7) (1 3)) ; ((8 5) (7 1) (6 4) (5 6) (4 8) (3 2) (2 7) (1 3)) ; ((8 5) (7 2) (6 6) (5 1) (4 7) (3 4) (2 8) (1 3)) ; ((8 6) (7 3) (6 7) (5 2) (4 8) (3 5) (2 1) (1 4)) ; ((8 2) (7 7) (6 3) (5 6) (4 8) (3 5) (2 1) (1 4)) ; ((8 7) (7 3) (6 1) (5 6) (4 8) (3 5) (2 2) (1 4)) ; ((8 5) (7 1) (6 8) (5 6) (4 3) (3 7) (2 2) (1 4)) ; ((8 1) (7 5) (6 8) (5 6) (4 3) (3 7) (2 2) (1 4)) ; ((8 3) (7 6) (6 8) (5 1) (4 5) (3 7) (2 2) (1 4)) ; ((8 6) (7 3) (6 1) (5 7) (4 5) (3 8) (2 2) (1 4)) ; ((8 7) (7 5) (6 3) (5 1) (4 6) (3 8) (2 2) (1 4)) ; ((8 7) (7 3) (6 8) (5 2) (4 5) (3 1) (2 6) (1 4)) ; ((8 5) (7 3) (6 1) (5 7) (4 2) (3 8) (2 6) (1 4)) ; ((8 2) (7 5) (6 7) (5 1) (4 3) (3 8) (2 6) (1 4)) ; ((8 3) (7 6) (6 2) (5 5) (4 8) (3 1) (2 7) (1 4)) ; ((8 6) (7 1) (6 5) (5 2) (4 8) (3 3) (2 7) (1 4)) ; ((8 8) (7 3) (6 1) (5 6) (4 2) (3 5) (2 7) (1 4)) ; ((8 2) (7 8) (6 6) (5 1) (4 3) (3 5) (2 7) (1 4)) ; ((8 5) (7 7) (6 2) (5 6) (4 3) (3 1) (2 8) (1 4)) ; ((8 3) (7 6) (6 2) (5 7) (4 5) (3 1) (2 8) (1 4)) ; ((8 6) (7 2) (6 7) (5 1) (4 3) (3 5) (2 8) (1 4)) ; ((8 3) (7 7) (6 2) (5 8) (4 6) (3 4) (2 1) (1 5)) ; ((8 6) (7 3) (6 7) (5 2) (4 4) (3 8) (2 1) (1 5)) ; ((8 4) (7 2) (6 7) (5 3) (4 6) (3 8) (2 1) (1 5)) ; ((8 7) (7 1) (6 3) (5 8) (4 6) (3 4) (2 2) (1 5)) ; ((8 1) (7 6) (6 8) (5 3) (4 7) (3 4) (2 2) (1 5)) ; ((8 3) (7 8) (6 4) (5 7) (4 1) (3 6) (2 2) (1 5)) ; ((8 6) (7 3) (6 7) (5 4) (4 1) (3 8) (2 2) (1 5)) ; ((8 7) (7 4) (6 2) (5 8) (4 6) (3 1) (2 3) (1 5)) ; ((8 4) (7 6) (6 8) (5 2) (4 7) (3 1) (2 3) (1 5)) ; ((8 2) (7 6) (6 1) (5 7) (4 4) (3 8) (2 3) (1 5)) ; ((8 2) (7 4) (6 6) (5 8) (4 3) (3 1) (2 7) (1 5)) ; ((8 3) (7 6) (6 8) (5 2) (4 4) (3 1) (2 7) (1 5)) ; ((8 6) (7 3) (6 1) (5 8) (4 4) (3 2) (2 7) (1 5)) ; ((8 8) (7 4) (6 1) (5 3) (4 6) (3 2) (2 7) (1 5)) ; ((8 4) (7 8) (6 1) (5 3) (4 6) (3 2) (2 7) (1 5)) ; ((8 2) (7 6) (6 8) (5 3) (4 1) (3 4) (2 7) (1 5)) ; ((8 7) (7 2) (6 6) (5 3) (4 1) (3 4) (2 8) (1 5)) ; ((8 3) (7 6) (6 2) (5 7) (4 1) (3 4) (2 8) (1 5)) ; ((8 4) (7 7) (6 3) (5 8) (4 2) (3 5) (2 1) (1 6)) ; ((8 4) (7 8) (6 5) (5 3) (4 1) (3 7) (2 2) (1 6)) ; ((8 3) (7 5) (6 8) (5 4) (4 1) (3 7) (2 2) (1 6)) ; ((8 4) (7 2) (6 8) (5 5) (4 7) (3 1) (2 3) (1 6)) ; ((8 5) (7 7) (6 2) (5 4) (4 8) (3 1) (2 3) (1 6)) ; ((8 7) (7 4) (6 2) (5 5) (4 8) (3 1) (2 3) (1 6)) ; ((8 8) (7 2) (6 4) (5 1) (4 7) (3 5) (2 3) (1 6)) ; ((8 7) (7 2) (6 4) (5 1) (4 8) (3 5) (2 3) (1 6)) ; ((8 5) (7 1) (6 8) (5 4) (4 2) (3 7) (2 3) (1 6)) ; ((8 4) (7 1) (6 5) (5 8) (4 2) (3 7) (2 3) (1 6)) ; ((8 5) (7 2) (6 8) (5 1) (4 4) (3 7) (2 3) (1 6)) ; ((8 3) (7 7) (6 2) (5 8) (4 5) (3 1) (2 4) (1 6)) ; ((8 3) (7 1) (6 7) (5 5) (4 8) (3 2) (2 4) (1 6)) ; ((8 8) (7 2) (6 5) (5 3) (4 1) (3 7) (2 4) (1 6)) ; ((8 3) (7 5) (6 2) (5 8) (4 1) (3 7) (2 4) (1 6)) ; ((8 3) (7 5) (6 7) (5 1) (4 4) (3 2) (2 8) (1 6)) ; ((8 5) (7 2) (6 4) (5 6) (4 8) (3 3) (2 1) (1 7)) ; ((8 6) (7 3) (6 5) (5 8) (4 1) (3 4) (2 2) (1 7)) ; ((8 5) (7 8) (6 4) (5 1) (4 3) (3 6) (2 2) (1 7)) ; ((8 4) (7 2) (6 5) (5 8) (4 6) (3 1) (2 3) (1 7)) ; ((8 4) (7 6) (6 1) (5 5) (4 2) (3 8) (2 3) (1 7)) ; ((8 6) (7 3) (6 1) (5 8) (4 5) (3 2) (2 4) (1 7)) ; ((8 5) (7 3) (6 1) (5 6) (4 8) (3 2) (2 4) (1 7)) ; ((8 4) (7 2) (6 8) (5 6) (4 1) (3 3) (2 5) (1 7)) ; ((8 6) (7 3) (6 5) (5 7) (4 1) (3 4) (2 2) (1 8)) ; ((8 6) (7 4) (6 7) (5 1) (4 3) (3 5) (2 2) (1 8)) ; ((8 4) (7 7) (6 5) (5 2) (4 6) (3 1) (2 3) (1 8)) ; ((8 5) (7 7) (6 2) (5 6) (4 3) (3 1) (2 4) (1 8)) ; " END"