aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J <thechairman@thechairman.info>2024-03-05 15:19:48 -0500
committerH.J <thechairman@thechairman.info>2024-03-05 15:19:48 -0500
commit59b7df9c12c40eeea7e4b4c03b02237e14d7a5f5 (patch)
treee147ee984d904ffca88fdecbafefa36c34410ac9
parentcff195a4712e959f6ed6284e600486bc183f8184 (diff)
parent958c7e6cc1aff624bc76e0fd76c91a5388ffd9b2 (diff)
downloadgleam_aoc-59b7df9c12c40eeea7e4b4c03b02237e14d7a5f5.tar.gz
gleam_aoc-59b7df9c12c40eeea7e4b4c03b02237e14d7a5f5.zip
Merge branch 'main' of https://github.com/hunkyjimpjorps/AdventOfCode
-rw-r--r--aoc2018/day-03/day-03.rkt51
-rw-r--r--aoc2018/day-04/day-04.rkt43
2 files changed, 94 insertions, 0 deletions
diff --git a/aoc2018/day-03/day-03.rkt b/aoc2018/day-03/day-03.rkt
new file mode 100644
index 0000000..b486361
--- /dev/null
+++ b/aoc2018/day-03/day-03.rkt
@@ -0,0 +1,51 @@
+#lang racket
+
+(require advent-of-code
+ threading
+ data/applicative
+ data/monad
+ megaparsack
+ megaparsack/text)
+
+(struct claim (number start-x start-y size-x size-y) #:transparent)
+
+(define claim/p
+ (do (char/p #\#)
+ [number <- integer/p]
+ (string/p " @ ")
+ [start-x <- integer/p]
+ (char/p #\,)
+ [start-y <- integer/p]
+ (string/p ": ")
+ [size-x <- integer/p]
+ (char/p #\x)
+ [size-y <- integer/p]
+ (pure (claim number start-x start-y size-x size-y))))
+
+(define (parse-claim str)
+ (parse-result! (parse-string claim/p str)))
+
+(define (make-claim ht cl)
+ (for*/fold ([fabric ht])
+ ([x (in-range (claim-start-x cl) (+ (claim-start-x cl) (claim-size-x cl)))]
+ [y (in-range (claim-start-y cl) (+ (claim-start-y cl) (claim-size-y cl)))])
+ (hash-update fabric (cons x y) add1 0)))
+
+(define claims
+ (~> (port->lines (open-aoc-input (find-session) 2018 3 #:cache #true)) (map parse-claim _)))
+
+(define claimed-fabric
+ (for/fold ([fabric (hash)]) ([cl (in-list claims)])
+ (make-claim fabric cl)))
+
+;; part 1
+(for/sum ([claim-count (in-list (hash-values claimed-fabric))] #:when (< 1 claim-count)) 1)
+
+;; part 2
+(define (uncontested-claim? fabric cl)
+ (for*/and ([x (in-range (claim-start-x cl) (+ (claim-start-x cl) (claim-size-x cl)))]
+ [y (in-range (claim-start-y cl) (+ (claim-start-y cl) (claim-size-y cl)))])
+ (= 1 (hash-ref fabric (cons x y)))))
+
+(for/first ([cl (in-list claims)] #:when (uncontested-claim? claimed-fabric cl))
+ (claim-number cl))
diff --git a/aoc2018/day-04/day-04.rkt b/aoc2018/day-04/day-04.rkt
new file mode 100644
index 0000000..3660099
--- /dev/null
+++ b/aoc2018/day-04/day-04.rkt
@@ -0,0 +1,43 @@
+#lang racket
+
+(require advent-of-code
+ data/applicative
+ data/monad
+ megaparsack
+ megaparsack/text
+ threading)
+
+(struct entry (month day hour minute message) #:transparent)
+
+(define (parse-message chrs)
+ (define str (apply string chrs))
+ (match str
+ ["wakes up" 'awake]
+ ["falls asleep" 'asleep]
+ [shift (~> shift (string-trim "Guard #") (string-trim " begins shift") string->number)]))
+
+(define entry/p
+ (do (string/p "[1518-")
+ [month <- integer/p]
+ (char/p #\-)
+ [day <- integer/p]
+ space/p
+ [hour <- integer/p]
+ (char/p #\:)
+ [minute <- integer/p]
+ (string/p "] ")
+ [message <- (many/p any-char/p)]
+ (pure (entry month day hour minute (parse-message message)))))
+
+(define (parse-entry str)
+ (parse-result! (parse-string entry/p str)))
+
+(define entries
+ (~> (port->lines (open-aoc-input (find-session) 2018 4 #:cache #true)) (map parse-entry _)))
+
+(define sorted-entries
+ (~> entries
+ (sort < #:key entry-minute)
+ (sort < #:key entry-hour)
+ (sort < #:key entry-day)
+ (sort < #:key entry-month)))