File tree Expand file tree Collapse file tree 2 files changed +77
-0
lines changed Expand file tree Collapse file tree 2 files changed +77
-0
lines changed Original file line number Diff line number Diff line change
1
+ 00100
2
+ 11110
3
+ 10110
4
+ 10111
5
+ 10101
6
+ 01111
7
+ 00111
8
+ 11100
9
+ 10000
10
+ 11001
11
+ 00010
12
+ 01010
Original file line number Diff line number Diff line change
1
+ #lang racket
2
+
3
+ (require "aoc.rkt " threading)
4
+
5
+
6
+ (define (split-out data col)
7
+ (partition
8
+ (λ (row) (char=? #\1 (list-ref row col)))
9
+ data))
10
+
11
+ (define (compute nrs)
12
+ (for/sum ([(n ex) (in-indexed nrs)])
13
+ (* n (expt 2 ex))))
14
+
15
+ (define (part-1 data)
16
+ (define (opposite val)
17
+ (- 1 val))
18
+ (define (most-common-bit pos data)
19
+ (define-values (ones zeros) (split-out data pos))
20
+ (if (> (length zeros) (length ones)) 0 1 ))
21
+ (for/fold ([gamma '() ]
22
+ #:result (* (compute gamma) (compute (map opposite gamma))))
23
+ ([col (in-range (length (first data)))])
24
+ (cons (most-common-bit col data) gamma)))
25
+
26
+
27
+ (define (filter-out most-common? data)
28
+ (for/fold ([acc data]
29
+ #:result (first acc))
30
+ ([col (in-range (length (first data)))]
31
+ #:break (= 1 (length acc)))
32
+ (define-values (ones zeros) (split-out acc col))
33
+ (define more-zeros? (> (length zeros) (length ones)))
34
+ (if (xor most-common? more-zeros?) ones zeros)))
35
+
36
+ (define (part-2 data)
37
+ (for/fold ([acc 1 ])
38
+ ([most-common? '(#t #f )])
39
+ (~>> data
40
+ (filter-out most-common?)
41
+ (map (λ (c) (if (char=? #\1 c) 1 0 )))
42
+ reverse
43
+ compute
44
+ (* acc))))
45
+
46
+
47
+ (define numbers (read-input 3 'list ))
48
+ (part-1 numbers)
49
+ (part-2 numbers)
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+ (module+ test
62
+ (require rackunit)
63
+ (define numbers (read-input "03-test " 'list ))
64
+ (check-equal? (part-1 numbers) 198 )
65
+ (check-equal? (part-2 numbers) 230 ))
You can’t perform that action at this time.
0 commit comments