1
0
Fork 0
This commit is contained in:
Jonathan Chan 2019-12-16 22:09:34 -08:00
parent 29af3fa2b2
commit 9548612f61
4 changed files with 57 additions and 4 deletions

1
input/17.txt Normal file

File diff suppressed because one or more lines are too long

View File

@ -142,8 +142,8 @@
(if (negative? n) 0 n)) (if (negative? n) 0 n))
;; % : number -> number -> number ;; % : number -> number -> number
(define (% d) (define %
(λ (n) (remainder n d))) ( (λ (d n) (remainder n d))))
;; number->digits-reverse : number -> (listof number) ;; number->digits-reverse : number -> (listof number)
;; Return the digits of the given number in reverse order (i.e. RTL) ;; Return the digits of the given number in reverse order (i.e. RTL)
@ -199,7 +199,8 @@
;; repeat : number -> (listof any) -> (listof any) ;; repeat : number -> (listof any) -> (listof any)
(define (repeat m lst) (define (repeat m lst)
(apply append (make-list m lst))) (if (zero? m) '()
(append lst (repeat (sub1 m) lst))))
;; chunks-of : (listof any) -> nonzero? -> (listof (listof any)) ;; chunks-of : (listof any) -> nonzero? -> (listof (listof any))
;; Partitions a list into lists of the given size in order, ;; Partitions a list into lists of the given size in order,

View File

@ -35,7 +35,12 @@
(loop (fft signal) (add1 count))))) (loop (fft signal) (add1 count)))))
(define (fft-half ns) (define (fft-half ns)
(map ( (% 10) abs) (reverse (scanr + 0 ns)))) (second
(foldr (λ (v acc)
(match-let ([(list sum lst) acc])
(let ([sum (+ v sum)])
(list sum (cons (% 10 (abs sum)) lst)))))
(list 0 '(0)) ns)))
(define (part2) (define (part2)
(let* ([offset (digits->number (take input 7))] (let* ([offset (digits->number (take input 7))]

46
src/17.rkt Normal file
View File

@ -0,0 +1,46 @@
#lang racket
(require "../lib.rkt"
"IntCode.rkt")
(define input
(string->program (car (problem-input 17))))
(define scaffolds
(string-trim (list->string (map integer->char (resume-with-io (exec input) '())))))
(define part1
(let* ([list-grid (map string->list (string-split scaffolds "\n"))]
[vector-grid (list->vector (map list->vector list-grid))]
[width (length (car list-grid))]
[height (length list-grid)])
(foldl (λ (xy sum)
(match-let ([(list x y) xy])
(if (and (char=? #\# (vector-ref (vector-ref vector-grid (add1 y)) x))
(char=? #\# (vector-ref (vector-ref vector-grid (sub1 y)) x))
(char=? #\# (vector-ref (vector-ref vector-grid y) (add1 x)))
(char=? #\# (vector-ref (vector-ref vector-grid y) (sub1 x))))
(+ sum (* x y))
sum)))
0 (cartesian-product (range 1 (sub1 width)) (range 1 (sub1 height))))))
;; I did this manually. sue me
(define A "L,10,R,10,L,10,L,10\n")
(define B "R,10,R,12,L,12\n")
(define C "R,12,L,12,R,6\n")
(define main "A,B,A,B,C,C,B,A,B,C\n")
(define part2
(let* ([program (vector-set!* input 0 2)]
[input (append (map char->integer (string->list main))
(map char->integer (string->list A))
(map char->integer (string->list B))
(map char->integer (string->list C))
(map char->integer (string->list "n\n")))]
[output (resume-with-io (exec program) input)]
[map-list (take output (sub1 (length output)))]
[map-string (list->string (map integer->char map-list))])
(display map-string)
(last output)))
(show-solution part1 part2)