aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--2020/day-05/day-05.rkt44
-rw-r--r--2021/day-09/day-09.bak60
-rw-r--r--2021/day-10/day-10.rkt61
4 files changed, 109 insertions, 60 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a9ebf66
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.elixir_ls/*
+.cache/*
+*.bak
+input \ No newline at end of file
diff --git a/2020/day-05/day-05.rkt b/2020/day-05/day-05.rkt
new file mode 100644
index 0000000..93c54a2
--- /dev/null
+++ b/2020/day-05/day-05.rkt
@@ -0,0 +1,44 @@
+#lang racket
+(require "../../jj-aoc.rkt"
+ threading
+ algorithms)
+
+(define tickets
+ (for/list
+ ([l (in-lines (open-day 5 2020))])
+ (~>> l
+ (regexp-match #px"(.{7})(.{3})" )
+ rest)))
+
+(define (find-place str min-p max-p l r)
+ (if (string=? "" str)
+ min-p
+ (let ([p-range (/ (add1 (- max-p min-p)) 2)]
+ [c (substring str 0 1)])
+ (cond
+ [(string=? c l)
+ (find-place (substring str 1) min-p (- max-p p-range) l r)]
+ [(string=? c r)
+ (find-place (substring str 1) (+ min-p p-range) max-p l r)]))))
+
+(define (find-row str) (find-place str 0 127 "F" "B"))
+(define (find-col str) (find-place str 0 7 "L" "R"))
+
+(define (ticket-id t)
+ (let ([row (find-row (first t))]
+ [col (find-col (second t))])
+ (+ col (* 8 row))))
+
+;; part 1
+(define occupied-seats
+ (~>> (for/list ([t (in-list tickets)]) (ticket-id t))))
+
+(apply max occupied-seats)
+
+;; part 2
+(set-first
+ (set-subtract (list->set (inclusive-range (apply min occupied-seats)
+ (apply max occupied-seats)))
+ (list->set occupied-seats)))
+
+
diff --git a/2021/day-09/day-09.bak b/2021/day-09/day-09.bak
deleted file mode 100644
index 11ef8e6..0000000
--- a/2021/day-09/day-09.bak
+++ /dev/null
@@ -1,60 +0,0 @@
-#lang racket
-
-(require threading
- "../jj-aoc.rkt")
-
-(define data
- (for/vector ([l (in-lines (open-day 9))]
- #:unless (equal? l ""))
- (~>> l
- string->list
- (map (λ~>> ~a string->number))
- list->vector)))
-
-(define max-rows (vector-length data))
-(define max-cols (vector-length (vector-ref data 0)))
-(define-values (min-rows min-cols) (values 0 0))
-
-(define (vector2d-ref vec coord)
- (match-define `(,r ,c) coord)
- (~> vec
- (vector-ref r)
- (vector-ref c)))
-
-(define (adjacent coords)
- (match-define `(,r ,c) coords)
- `((,(add1 r) ,c)
- (,(sub1 r) ,c)
- (,r ,(add1 c))
- (,r ,(sub1 c))))
-
-(define (valid-coordinate coord)
- (match-define `(,r ,c) coord)
- (and (>= r min-rows)
- (< r max-rows)
- (>= c min-cols)
- (< c max-cols)))
-
-(define (check-adjacent vec coord)
- (define x (vector2d-ref vec coord))
- (for*/and ([neighbor (in-list (adjacent coord))]
- #:when (valid-coordinate neighbor))
- (x . < . (vector2d-ref vec neighbor))))
-
-;; part 1
-(for*/sum ([r (in-range min-rows max-rows)]
- [c (in-range min-cols max-cols)]
- [x (in-value (vector2d-ref data `(,r ,c)))]
- #:when (check-adjacent data `(,r ,c)))
- (add1 x))
-
-;; part 2
-(define visited (make-hash))
-(define (flood-fill vec coord)
- (if (and (< (vector2d-ref vec coord) 9)
- (not (hash-has-key? visited coord)))
- ((hash-set! visited coord 'visited)
- (add1 (for/sum [(neighbor (in-list (adjacent coord)))
- #:when (valid-coordinate neighbor)]
- (flood-fill vec neighbor))))
- 0)) \ No newline at end of file
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