aboutsummaryrefslogtreecommitdiff
path: root/2021/day3/03b.rkt
diff options
context:
space:
mode:
Diffstat (limited to '2021/day3/03b.rkt')
-rw-r--r--2021/day3/03b.rkt35
1 files changed, 35 insertions, 0 deletions
diff --git a/2021/day3/03b.rkt b/2021/day3/03b.rkt
new file mode 100644
index 0000000..aea9c86
--- /dev/null
+++ b/2021/day3/03b.rkt
@@ -0,0 +1,35 @@
+#lang racket
+
+(define (mode xs)
+ (define ht (make-hash))
+ (define max-key '0)
+ (for ([x xs])
+ (define new-val (+ 1 (hash-ref ht x 0)))
+ (hash-set! ht x new-val)
+ (if (> new-val (hash-ref ht max-key 0)) (set! max-key x) 3))
+ (cond [(= (hash-ref ht #\0 0) (hash-ref ht #\1 0)) #f]
+ [else max-key]))
+
+(define (flip x)
+ (cond [(char=? x #\0) #\1]
+ [else #\0]))
+
+(define (bit-criteria lines least [fallback (cond [least #\0] [else #\1])] [n 0])
+ (cond [(= (length lines) 1) (car lines)]
+ [else
+ (define bits (map (curryr string-ref n) lines))
+ (define bMode (mode bits))
+ (define criteria (cond [(not bMode) fallback]
+ [least (flip bMode)]
+ [else bMode]))
+ (bit-criteria (filter (lambda (x) (char=? criteria (string-ref x n)))
+ lines)
+ least fallback (+ n 1))]))
+
+(define input (open-input-file "input"))
+(define lines (port->lines input))
+
+(define oxy (string->number (bit-criteria lines #f) 2))
+(define co2 (string->number (bit-criteria lines #t) 2))
+
+(* oxy co2)