90 lines
2.5 KiB
Racket
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"))
|