SEND MORE MONEY
30分プログラム、その40。もっと金をよこせ。
有名なSEND+MORE=MONEY問題を問いてみる。
gosh> (send-more-money) (9 5 6 7 1 0 8 2)
SEND(9567)+MORE(1085)=MONEY(10652)だから一応正解。遅いけれど。
(use util.combinations) (use util.match) (use srfi-1) (define (make-int . lst) (fold (lambda(x y) (+ (* 10 y) x)) 0 lst)) (define (check set) (match-let (((S E N D M O R Y) set)) (let ((send (make-int S E N D)) (more (make-int M O R E)) (money (make-int M O N E Y))) (and (not (= S 0)) (not (= M 0)) (= (+ send more) money))))) (define (send-more-money) (call/cc (lambda(return) (combinations-for-each (lambda(set) (permutations-for-each (lambda(numbers) (when (check numbers) (print numbers) (return))) set)) (iota 10) 8))))
- 本当はSEND+MORE=MONEYっぽい問題を解く汎用関数orマクロを書きたかった。次回のネタにしよう
- 結局、id:Gemmaさんのやつとそっくりになった