aoc2020/11.rkt

90 lines
2.5 KiB
Racket

#lang curly-fn racket
(require "scripts/aoc.rkt")
;; solution for day 11
;; helper functions here
(define (count-adj input x y)
(for*/sum ([dx (in-range (sub1 x) (+ 2 x))] [dy (in-range (sub1 y) (+ 2 y))]
#:unless (and (= dx x) (= dy y))
#:unless (or (< dx 0) (< dy 0) (>= dx (vector-length (vector-ref input 0)))
(>= dy (vector-length input))))
(if (equal? 'full (vector-ref (vector-ref input dy) dx))
1
0)))
(define (simulate input count-adj max-adj)
(for/vector ([yv (in-vector input)] [y (in-naturals)])
(for/vector ([xv (in-vector yv)] [x (in-naturals)])
(define ct (count-adj input x y))
(cond
[(and (equal? xv 'full) (>= ct max-adj)) 'empty]
[(and (equal? xv 'empty) (zero? ct)) 'full]
[else xv]))))
(define (part1 input)
(define next (simulate input count-adj 4))
(if (equal? input next)
(for*/sum ([line (in-vector next)] [val (in-vector line)] #:when (equal? val 'full)) 1)
(part1 next)))
(define (count-adj2 input x y)
(define (find-first sx sy dx dy)
(cond
[(or (< sx 0) (< sy 0) (>= sy (vector-length input))
(>= sx (vector-length (vector-ref input 0))))
#f]
[else
(define v (vector-ref (vector-ref input sy) sx))
(if v
v
(find-first (+ sx dx) (+ sy dy) dx dy))]))
(for/sum ([searches (in-list '((1 1) (1 0) (1 -1)
(0 1) (0 -1)
(-1 1) (-1 0) (-1 -1)))])
(define dx (first searches))
(define dy (second searches))
(if (equal? 'full (find-first (+ dx x) (+ dy y) (first searches) (second searches)))
1
0)))
(define (part2 input)
(define next (simulate input count-adj2 5))
(if (equal? input next)
(for*/sum ([line (in-vector next)] [val (in-vector line)] #:when (equal? val 'full)) 1)
(part2 next)))
(module+ test
(require rackunit)
;; tests here
(displayln "no tests :("))
(define (parse file)
(for/vector ([line (in-list (file->lines file))])
(for/vector ([chr (in-string line)])
(match chr
[#\. #f]
[#\L 'empty]
[#\# 'full]))))
; (define test (parse "test"))
; (define meow (simulate test count-adj2 5))
; (define meow2 (simulate meow count-adj2 5))
; (define meow3 (simulate meow2 count-adj2 5))
; (pretty-write meow3)
(module+ main
(define input (parse "inputs/11"))
;; part 1
(answer 11 1 (part1 input))
;; part 2
(answer 11 2 (part2 input))
(displayln "meow"))