From c7ce78ff383137742de55ad86e1d4b660b3f1651 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Fri, 15 Dec 2017 01:32:23 -0500 Subject: [PATCH] d14 s2 --- 2017/d14/main.rkt | 23 +++++++++++++++++++++-- 2017/d14/star2.rkt | 2 ++ 2017/d14/test2.rkt | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 2017/d14/star2.rkt create mode 100644 2017/d14/test2.rkt diff --git a/2017/d14/main.rkt b/2017/d14/main.rkt index ec77cee..15a7383 100644 --- a/2017/d14/main.rkt +++ b/2017/d14/main.rkt @@ -1,16 +1,35 @@ #lang reader "../aoc-lang.rkt" -(require racket/sequence) +(require racket/sequence sugar/list) (provide (rename-out [#%mb #%module-begin])) (define-macro (#%mb (STARS) (STR) ...) #`(#%module-begin - ((if (eq? 'STARS '★) one-star (λ (x) #f)) (format "~a" 'STR)) ...)) + ((if (eq? 'STARS '★) one-star two-star) (format "~a" 'STR)) ...)) (define (one-star str) (for*/sum ([i (in-range 128)] [digit (in-list (kh->ints (knot-hash (format "~a-~a" str i))))]) digit)) +(define (two-star str) + (define vec (for*/vector ([i (in-range 128)] + [int (in-list (kh->ints (knot-hash (format "~a-~a" str i))))]) + (if (= int 1) "#" "."))) + (define (at-left-edge? idx) (= (modulo idx 128) 0)) + (define (at-right-edge? idx) (= (modulo idx 128) 127)) + (for/fold ([region 0]) + ([(val idx) (in-indexed vec)] + #:unless (number? val)) + (let loop ([idx idx]) + (cond + [(and (< -1 idx (vector-length vec)) (equal? (vector-ref vec idx) "#")) + (vector-set! vec idx region) + (unless (at-left-edge? idx) (loop (sub1 idx))) + (unless (at-right-edge? idx) (loop (add1 idx))) + (map loop (list (+ idx 128) (- idx 128))) + (add1 region)] + [else region])))) + (define (kh->ints kh) (for*/list ([c (in-string kh)] [num (in-value (string->number (string c) 16))] diff --git a/2017/d14/star2.rkt b/2017/d14/star2.rkt new file mode 100644 index 0000000..61585f0 --- /dev/null +++ b/2017/d14/star2.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★★ ; 1093 +hxtvlmkl \ No newline at end of file diff --git a/2017/d14/test2.rkt b/2017/d14/test2.rkt new file mode 100644 index 0000000..30c9f4b --- /dev/null +++ b/2017/d14/test2.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★★ ; 1242 +flqrgnkx \ No newline at end of file