aboutsummaryrefslogtreecommitdiff
path: root/2021/day-19/day-19.rkt
blob: b05c56b5192001f2dfac046b4382d7d8f3969627 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#lang racket
(require "../../jj-aoc.rkt"
         awesome-list
         threading
         racket/struct)

(struct coord (x y z) #:transparent)

(define (coord-broadcast f c1 c2)
  (match-define (coord x1 y1 z1) c1)
  (match-define (coord x2 y2 z2) c2)
  (coord (f x1 x2) (f y1 y2) (f z1 z2)))

(define (coord-reduce f c1 c2)
  (foldl (λ (i1 i2 acc) (+ acc (f i1 i2)))
         0
         (struct->list c1)
         (struct->list c2)))

(define coord-delta (curry coord-broadcast -))
(define coord-sum (curry coord-broadcast +))
(define coord-manhattan (curry coord-reduce (coord 0 0 0)))

(define (create-scan-data d)
  (for/list ([l (in-list d)])
    (for/list ([pt (in-list (~> (string-split l "\n")
                              rest))])
      (~>> pt
           (regexp-match #px"(-?\\d+),(-?\\d+),(-?\\d+)")
           rest
           (map string->number)
           (apply coord)))))

(define scanner-data (create-scan-data (~>> (open-day 19 2021)
                                            port->string
                                            (string-split _ "\n\n"))))

(define test-scanner-data (create-scan-data (~>> (open-input-file "test-scanners")
                                                 port->string
                                                 (string-split _ "\n\n"))))

(define (generate-rotations scanner)
  (transpose
   (for*/list ([pt (in-list scanner)])
     (match-define (coord x y z) pt)
     (define orientations (list (list x y z)
                                (list x z (- y))
                                (list x (- y) (- z))
                                (list x (- z) y)))
     (append*
      (for/list ([o (in-list orientations)])
        (match-define (list x* y* z*) o)
        (list (list x y z)
              (list (- x) z y)
              (list z (- y) x)
              (list y x (- z))
              (list (- y) (- z) x)))))))

(define (find-overlaps scan1 scan2)
  (for/list ([rotation (in-permutations scan2)])
    (map coord-sum scan1 rotation)))

(first test-scanner-data)
(find-overlaps (first test-scanner-data) (second test-scanner-data))