You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
aoc-racket/day7foo.rkt

45 lines
1.6 KiB
Racket

#lang racket
(require racket rackunit
(for-syntax racket/base racket/file racket/string))
(define-syntax (convert-input-to-wire-functions stx)
(syntax-case stx ()
[(_)
(let* ([input-strings (file->lines "day7-input.txt")]
[wire-strings (map (λ(str) (format "(wire ~a)" str)) input-strings)]
[wire-datums (map (compose1 read open-input-string) wire-strings)])
(datum->syntax stx `(begin ,@wire-datums)))]))
(define-syntax (wire stx)
(syntax-case stx (->)
[(_ arg -> id)
#'(define (id) (get-val arg))]
[(_ op arg -> id)
#'(define (id) (op (get-val arg)))]
[(_ arg1 op arg2 -> id)
#'(define (id) (op (get-val arg1) (get-val arg2)))]
[(_ expr) #'(begin expr)]
[else #'(void)]))
(convert-input-to-wire-functions)
(require sugar/debug)
(define wire-value-cache (make-hash))
(define (get-val x)
(report x)
(if (number? x) #t #f))
(define (16bitize x)
(define 16bit-max (expt 2 16))
(define r (modulo x 16bit-max))
(if (negative? r)
(16bitize (+ 16bit-max r))
r))
(define-syntax-rule (define-16bit id proc) (define id (compose1 16bitize proc)))
(define-16bit AND bitwise-and)
(define-16bit OR bitwise-ior)
(define-16bit LSHIFT arithmetic-shift)
(define-16bit RSHIFT (λ(x y) (arithmetic-shift x (- y))))
(define-16bit NOT bitwise-not)