day 14
parent
956f7839a4
commit
eb202d2abc
@ -0,0 +1,104 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
(define input
|
||||||
|
(let* ([lines (file->lines "day14.txt")]
|
||||||
|
[template (first lines)]
|
||||||
|
[rule-strings (drop lines 2)]
|
||||||
|
[rules (map (λ (rs) (string-split rs " -> ")) rule-strings)])
|
||||||
|
(list template rules)))
|
||||||
|
|
||||||
|
(define template (first input))
|
||||||
|
(define rules (second input))
|
||||||
|
|
||||||
|
(define (find-pairs template)
|
||||||
|
(reverse
|
||||||
|
(foldl (λ (el acc) (cons (substring template el (+ 2 el)) acc))
|
||||||
|
'()
|
||||||
|
(range 0 (sub1 (string-length template))))))
|
||||||
|
|
||||||
|
(define (find-inserts pairs rules)
|
||||||
|
(map (λ (p) (second (assoc p rules))) pairs))
|
||||||
|
|
||||||
|
(define (insert-pairs template inserts)
|
||||||
|
(foldl (λ (idx acc)
|
||||||
|
(let* ([x (string (string-ref template idx))]
|
||||||
|
[insert (list-ref (append inserts (list "")) idx)])
|
||||||
|
(string-append acc x insert)))
|
||||||
|
"" (range 0 (string-length template))))
|
||||||
|
|
||||||
|
(define (step template rules)
|
||||||
|
(let* ([pairs (find-pairs template)]
|
||||||
|
[inserts (find-inserts pairs rules)]
|
||||||
|
[next (insert-pairs template inserts)])
|
||||||
|
next))
|
||||||
|
|
||||||
|
(define (element-counts str)
|
||||||
|
(let* ([lst (map string (string->list str))]
|
||||||
|
[ht (make-hash)])
|
||||||
|
(for-each (λ (x) (hash-set! ht x (+ 1 (hash-ref ht x 0)))) lst)
|
||||||
|
ht))
|
||||||
|
|
||||||
|
(define part1
|
||||||
|
(let* ([final (foldl (λ (i acc) (step acc rules)) template (range 0 10))]
|
||||||
|
[counts (element-counts final)]
|
||||||
|
[values (hash-values counts)]
|
||||||
|
[minimum (apply min values)]
|
||||||
|
[maximum (apply max values)]
|
||||||
|
[diff (- maximum minimum)])
|
||||||
|
diff))
|
||||||
|
|
||||||
|
part1
|
||||||
|
|
||||||
|
; PART 2
|
||||||
|
; uhoh. start over
|
||||||
|
|
||||||
|
(define (inc-hash ht key amount)
|
||||||
|
(hash-set! ht key (+ amount (hash-ref! ht key 0))))
|
||||||
|
|
||||||
|
(define (dec-hash ht key amount)
|
||||||
|
(hash-set! ht key (- (hash-ref! ht key 0) amount)))
|
||||||
|
|
||||||
|
(define (step2 ht)
|
||||||
|
(define pairs (filter (λ (p) (> (cdr p) 0)) (hash->list ht)))
|
||||||
|
(for-each (λ (pair-and-count)
|
||||||
|
(let* ([pair (car pair-and-count)]
|
||||||
|
[count (cdr pair-and-count)]
|
||||||
|
[ins (second (assoc pair rules))]
|
||||||
|
[new1 (string-append (substring pair 0 1) ins)]
|
||||||
|
[new2 (string-append ins (substring pair 1 2))])
|
||||||
|
(inc-hash ht new1 count)
|
||||||
|
(inc-hash ht new2 count)
|
||||||
|
(dec-hash ht pair count)))
|
||||||
|
pairs)
|
||||||
|
ht)
|
||||||
|
|
||||||
|
(define (pairs->element-counts ht)
|
||||||
|
(let* ([el-ht (make-hash)]
|
||||||
|
[pair-counts (hash->list ht)])
|
||||||
|
(for-each (λ (p) (let* ([pair (car p)]
|
||||||
|
[el1 (substring pair 0 1)]
|
||||||
|
[el2 (substring pair 1 2)]
|
||||||
|
[count (cdr p)])
|
||||||
|
(inc-hash el-ht el1 count)
|
||||||
|
(inc-hash el-ht el2 count)))
|
||||||
|
pair-counts)
|
||||||
|
el-ht))
|
||||||
|
|
||||||
|
(define part2
|
||||||
|
(let* ([ht (make-hash)]
|
||||||
|
[pairs (find-pairs template)]) ; find the initial pairs in the template
|
||||||
|
(for-each (λ (pair) (inc-hash ht pair 1)) pairs) ; add them to the hash table
|
||||||
|
(let* ([res (foldl (λ (el acc) (step2 acc)) ht (range 0 40))] ; step!
|
||||||
|
[el-counts (pairs->element-counts res)]
|
||||||
|
[first-char (substring template 0 1)]
|
||||||
|
[last-char (substring template (sub1 (string-length template)))])
|
||||||
|
(inc-hash el-counts first-char 1) ; add the first..
|
||||||
|
(inc-hash el-counts last-char 1) ; and last chars twice..
|
||||||
|
(let* ([lst (hash-map el-counts (λ (key val) (list key (/ val 2))))] ; then divide everything by 2
|
||||||
|
[values (map second lst)]
|
||||||
|
[minimum (apply min values)]
|
||||||
|
[maximum (apply max values)]
|
||||||
|
[diff (- maximum minimum)])
|
||||||
|
diff))))
|
||||||
|
|
||||||
|
part2
|
@ -0,0 +1,18 @@
|
|||||||
|
NNCB
|
||||||
|
|
||||||
|
CH -> B
|
||||||
|
HH -> N
|
||||||
|
CB -> H
|
||||||
|
NH -> C
|
||||||
|
HB -> C
|
||||||
|
HC -> B
|
||||||
|
HN -> C
|
||||||
|
NN -> C
|
||||||
|
BH -> H
|
||||||
|
NC -> B
|
||||||
|
NB -> B
|
||||||
|
BN -> B
|
||||||
|
BB -> N
|
||||||
|
BC -> B
|
||||||
|
CC -> N
|
||||||
|
CN -> C
|
@ -0,0 +1,102 @@
|
|||||||
|
BNSOSBBKPCSCPKPOPNNK
|
||||||
|
|
||||||
|
HH -> N
|
||||||
|
CO -> F
|
||||||
|
BC -> O
|
||||||
|
HN -> V
|
||||||
|
SV -> S
|
||||||
|
FS -> F
|
||||||
|
CV -> F
|
||||||
|
KN -> F
|
||||||
|
OP -> H
|
||||||
|
VN -> P
|
||||||
|
PF -> P
|
||||||
|
HP -> H
|
||||||
|
FK -> K
|
||||||
|
BS -> F
|
||||||
|
FP -> H
|
||||||
|
FN -> V
|
||||||
|
VV -> O
|
||||||
|
PS -> S
|
||||||
|
SK -> N
|
||||||
|
FF -> K
|
||||||
|
PK -> V
|
||||||
|
OF -> N
|
||||||
|
VP -> K
|
||||||
|
KB -> H
|
||||||
|
OV -> B
|
||||||
|
CH -> F
|
||||||
|
SF -> F
|
||||||
|
NH -> O
|
||||||
|
NC -> N
|
||||||
|
SP -> N
|
||||||
|
NN -> F
|
||||||
|
OK -> S
|
||||||
|
BB -> S
|
||||||
|
NK -> S
|
||||||
|
FH -> P
|
||||||
|
FC -> S
|
||||||
|
OB -> P
|
||||||
|
VS -> P
|
||||||
|
BF -> S
|
||||||
|
HC -> V
|
||||||
|
CK -> O
|
||||||
|
NP -> K
|
||||||
|
KV -> S
|
||||||
|
OS -> V
|
||||||
|
CF -> V
|
||||||
|
FB -> C
|
||||||
|
HO -> S
|
||||||
|
BV -> V
|
||||||
|
KS -> C
|
||||||
|
HB -> S
|
||||||
|
SO -> N
|
||||||
|
PH -> C
|
||||||
|
PN -> F
|
||||||
|
OC -> F
|
||||||
|
KO -> F
|
||||||
|
VF -> V
|
||||||
|
CS -> O
|
||||||
|
VK -> O
|
||||||
|
FV -> N
|
||||||
|
OO -> K
|
||||||
|
NS -> S
|
||||||
|
KK -> C
|
||||||
|
FO -> S
|
||||||
|
PV -> S
|
||||||
|
CN -> O
|
||||||
|
VC -> P
|
||||||
|
SS -> C
|
||||||
|
PO -> P
|
||||||
|
BN -> N
|
||||||
|
PB -> N
|
||||||
|
PC -> H
|
||||||
|
SH -> K
|
||||||
|
BH -> F
|
||||||
|
HK -> O
|
||||||
|
VB -> P
|
||||||
|
NV -> O
|
||||||
|
NB -> C
|
||||||
|
CP -> H
|
||||||
|
NO -> K
|
||||||
|
PP -> N
|
||||||
|
CC -> S
|
||||||
|
CB -> K
|
||||||
|
VH -> H
|
||||||
|
SC -> C
|
||||||
|
KC -> N
|
||||||
|
SB -> B
|
||||||
|
BP -> P
|
||||||
|
KP -> K
|
||||||
|
SN -> H
|
||||||
|
KF -> K
|
||||||
|
KH -> B
|
||||||
|
HV -> V
|
||||||
|
HS -> K
|
||||||
|
NF -> B
|
||||||
|
ON -> H
|
||||||
|
BO -> P
|
||||||
|
VO -> K
|
||||||
|
OH -> C
|
||||||
|
HF -> O
|
||||||
|
BK -> H
|
Loading…
Reference in New Issue