Learning Racket. Day 1 and 2 of AOC2021
commit
81ed00b49a
@ -0,0 +1,48 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
(define test-data (list
|
||||||
|
199
|
||||||
|
200
|
||||||
|
208
|
||||||
|
210
|
||||||
|
200
|
||||||
|
207
|
||||||
|
240
|
||||||
|
269
|
||||||
|
260
|
||||||
|
263
|
||||||
|
))
|
||||||
|
|
||||||
|
; part 1
|
||||||
|
(define (sum data)
|
||||||
|
(cdr
|
||||||
|
(foldl (λ (el acc)
|
||||||
|
(let ([prev (car acc)]
|
||||||
|
[total (cdr acc)])
|
||||||
|
(if (> el prev)
|
||||||
|
(cons el (+ 1 total))
|
||||||
|
(cons el total))))
|
||||||
|
(cons (car data) 0)
|
||||||
|
data)))
|
||||||
|
|
||||||
|
(define part1 (sum test-data))
|
||||||
|
|
||||||
|
; part 2
|
||||||
|
; fold over the data
|
||||||
|
; initial value will be a pair of 2 lists
|
||||||
|
; first list is the original list, 2nd is the new sliding window
|
||||||
|
(define sliding-window
|
||||||
|
(reverse
|
||||||
|
(cdr
|
||||||
|
(foldl (λ (el acc)
|
||||||
|
;(writeln acc) ; debug
|
||||||
|
(let ([orig (car acc)] ; grab the rest of the original list from the accumulator
|
||||||
|
[window (cdr acc)] ; grab the window list that we have so far
|
||||||
|
[one (car (car acc))] ; first element of original list
|
||||||
|
[two (car (rest (car acc)))]
|
||||||
|
[three (car (rest (rest (car acc))))])
|
||||||
|
(cons (rest orig) (cons (+ one two three) window)))) ; return a pair - first elem is the new window list. 2nd elem is the rest of the original list
|
||||||
|
(cons (append test-data (list 0 0)) empty) ; start with an empty window list an the original list. add 2 0s at the end to cheat
|
||||||
|
test-data))))
|
||||||
|
|
||||||
|
(define part2 (sum sliding-window))
|
@ -0,0 +1,40 @@
|
|||||||
|
#lang racket
|
||||||
|
|
||||||
|
(define file "day2.txt")
|
||||||
|
|
||||||
|
(define lines (file->lines file))
|
||||||
|
|
||||||
|
(define steps (map string-split lines))
|
||||||
|
|
||||||
|
; part 1
|
||||||
|
|
||||||
|
(define (modify-position step position)
|
||||||
|
; (writeln position)
|
||||||
|
(let ([instruction (car step)]
|
||||||
|
[magnitude (string->number (second step))]
|
||||||
|
[forwardness (car position)]
|
||||||
|
[depth (cdr position)])
|
||||||
|
(cond [(equal? instruction "forward") (cons (+ forwardness magnitude) depth)]
|
||||||
|
[(equal? instruction "up") (cons forwardness (- depth magnitude))]
|
||||||
|
[(equal? instruction "down") (cons forwardness (+ depth magnitude))])))
|
||||||
|
|
||||||
|
(define position (foldl modify-position (cons 0 0) steps)) ; (forwardness, depth)
|
||||||
|
|
||||||
|
(define part1 (* (car position) (cdr position)))
|
||||||
|
|
||||||
|
; part 2
|
||||||
|
|
||||||
|
(define (modify-position2 step position)
|
||||||
|
; (writeln position)
|
||||||
|
(let ([instruction (first step)]
|
||||||
|
[magnitude (string->number (second step))]
|
||||||
|
[forwardness (first position)]
|
||||||
|
[depth (second position)]
|
||||||
|
[aim (third position)])
|
||||||
|
(cond [(equal? instruction "forward") (list (+ forwardness magnitude) (+ depth (* aim magnitude)) aim)]
|
||||||
|
[(equal? instruction "up") (list forwardness depth (- aim magnitude))]
|
||||||
|
[(equal? instruction "down") (list forwardness depth (+ aim magnitude))])))
|
||||||
|
|
||||||
|
(define position2 (foldl modify-position2 (list 0 0 0) steps)) ; (forwardness, depth, aim)
|
||||||
|
|
||||||
|
(define part2 (* (first position2) (second position2)))
|
@ -0,0 +1,6 @@
|
|||||||
|
forward 5
|
||||||
|
down 5
|
||||||
|
forward 8
|
||||||
|
up 3
|
||||||
|
down 8
|
||||||
|
forward 2
|
Loading…
Reference in New Issue