blob: aea9c86214f0e4df65a476b2020f0131bf2b5cac (
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
|
#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)
|