day 17: awful submission lol
This commit is contained in:
parent
dc4fb90f08
commit
61f870ddac
|
@ -0,0 +1,98 @@
|
|||
#lang curly-fn racket
|
||||
|
||||
(require "scripts/aoc.rkt")
|
||||
|
||||
;; solution for day 17
|
||||
|
||||
(struct pt [x y z w] #:transparent)
|
||||
|
||||
(define (part1 input)
|
||||
(define world (hash-copy input))
|
||||
(define (simulate world)
|
||||
(define new-world (make-hash))
|
||||
(define min-x (apply min (map pt-x (hash-keys world))))
|
||||
(define max-x (apply max (map pt-x (hash-keys world))))
|
||||
(define min-y (apply min (map pt-y (hash-keys world))))
|
||||
(define max-y (apply max (map pt-y (hash-keys world))))
|
||||
(define min-z (apply min (map pt-z (hash-keys world))))
|
||||
(define max-z (apply max (map pt-z (hash-keys world))))
|
||||
(for* ([x (in-range (- min-x 1) (+ max-x 2))]
|
||||
[y (in-range (- min-y 1) (+ max-y 2))]
|
||||
[z (in-range (- min-z 1) (+ max-z 2))])
|
||||
(define ct (for*/sum ([dx (in-range -1 2)]
|
||||
[dy (in-range -1 2)]
|
||||
[dz (in-range -1 2)]
|
||||
#:unless (and (zero? dx) (zero? dy) (zero? dz))
|
||||
#:when (hash-ref world (pt (+ x dx) (+ y dy) (+ z dz) 0) #f))
|
||||
1))
|
||||
(define this (pt x y z 0))
|
||||
(cond
|
||||
[(hash-ref world this #f)
|
||||
(when (or (= 2 ct) (= 3 ct))
|
||||
(hash-set! new-world this #t))]
|
||||
[else
|
||||
(when (= 3 ct)
|
||||
(hash-set! new-world this #t))]))
|
||||
new-world)
|
||||
|
||||
(for ([i (in-range 6)])
|
||||
(set! world (simulate world)))
|
||||
(length (filter identity (hash-values world))))
|
||||
|
||||
(define (part2 input)
|
||||
(define world (hash-copy input))
|
||||
(define (simulate world)
|
||||
(define new-world (make-hash))
|
||||
(define min-x (apply min (map pt-x (hash-keys world))))
|
||||
(define max-x (apply max (map pt-x (hash-keys world))))
|
||||
(define min-y (apply min (map pt-y (hash-keys world))))
|
||||
(define max-y (apply max (map pt-y (hash-keys world))))
|
||||
(define min-z (apply min (map pt-z (hash-keys world))))
|
||||
(define max-z (apply max (map pt-z (hash-keys world))))
|
||||
(define min-w (apply min (map pt-w (hash-keys world))))
|
||||
(define max-w (apply max (map pt-w (hash-keys world))))
|
||||
(for* ([x (in-range (- min-x 1) (+ max-x 2))]
|
||||
[y (in-range (- min-y 1) (+ max-y 2))]
|
||||
[z (in-range (- min-z 1) (+ max-z 2))]
|
||||
[w (in-range (- min-w 1) (+ max-w 2))])
|
||||
(define ct (for*/sum ([dx (in-range -1 2)]
|
||||
[dy (in-range -1 2)]
|
||||
[dz (in-range -1 2)]
|
||||
[dw (in-range -1 2)]
|
||||
#:unless (and (zero? dx) (zero? dy) (zero? dz) (zero? dw))
|
||||
#:when (hash-ref world (pt (+ x dx) (+ y dy) (+ z dz) (+ w dw)) #f))
|
||||
1))
|
||||
(define this (pt x y z w))
|
||||
(cond
|
||||
[(hash-ref world this #f)
|
||||
(when (or (= 2 ct) (= 3 ct))
|
||||
(hash-set! new-world this #t))]
|
||||
[else
|
||||
(when (= 3 ct)
|
||||
(hash-set! new-world this #t))]))
|
||||
new-world)
|
||||
|
||||
(for ([i (in-range 6)])
|
||||
(set! world (simulate world)))
|
||||
(length (filter identity (hash-values world))))
|
||||
|
||||
;; parse input file
|
||||
(define (parse fname)
|
||||
(define input (file->lines fname))
|
||||
(define world (make-hash))
|
||||
(for ([line (in-list input)] [y (in-naturals)])
|
||||
(for ([char (in-string line)] [x (in-naturals)])
|
||||
(when (char=? #\# char)
|
||||
(hash-set! world (pt x y 0 0) #t))))
|
||||
world)
|
||||
|
||||
(module+ test
|
||||
(require rackunit)
|
||||
;; tests here
|
||||
(displayln "no tests :("))
|
||||
|
||||
(module+ main
|
||||
(define input (parse "inputs/17"))
|
||||
(answer 17 1 (time (part1 input)))
|
||||
(answer 17 2 (time (part2 input)))
|
||||
(displayln "meow"))
|
Loading…
Reference in New Issue