From dbf44b436d620aef07c74f2a8e79487cc74c0272 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Mon, 13 Dec 2021 22:32:54 -0800 Subject: [PATCH] Day 14. --- input/14.txt | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib.rkt | 5 +++ src/14.rkt | 38 +++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 input/14.txt create mode 100644 src/14.rkt diff --git a/input/14.txt b/input/14.txt new file mode 100644 index 0000000..6808cb7 --- /dev/null +++ b/input/14.txt @@ -0,0 +1,102 @@ +KHSSCSKKCPFKPPBBOKVF + +OS -> N +KO -> O +SK -> B +NV -> N +SH -> V +OB -> V +HH -> F +HP -> H +BP -> O +HS -> K +SN -> B +PS -> C +BS -> K +CF -> H +SO -> C +NO -> H +PP -> H +SS -> P +KV -> B +KN -> V +CC -> S +HK -> H +FN -> C +OO -> K +CH -> H +CP -> V +HB -> N +VC -> S +SP -> F +BO -> F +SF -> H +VO -> B +FF -> P +CN -> O +NP -> H +KK -> N +OP -> S +BH -> F +CB -> V +HC -> P +KH -> V +OV -> V +NK -> S +PN -> F +VV -> N +HO -> S +KS -> C +FP -> F +FH -> F +BB -> C +FB -> V +SB -> K +KP -> B +FS -> C +KC -> P +SC -> C +VF -> F +VN -> B +CK -> C +KF -> H +NS -> C +FV -> K +HV -> B +HF -> K +ON -> S +CV -> N +BV -> F +NB -> N +NN -> F +BF -> N +VB -> V +VS -> K +BK -> V +VP -> P +PB -> F +KB -> C +VK -> O +NF -> F +FO -> F +PH -> N +VH -> B +HN -> B +FK -> K +PO -> H +CO -> B +FC -> V +OK -> F +OF -> V +PF -> F +BC -> B +BN -> O +NC -> K +SV -> H +OH -> B +PC -> O +OC -> C +CS -> P +PV -> V +NH -> C +PK -> H diff --git a/lib.rkt b/lib.rkt index 962dc57..935059e 100644 --- a/lib.rkt +++ b/lib.rkt @@ -89,6 +89,11 @@ (define (char->number c) (- (char->integer c) (char->integer #\0))) +;; char->symbol : char? -> symbol? +;; Convert a character into the corresponding symbol +(define (char->symbol c) + (string->symbol (list->string (list c)))) + ;; string->vector : string? -> (vectorof char?) (define (string->vector str) (list->vector (string->list str))) diff --git a/src/14.rkt b/src/14.rkt new file mode 100644 index 0000000..55057e4 --- /dev/null +++ b/src/14.rkt @@ -0,0 +1,38 @@ +#lang curly-fn racket + +(require "../lib.rkt") + +(define-values (template rules left-end right-end) + (match-let ([(list `(,template*) rules) (problem-input-grouped-lines 14)]) + (define template (map char->symbol (string->list template*))) + (values (for/hash ([left template] + [right (rest template)]) + (values (cons left right) 1)) + (for/hash ([rule rules]) + (match-let ([(list _ left right insert) (regexp-match #px"(\\w)(\\w) -> (\\w)" rule)]) + (values (cons (string->symbol left) + (string->symbol right)) + (string->symbol insert)))) + (first template) (last template)))) + +(define (step template) + (for/fold ([polymer (hash)]) + ([pair (hash-keys template)]) + (match-let* ([(cons left right) pair] + [insert (hash-ref rules pair)] + [count (hash-ref template pair)] + [polymer (hash-update polymer (cons left insert) #{+ % count} 0)] + [polymer (hash-update polymer (cons insert right) #{+ % count} 0)]) + polymer))) + +(define (count n) + (for/fold ([counts (hash right-end 1 left-end 1)] + #:result (let ([counts (hash-values counts)]) + (/ (- (maximum counts) (minimum counts)) 2))) + ([(k v) ((iterate step n) template)]) + (match-let* ([(cons left right) k] + [counts (hash-update counts left #{+ % v} 0)] + [counts (hash-update counts right #{+ % v} 0)]) + counts))) + +(show-solution (count 10) (count 40)) \ No newline at end of file