From 10fd78b85ae5ba3b2cf6ab25c2795b95ab468084 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 14 Dec 2017 01:12:08 -0500 Subject: [PATCH] d14 s1 --- 2017/d14/main.rkt | 40 ++++++++++++++++++++++++++++++++++++++++ 2017/d14/star1.rkt | 2 ++ 2017/d14/test1.rkt | 2 ++ 3 files changed, 44 insertions(+) create mode 100644 2017/d14/main.rkt create mode 100644 2017/d14/star1.rkt create mode 100644 2017/d14/test1.rkt diff --git a/2017/d14/main.rkt b/2017/d14/main.rkt new file mode 100644 index 0000000..ec77cee --- /dev/null +++ b/2017/d14/main.rkt @@ -0,0 +1,40 @@ +#lang reader "../aoc-lang.rkt" +(require racket/sequence) +(provide (rename-out [#%mb #%module-begin])) + +(define-macro (#%mb (STARS) (STR) ...) + #`(#%module-begin + ((if (eq? 'STARS '★) one-star (λ (x) #f)) (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 (kh->ints kh) + (for*/list ([c (in-string kh)] + [num (in-value (string->number (string c) 16))] + [c (in-string (~r num #:base 2 #:min-width 4 #:pad-string "0"))]) + (string->number (string c)))) + +(define (knot-hash seed-str [range-in 256]) + (define ascii-chars (map char->integer (string->list seed-str))) + (define nums (reverse-segments range-in (append ascii-chars '(17 31 73 47 23)) #:reps 64)) + (define dense-hash (for/list ([vals (in-slice 16 nums)]) + (apply bitwise-xor vals))) + (string-append* (for/list ([num (in-list dense-hash)]) + (~r num #:base 16 #:min-width 2 #:pad-string "0")))) + +(define (reverse-segments range-in lens #:reps [reps 1]) + (define vec (list->vector (range range-in))) + (for*/fold ([current-position 0] + [skip-size 0]) + ([rep (in-range reps)] + [len (in-list lens)]) + (define posns (for/list ([i (in-range len)]) + (modulo (+ current-position i) range-in))) + (for ([val (in-list (map (curry vector-ref vec) posns))] + [posn (in-list (reverse posns))]) + (vector-set! vec posn val)) + (values (+ current-position len skip-size) (add1 skip-size))) + (vector->list vec)) \ No newline at end of file diff --git a/2017/d14/star1.rkt b/2017/d14/star1.rkt new file mode 100644 index 0000000..a05101d --- /dev/null +++ b/2017/d14/star1.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★ ; 8214 +hxtvlmkl \ No newline at end of file diff --git a/2017/d14/test1.rkt b/2017/d14/test1.rkt new file mode 100644 index 0000000..e2d998e --- /dev/null +++ b/2017/d14/test1.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★ ; 8108 +flqrgnkx \ No newline at end of file