#lang at-exp racket (require "csp.rkt" rackunit) (define demo (make-csp)) (add-vars! demo '(t w) (range 7)) (add-var! demo 'o '(2 6 7)) (define (sum-three t w o) (= 3 (+ t w o))) (add-constraint! demo sum-three '(t w o)) (add-constraint! demo alldiff '(t w o)) (add-constraint! demo < '(t w o)) (check-equal? (solve demo) ($csp (list ($var 'o '(2)) ($var 'w '(1)) ($var 't '(0))) '())) ;; TWO + TWO = FOUR (define ttf (make-csp)) (add-vars! ttf '(t w o f u r c10 c100) (range 10)) (add-constraint! ttf alldiff '(t w o f u r)) (define (adder arg1 arg2 ones-digit tens-digit) (= (+ arg1 arg2) (+ (* 10 tens-digit) ones-digit))) (add-constraint! ttf adder '(o o r c10)) (add-constraint! ttf adder '(w w u c100)) (add-constraint! ttf adder '(t t o f)) (add-constraint! ttf positive? '(f)) (define ttf-solution (solve ttf)) (check-equal? ttf-solution ($csp (list ($var 'c100 '(0)) ($var 'c10 '(0)) ($var 'r '(8)) ($var 'u '(6)) ($var 'f '(1)) ($var 'o '(4)) ($var 'w '(3)) ($var 't '(7))) '())) (define (ttf-print csp) (format "~a~a~a + ~a~a~a = ~a~a~a~a" ($csp-ref csp 't) ($csp-ref csp 'w) ($csp-ref csp 'o) ($csp-ref csp 't) ($csp-ref csp 'w) ($csp-ref csp 'o) ($csp-ref csp 'f) ($csp-ref csp 'o) ($csp-ref csp 'u) ($csp-ref csp 'r))) (check-equal? (solve ttf-solution ttf-print) "734 + 734 = 1468") ;; ABC problem: ;; what is the minimum value of ;; ABC ;; ------- ;; A+B+C (define abc (make-csp)) (add-vars! abc '(a b c) (range 1 10)) (define (test-solution s) (let ([a (car ($csp-vals abc 'a))] [b (car ($csp-vals abc 'b))] [c (car ($csp-vals abc 'c))]) (/ (+ (* 100 a) (* 10 b) c) (+ a b c)))) ;; todo: gather all solutins in generator (test-solution (solve abc))