PasteRack.org
Paste # 25988
2025-12-25 10:21:19

Fork as a new paste.

Paste viewed 250 times.


Embed:

logic bombs logic

  1. #lang racket
  2. ;; logic bombs 137
  3. ;; idk how to get going with this puzzle so I guess it's time to learn racklog https://docs.racket-lang.org/racklog/
  4.  
  5. (require racklog)
  6.  
  7. (define TARGET-TOTAL 34)
  8.  
  9. ;; given a list of numbers/options for numbers (as a list) return set of all possible sums of subsets of those numbers
  10. ;; e.g. (possible-sums '(1 2 3)) => (set 0 1 2 3 4 5 6)
  11. ;; when an option is given, use one of but not multiple of the alternatives
  12. ;; e.g. (possible-sums '(1 [10 20])) => (set 0 1 20 21 10 11)
  13. (define (possible-sums single-can-see)
  14.   (if (empty? single-can-see)
  15.       (set 0)
  16.       (let loop ([current (car single-can-see)]
  17.                  [rest (cdr single-can-see)]
  18.                  [found (set 0)])
  19.         (let* ([subsums (possible-sums rest)]
  20.                [newfound (cond [(list? current)
  21.                                 (apply set-union
  22.                                        (for/list ([current-option current])
  23.                                          (list->set (set-map subsums (λ (n) (+ current-option n))))))]
  24.                                [else
  25.                                 (list->set (set-map subsums (λ (n) (+ current n))))])]
  26.                [allfound (set-union found newfound)])
  27.           (if (empty? rest) allfound
  28.               (loop (car rest) (cdr rest) allfound))))))
  29.  
  30. ;; given a list of what each bomb of the same type can see, return list of
  31. ;; possible target values for that type of bomb (see possible-sums above or test cases for input format)
  32. (define (possible-hits can-see)
  33.   (set->list (apply set-intersect (map possible-sums can-see))))
  34.  
  35. (define possible-hits-test-cases
  36.   `([x
  37.      ((3 1 2)
  38.       (3 1 2))
  39.      (0 1 2 3 4 5 6)]
  40.     [y
  41.      ((3 3 3)
  42.       (3 1 (1 2))
  43.       (3 3 3)
  44.       (1 2 2))
  45.      (0 3)]
  46.     [z
  47.      (((1 2) 1 3)
  48.       (1 3 3)
  49.       ((1 2) 1 2))
  50.      (0 1 3 4)]
  51.     [a
  52.      ((3 1 (1 2)))
  53.      (0 1 2 3 4 5 6)]
  54.     [b
  55.      ((3 3 1))
  56.      (0 1 3 4 6 7)]
  57.     [c
  58.      ((2 3 1))
  59.      (0 1 2 3 4 5 6)]))
  60.  
  61. (define (lists-match? a b)
  62.   (equal? (sort a <)
  63.           (sort b <)))
  64.  
  65. (for ([test-case possible-hits-test-cases])
  66.   (match test-case
  67.     [(list title can-see expected)
  68.      (let* ([got (possible-hits can-see)]
  69.             [pass? (lists-match? expected got)])
  70.        (unless pass?
  71.          #;(displayln (~a title " PASS"))
  72.          (displayln (~a title " FAIL: expected " expected ", got " got))))]))
  73.  
  74. ;; can a bomb 'x/'y/'z/'a/'b/'c hit given number of targets?
  75. (define %can-hit
  76.   (%rel (bomb n)
  77.         [('x n)
  78.          (%member n (possible-hits
  79.                      '((3 1 2)
  80.                        (3 1 2))))]
  81.         [('y n)
  82.          (%member n (possible-hits
  83.                      '((3 3 3)
  84.                        (3 1 [1 2])
  85.                        (3 3 3)
  86.                        (1 2 2))))]
  87.         [('z n)
  88.          (%member n (possible-hits
  89.                      '(([1 2] 1 3)
  90.                        (1 3 3)
  91.                        ([1 2] 1 2))))]
  92.         [('a n)
  93.          (%member n (possible-hits
  94.                      '((3 1 [1 2]))))]
  95.         [('b n)
  96.          (%member n (possible-hits
  97.                      '((3 3 1))))]
  98.         [('c n)
  99.          (%member n (possible-hits
  100.                      '((2 1 3))))]))
  101.  
  102. ;; how many of each bomb type are present
  103. (define (bomb-count bomb)
  104.   (second (assoc bomb '((x 2)
  105.                         (y 4)
  106.                         (z 3)
  107.                         (a 1)
  108.                         (b 1)
  109.                         (c 1)))))
  110.  
  111. ;; given numbers hit for each bomb type, return sum of targets hit
  112. ;; by all bombs of each type
  113. (define (bomb-total x y z a b c)
  114.   (+ (* x (bomb-count 'x))
  115.      (* y (bomb-count 'y))
  116.      (* z (bomb-count 'z))
  117.      (* a (bomb-count 'a))
  118.      (* b (bomb-count 'b))
  119.      (* c (bomb-count 'c))))
  120.  
  121. ;; there's definitely a better way to write this lmao
  122. (define %distinct
  123.   (%rel (x y z a b c)
  124.         [(x y z a b c)
  125.          (%=/= x y)
  126.          (%=/= x z)
  127.          (%=/= x a)
  128.          (%=/= x b)
  129.          (%=/= x c)
  130.          (%=/= y z)
  131.          (%=/= y a)
  132.          (%=/= y b)
  133.          (%=/= y c)
  134.          (%=/= z a)
  135.          (%=/= z b)
  136.          (%=/= z c)
  137.          (%=/= a b)
  138.          (%=/= a c)
  139.          (%=/= b c)]))
  140.  
  141. (define %sums-to-target
  142.   (%rel (x y z a b c target)
  143.         [(x y z a b c target)
  144.          (%is target (bomb-total x y z a b c))]))
  145.  
  146. ;; given hit numbers for each type of bomb and a number of targets to hit
  147. ;; can that many of each type of bomb be hit, do they satisify distinct rule, and do they hit the right number of targets?
  148. (define %hits
  149.   (%rel (x y z a b c)
  150.         [(x y z a b c)
  151.          (%can-hit 'x x)
  152.          (%can-hit 'y y)
  153.          (%can-hit 'z z)
  154.          (%can-hit 'a a)
  155.          (%can-hit 'b b)
  156.          (%can-hit 'c c)
  157.          (%distinct x y z a b c)
  158.          (%sums-to-target x y z a b c TARGET-TOTAL)]))
  159.  
  160. (displayln "All possible combinations from start of puzzle")
  161. (%find-all (x y z a b c) (%hits x y z a b c))
  162. (displayln "")
  163. (displayln "Narrowed down problem space some from other parts of puzzle")
  164. (%find-all (x y z a b c)
  165.            (%and (%hits x y z a b c)
  166.                  (%>= x 2)
  167.                  (%>= y 3)
  168.                  (%>= z 1)
  169.                  (%>= a 2)
  170.                  (%>= c 2)))

=>

All possible combinations from start of puzzle

'(((x . 6) (y . 3) (z . 1) (a . 5) (b . 0) (c . 2))

  ((x . 6) (y . 3) (z . 1) (a . 2) (b . 0) (c . 5))

  ((x . 6) (y . 3) (z . 0) (a . 5) (b . 4) (c . 1))

  ((x . 6) (y . 3) (z . 0) (a . 5) (b . 1) (c . 4))

  ((x . 6) (y . 3) (z . 0) (a . 4) (b . 1) (c . 5))

  ((x . 6) (y . 3) (z . 0) (a . 2) (b . 7) (c . 1))

  ((x . 6) (y . 3) (z . 0) (a . 1) (b . 7) (c . 2))

  ((x . 6) (y . 3) (z . 0) (a . 1) (b . 4) (c . 5))

  ((x . 6) (y . 0) (z . 4) (a . 5) (b . 3) (c . 2))

  ((x . 6) (y . 0) (z . 4) (a . 2) (b . 7) (c . 1))

  ((x . 6) (y . 0) (z . 4) (a . 2) (b . 3) (c . 5))

  ((x . 6) (y . 0) (z . 4) (a . 1) (b . 7) (c . 2))

  ((x . 6) (y . 0) (z . 3) (a . 5) (b . 7) (c . 1))

  ((x . 6) (y . 0) (z . 3) (a . 4) (b . 7) (c . 2))

  ((x . 6) (y . 0) (z . 3) (a . 2) (b . 7) (c . 4))

  ((x . 6) (y . 0) (z . 3) (a . 1) (b . 7) (c . 5))

  ((x . 5) (y . 3) (z . 1) (a . 2) (b . 7) (c . 0))

  ((x . 5) (y . 3) (z . 1) (a . 0) (b . 7) (c . 2))

  ((x . 5) (y . 3) (z . 0) (a . 6) (b . 4) (c . 2))

  ((x . 5) (y . 3) (z . 0) (a . 4) (b . 7) (c . 1))

  ((x . 5) (y . 3) (z . 0) (a . 4) (b . 6) (c . 2))

  ((x . 5) (y . 3) (z . 0) (a . 2) (b . 6) (c . 4))

  ((x . 5) (y . 3) (z . 0) (a . 2) (b . 4) (c . 6))

  ((x . 5) (y . 3) (z . 0) (a . 1) (b . 7) (c . 4))

  ((x . 5) (y . 0) (z . 4) (a . 3) (b . 7) (c . 2))

  ((x . 5) (y . 0) (z . 4) (a . 2) (b . 7) (c . 3))

  ((x . 5) (y . 0) (z . 3) (a . 6) (b . 7) (c . 2))

  ((x . 5) (y . 0) (z . 3) (a . 2) (b . 7) (c . 6))

  ((x . 4) (y . 3) (z . 1) (a . 6) (b . 0) (c . 5))

  ((x . 4) (y . 3) (z . 1) (a . 5) (b . 6) (c . 0))

  ((x . 4) (y . 3) (z . 1) (a . 5) (b . 0) (c . 6))

  ((x . 4) (y . 3) (z . 1) (a . 0) (b . 6) (c . 5))

  ((x . 4) (y . 3) (z . 0) (a . 6) (b . 7) (c . 1))

  ((x . 4) (y . 3) (z . 0) (a . 5) (b . 7) (c . 2))

  ((x . 4) (y . 3) (z . 0) (a . 2) (b . 7) (c . 5))

  ((x . 4) (y . 3) (z . 0) (a . 1) (b . 7) (c . 6))

  ((x . 2) (y . 3) (z . 4) (a . 5) (b . 1) (c . 0))

  ((x . 2) (y . 3) (z . 4) (a . 5) (b . 0) (c . 1))

  ((x . 2) (y . 3) (z . 4) (a . 1) (b . 0) (c . 5))

  ((x . 2) (y . 3) (z . 4) (a . 0) (b . 1) (c . 5))

  ((x . 2) (y . 3) (z . 1) (a . 6) (b . 4) (c . 5))

  ((x . 2) (y . 3) (z . 1) (a . 5) (b . 6) (c . 4))

  ((x . 2) (y . 3) (z . 1) (a . 5) (b . 4) (c . 6))

  ((x . 2) (y . 3) (z . 1) (a . 4) (b . 6) (c . 5))

  ((x . 2) (y . 3) (z . 0) (a . 6) (b . 7) (c . 5))

  ((x . 2) (y . 3) (z . 0) (a . 5) (b . 7) (c . 6))

  ((x . 2) (y . 0) (z . 4) (a . 6) (b . 7) (c . 5))

  ((x . 2) (y . 0) (z . 4) (a . 5) (b . 7) (c . 6))

  ((x . 1) (y . 3) (z . 4) (a . 6) (b . 0) (c . 2))

  ((x . 1) (y . 3) (z . 4) (a . 2) (b . 6) (c . 0))

  ((x . 1) (y . 3) (z . 4) (a . 2) (b . 0) (c . 6))

  ((x . 1) (y . 3) (z . 4) (a . 0) (b . 6) (c . 2))

  ((x . 0) (y . 3) (z . 4) (a . 2) (b . 7) (c . 1))

  ((x . 0) (y . 3) (z . 4) (a . 1) (b . 7) (c . 2)))

Narrowed down problem space some from other parts of puzzle

'(((x . 6) (y . 3) (z . 1) (a . 5) (b . 0) (c . 2))

  ((x . 6) (y . 3) (z . 1) (a . 2) (b . 0) (c . 5))

  ((x . 4) (y . 3) (z . 1) (a . 6) (b . 0) (c . 5))

  ((x . 4) (y . 3) (z . 1) (a . 5) (b . 0) (c . 6))

  ((x . 2) (y . 3) (z . 1) (a . 6) (b . 4) (c . 5))

  ((x . 2) (y . 3) (z . 1) (a . 5) (b . 6) (c . 4))

  ((x . 2) (y . 3) (z . 1) (a . 5) (b . 4) (c . 6))

  ((x . 2) (y . 3) (z . 1) (a . 4) (b . 6) (c . 5)))