aboutsummaryrefslogtreecommitdiff
path: root/2021/day-10/day-10.rkt
diff options
context:
space:
mode:
authorHJ <thechairman@thechairman.info>2021-12-11 21:51:00 -0500
committerHJ <thechairman@thechairman.info>2021-12-11 21:51:00 -0500
commitf8281d7bb70bd412c961a2ca6ea675d3231af54d (patch)
treec34b7de9d7b234704198fc345bc16f9eb5608a34 /2021/day-10/day-10.rkt
parent0acfa0750900ece33b1e5aaef492db2a33fa60d7 (diff)
parent1855292990b1d423aae36bcf501bc20ddcf6ae82 (diff)
downloadgleam_aoc-f8281d7bb70bd412c961a2ca6ea675d3231af54d.tar.gz
gleam_aoc-f8281d7bb70bd412c961a2ca6ea675d3231af54d.zip
Merge branch 'main' of https://github.com/hunkyjimpjorps/AdventOfCode
Diffstat (limited to '2021/day-10/day-10.rkt')
-rw-r--r--2021/day-10/day-10.rkt61
1 files changed, 61 insertions, 0 deletions
diff --git a/2021/day-10/day-10.rkt b/2021/day-10/day-10.rkt
new file mode 100644
index 0000000..d40d1ea
--- /dev/null
+++ b/2021/day-10/day-10.rkt
@@ -0,0 +1,61 @@
+#lang racket
+
+(require math/statistics
+ threading
+ "../../jj-aoc.rkt")
+
+(define chunks
+ (port->lines (open-day 10 2021)))
+
+(define (opening-bracket? c)
+ (member c (string->list "([{<")))
+
+(define (matching-brackets? c-left c-right)
+ (member (string c-left c-right) '("()" "[]" "{}" "<>")))
+
+(define (parse-brackets lst [acc '()])
+ (cond
+ [(empty? lst) acc]
+ [(opening-bracket? (first lst))
+ (parse-brackets (rest lst) (cons (first lst) acc))]
+ [(matching-brackets? (first acc) (first lst))
+ (parse-brackets (rest lst) (rest acc))]
+ [else (get-score (first lst))]))
+
+;; part 1
+(define (get-score c)
+ (match (string c)
+ [")" 3]
+ ["]" 57]
+ ["}" 1197]
+ [">" 25137]))
+
+(define (score-invalid-string chunk)
+ (match (parse-brackets (string->list chunk))
+ [(? list?) 0]
+ [n n]))
+
+(for/sum ([chunk (in-list chunks)]) (score-invalid-string chunk))
+
+;; part 2
+(define (completion-score lst)
+ (for/fold ([score 0])
+ ([c (in-list lst)])
+ (define val
+ (match (string c)
+ ["(" 1]
+ ["[" 2]
+ ["{" 3]
+ ["<" 4]))
+ (+ (* 5 score) val)))
+
+(define (score-incomplete-string chunk)
+ (match (parse-brackets (string->list chunk))
+ [(? list? lst) (completion-score lst)]
+ [n 0]))
+
+(~>> (for*/list ([chunk (in-list chunks)]
+ [score (in-value (score-incomplete-string chunk))]
+ #:when (> score 0))
+ score)
+ (median < )) \ No newline at end of file