Skip to content

Instantly share code, notes, and snippets.

@swannodette
Created October 30, 2011 23:23
Show Gist options
  • Save swannodette/1326585 to your computer and use it in GitHub Desktop.
Save swannodette/1326585 to your computer and use it in GitHub Desktop.
stones.scm
(usefd)
(define (powerset a)
(if (null? a) (list '())
(let ((p (powerset (cdr a))))
(append (map (lambda (x) (cons (car a) x)) p) p))))
(define (remove-duplicates l)
(do ((a '() (if (member (car l) a) a (cons (car l) a)))
(l l (cdr l)))
((null? l) (reverse a))))
(define (solutions)
(run #f (q)
(fresh (a b c d s1 s2)
(domfd a b c d s1 s2 (range 1 40))
(all-differentfd `(,a ,b ,c ,d ,s1 ,s2))
(== a 1)
(<fd a b) (<=fd a 34)
(<fd b c) (<=fd b 34)
(<fd c d) (<=fd c 34)
(plusfd a b s1)
(plusfd s1 c s2)
(plusfd s2 d 40)
(== q `(,a ,b ,c ,d)))))
(define (all-sums)
(map (lambda (x)
(let* ((ps (powerset x))
(sums (cdr (remove-duplicates
(list-sort < (map (lambda (l) (apply + l)) ps))))))
`(stones ,x length ,(length sums) sums ,sums)))
(solutions)))
(time (all-sums)) ;; 85ms
;; {stones {1 2 4 33} length 15 sums {1 2 3 4 5 6 7 33 34 35 36 37 38 39 40}}
;; {stones {1 2 5 32} length 15 sums {1 2 3 5 6 7 8 32 33 34 35 37 38 39 40}}
;; {stones {1 3 5 31} length 15 sums {1 3 4 5 6 8 9 31 32 34 35 36 37 39 40}}
;; {stones {1 2 6 31} length 15 sums {1 2 3 6 7 8 9 31 32 33 34 37 38 39 40}}
;; {stones {1 2 7 30} length 15 sums {1 2 3 7 8 9 10 30 31 32 33 37 38 39 40}}
;; {stones {1 3 6 30} length 15 sums {1 3 4 6 7 9 10 30 31 33 34 36 37 39 40}}
;; {stones {1 2 8 29} length 15 sums {1 2 3 8 9 10 11 29 30 31 32 37 38 39 40}}
;; {stones {1 2 9 28} length 15 sums {1 2 3 9 10 11 12 28 29 30 31 37 38 39 40}}
;; {stones {1 4 6 29} length 15 sums {1 4 5 6 7 10 11 29 30 33 34 35 36 39 40}}
;; {stones {1 3 7 29} length 15 sums {1 3 4 7 8 10 11 29 30 32 33 36 37 39 40}}
;; {stones {1 2 10 27} length 15 sums {1 2 3 10 11 12 13 27 28 29 30 37 38 39 40}}
;; {stones {1 2 11 26} length 15 sums {1 2 3 11 12 13 14 26 27 28 29 37 38 39 40}}
;; {stones {1 3 8 28} length 15 sums {1 3 4 8 9 11 12 28 29 31 32 36 37 39 40}}
;; {stones {1 2 12 25} length 15 sums {1 2 3 12 13 14 15 25 26 27 28 37 38 39 40}}
;; {stones {1 2 13 24} length 15 sums {1 2 3 13 14 15 16 24 25 26 27 37 38 39 40}}
;; {stones {1 4 7 28} length 15 sums {1 4 5 7 8 11 12 28 29 32 33 35 36 39 40}}
;; {stones {1 3 9 27} length 15 sums {1 3 4 9 10 12 13 27 28 30 31 36 37 39 40}}
;; {stones {1 2 14 23} length 15 sums {1 2 3 14 15 16 17 23 24 25 26 37 38 39 40}}
;; {stones {1 2 15 22} length 15 sums {1 2 3 15 16 17 18 22 23 24 25 37 38 39 40}}
;; {stones {1 3 10 26} length 15 sums {1 3 4 10 11 13 14 26 27 29 30 36 37 39 40}}
;; {stones {1 2 16 21} length 15 sums {1 2 3 16 17 18 19 21 22 23 24 37 38 39 40}}
;; {stones {1 5 7 27} length 15 sums {1 5 6 7 8 12 13 27 28 32 33 34 35 39 40}}
;; {stones {1 2 18 19} length 12 sums {1 2 3 18 19 20 21 22 37 38 39 40}}
;; {stones {1 4 8 27} length 15 sums {1 4 5 8 9 12 13 27 28 31 32 35 36 39 40}}
;; {stones {1 3 11 25} length 15 sums {1 3 4 11 12 14 15 25 26 28 29 36 37 39 40}}
;; {stones {1 3 12 24} length 15 sums {1 3 4 12 13 15 16 24 25 27 28 36 37 39 40}}
;; {stones {1 4 9 26} length 15 sums {1 4 5 9 10 13 14 26 27 30 31 35 36 39 40}}
;; {stones {1 3 13 23} length 15 sums {1 3 4 13 14 16 17 23 24 26 27 36 37 39 40}}
;; {stones {1 3 14 22} length 15 sums {1 3 4 14 15 17 18 22 23 25 26 36 37 39 40}}
;; {stones {1 5 8 26} length 15 sums {1 5 6 8 9 13 14 26 27 31 32 34 35 39 40}}
;; {stones {1 4 10 25} length 15 sums {1 4 5 10 11 14 15 25 26 29 30 35 36 39 40}}
;; {stones {1 3 15 21} length 15 sums {1 3 4 15 16 18 19 21 22 24 25 36 37 39 40}}
;; {stones {1 3 17 19} length 14 sums {1 3 4 17 18 19 20 21 22 23 36 37 39 40}}
;; {stones {1 4 11 24} length 15 sums {1 4 5 11 12 15 16 24 25 28 29 35 36 39 40}}
;; {stones {1 6 8 25} length 15 sums {1 6 7 8 9 14 15 25 26 31 32 33 34 39 40}}
;; {stones {1 5 9 25} length 15 sums {1 5 6 9 10 14 15 25 26 30 31 34 35 39 40}}
;; {stones {1 4 12 23} length 15 sums {1 4 5 12 13 16 17 23 24 27 28 35 36 39 40}}
;; {stones {1 4 13 22} length 15 sums {1 4 5 13 14 17 18 22 23 26 27 35 36 39 40}}
;; {stones {1 5 10 24} length 15 sums {1 5 6 10 11 15 16 24 25 29 30 34 35 39 40}}
;; {stones {1 4 14 21} length 15 sums {1 4 5 14 15 18 19 21 22 25 26 35 36 39 40}}
;; {stones {1 4 16 19} length 14 sums {1 4 5 16 17 19 20 21 23 24 35 36 39 40}}
;; {stones {1 6 9 24} length 15 sums {1 6 7 9 10 15 16 24 25 30 31 33 34 39 40}}
;; {stones {1 5 11 23} length 15 sums {1 5 6 11 12 16 17 23 24 28 29 34 35 39 40}}
;; {stones {1 4 17 18} length 13 sums {1 4 5 17 18 19 21 22 23 35 36 39 40}}
;; {stones {1 5 12 22} length 15 sums {1 5 6 12 13 17 18 22 23 27 28 34 35 39 40}}
;; {stones {1 7 9 23} length 15 sums {1 7 8 9 10 16 17 23 24 30 31 32 33 39 40}}
;; {stones {1 6 10 23} length 15 sums {1 6 7 10 11 16 17 23 24 29 30 33 34 39 40}}
;; {stones {1 5 13 21} length 15 sums {1 5 6 13 14 18 19 21 22 26 27 34 35 39 40}}
;; {stones {1 5 15 19} length 14 sums {1 5 6 15 16 19 20 21 24 25 34 35 39 40}}
;; {stones {1 6 11 22} length 15 sums {1 6 7 11 12 17 18 22 23 28 29 33 34 39 40}}
;; {stones {1 5 16 18} length 15 sums {1 5 6 16 17 18 19 21 22 23 24 34 35 39 40}}
;; {stones {1 7 10 22} length 15 sums {1 7 8 10 11 17 18 22 23 29 30 32 33 39 40}}
;; {stones {1 6 12 21} length 15 sums {1 6 7 12 13 18 19 21 22 27 28 33 34 39 40}}
;; {stones {1 6 14 19} length 14 sums {1 6 7 14 15 19 20 21 25 26 33 34 39 40}}
;; {stones {1 8 10 21} length 15 sums {1 8 9 10 11 18 19 21 22 29 30 31 32 39 40}}
;; {stones {1 7 11 21} length 15 sums {1 7 8 11 12 18 19 21 22 28 29 32 33 39 40}}
;; {stones {1 6 15 18} length 15 sums {1 6 7 15 16 18 19 21 22 24 25 33 34 39 40}}
;; {stones {1 6 16 17} length 13 sums {1 6 7 16 17 18 22 23 24 33 34 39 40}}
;; {stones {1 7 13 19} length 14 sums {1 7 8 13 14 19 20 21 26 27 32 33 39 40}}
;; {stones {1 7 14 18} length 15 sums {1 7 8 14 15 18 19 21 22 25 26 32 33 39 40}}
;; {stones {1 8 12 19} length 14 sums {1 8 9 12 13 19 20 21 27 28 31 32 39 40}}
;; {stones {1 7 15 17} length 15 sums {1 7 8 15 16 17 18 22 23 24 25 32 33 39 40}}
;; {stones {1 9 11 19} length 14 sums {1 9 10 11 12 19 20 21 28 29 30 31 39 40}}
;; {stones {1 8 13 18} length 15 sums {1 8 9 13 14 18 19 21 22 26 27 31 32 39 40}}
;; {stones {1 8 14 17} length 15 sums {1 8 9 14 15 17 18 22 23 25 26 31 32 39 40}}
;; {stones {1 9 12 18} length 15 sums {1 9 10 12 13 18 19 21 22 27 28 30 31 39 40}}
;; {stones {1 8 15 16} length 13 sums {1 8 9 15 16 17 23 24 25 31 32 39 40}}
;; {stones {1 10 12 17} length 15 sums {1 10 11 12 13 17 18 22 23 27 28 29 30 39 40}}
;; {stones {1 9 13 17} length 15 sums {1 9 10 13 14 17 18 22 23 26 27 30 31 39 40}}
;; {stones {1 9 14 16} length 15 sums {1 9 10 14 15 16 17 23 24 25 26 30 31 39 40}}
;; {stones {1 10 13 16} length 15 sums {1 10 11 13 14 16 17 23 24 26 27 29 30 39 40}}
;; {stones {1 11 13 15} length 15 sums {1 11 12 13 14 15 16 24 25 26 27 28 29 39 40}}
;; {stones {1 10 14 15} length 13 sums {1 10 11 14 15 16 24 25 26 29 30 39 40}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment