diff options
author | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
---|---|---|
committer | H.J <thechairman@thechairman.info> | 2024-10-09 11:36:55 -0400 |
commit | 8777ff071f7bb37631baa7b6717ad29961e50911 (patch) | |
tree | 6d59c4ed58e454b960339c3d1151f0a879e8d7cb /racket/aoc2018/day-03/day-03.rkt | |
parent | 6156a9ef7be4012063a042aafb4e9b0d7eadde8e (diff) | |
download | gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.tar.gz gleam_aoc-8777ff071f7bb37631baa7b6717ad29961e50911.zip |
sorting by language
Diffstat (limited to 'racket/aoc2018/day-03/day-03.rkt')
-rw-r--r-- | racket/aoc2018/day-03/day-03.rkt | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/racket/aoc2018/day-03/day-03.rkt b/racket/aoc2018/day-03/day-03.rkt new file mode 100644 index 0000000..b486361 --- /dev/null +++ b/racket/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)) |