day 3
parent
16de58bd15
commit
7873dece47
@ -0,0 +1,73 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
; utility functions
|
||||||
|
|
||||||
|
(define (char->number char)
|
||||||
|
(if (equal? char #\0) 0 1))
|
||||||
|
|
||||||
|
(define (number->char num)
|
||||||
|
(if (= num 0) #\0 #\1))
|
||||||
|
|
||||||
|
(define (string->numbers str)
|
||||||
|
(map char->number (string->list str)))
|
||||||
|
|
||||||
|
(define (transpose xss)
|
||||||
|
(apply map list xss))
|
||||||
|
|
||||||
|
; IO
|
||||||
|
|
||||||
|
(define lines
|
||||||
|
(file->lines "day3.txt"))
|
||||||
|
|
||||||
|
(define chars
|
||||||
|
(map string->numbers lines))
|
||||||
|
|
||||||
|
; part 1
|
||||||
|
|
||||||
|
(define (count-ones-in-list xss)
|
||||||
|
(foldl + 0 (filter positive? xss)))
|
||||||
|
|
||||||
|
(define counts
|
||||||
|
(map count-ones-in-list (transpose chars)))
|
||||||
|
|
||||||
|
(define gamma-bin-list
|
||||||
|
(map (λ (count)
|
||||||
|
(if (> count (/ (length chars) 2)) 1 0))
|
||||||
|
counts))
|
||||||
|
|
||||||
|
(define (flip-bits num)
|
||||||
|
(map (λ (n) (modulo (+ 1 n) 2)) num))
|
||||||
|
|
||||||
|
(define epsilon-bin-list (flip-bits gamma-bin-list))
|
||||||
|
|
||||||
|
(define (binary-list->decimal num)
|
||||||
|
(string->number (list->string (map number->char num)) 2))
|
||||||
|
|
||||||
|
(define gamma-dec (binary-list->decimal gamma-bin-list))
|
||||||
|
(define epsilon-dec (binary-list->decimal epsilon-bin-list))
|
||||||
|
(define part1 (* gamma-dec epsilon-dec))
|
||||||
|
|
||||||
|
; part 2
|
||||||
|
; sounds like a fold to me
|
||||||
|
|
||||||
|
(define (most-common-digit column xs type)
|
||||||
|
(define col-values (map (λ (x) (list-ref x column)) xs))
|
||||||
|
(define ones (count-ones-in-list col-values))
|
||||||
|
(define op (if (equal? type 'o2) >= <)) ; 'o2 uses >=, 'co2 uses <
|
||||||
|
(if (op ones (/ (length xs) 2)) 1 0))
|
||||||
|
|
||||||
|
(define (get-rating xs type)
|
||||||
|
(flatten
|
||||||
|
(foldl (λ (column remaining)
|
||||||
|
(define most-common (most-common-digit column remaining type))
|
||||||
|
(if (= (length remaining) 1) ; if there's only one left
|
||||||
|
remaining ; return it
|
||||||
|
(filter (λ (ys)
|
||||||
|
(= (list-ref ys column) most-common))
|
||||||
|
remaining)))
|
||||||
|
xs
|
||||||
|
(range (length (first xs))))))
|
||||||
|
|
||||||
|
(define o2-rating (binary-list->decimal (get-rating chars 'o2)))
|
||||||
|
(define co2-rating (binary-list->decimal (get-rating chars 'co2)))
|
||||||
|
(define part2 (* o2-rating co2-rating))
|
@ -0,0 +1,12 @@
|
|||||||
|
00100
|
||||||
|
11110
|
||||||
|
10110
|
||||||
|
10111
|
||||||
|
10101
|
||||||
|
01111
|
||||||
|
00111
|
||||||
|
11100
|
||||||
|
10000
|
||||||
|
11001
|
||||||
|
00010
|
||||||
|
01010
|
Loading…
Reference in New Issue