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さんのやつとそっくりになった