2021/src/24.rkt

81 lines
2.6 KiB
Racket

#lang racket
(require "../lib.rkt")
(define input
(for/list ([line (problem-input 24)])
(match (string-words line)
[`(,instr ,var) (list (string->symbol instr) (string->symbol var))]
[`(,instr ,var ,val)
(list (string->symbol instr)
(string->symbol var)
(or (string->number val)
(string->symbol val)))])))
(define (monad model)
(define (get state val)
(if (number? val) val (hash-ref state val)))
(define (monad model state instrs)
(if (empty? instrs)
(hash-ref state 'z)
(match (first instrs)
[`(inp ,var)
(monad (rest model)
(hash-set state var (first model))
(rest instrs))]
[`(add ,var ,val)
(monad model
(hash-set state var
(+ (hash-ref state var)
(get state val)))
(rest instrs))]
[`(mul ,var ,val)
(monad model
(hash-set state var
(* (hash-ref state var)
(get state val)))
(rest instrs))]
[`(div ,var ,val)
(monad model
(hash-set state var
(quotient (hash-ref state var)
(get state val)))
(rest instrs))]
[`(mod ,var ,val)
(monad model
(hash-set state var
(remainder (hash-ref state var)
(get state val)))
(rest instrs))]
[`(eql ,var ,val)
(monad model
(hash-set state var
(if (= (hash-ref state var)
(get state val))
1 0))
(rest instrs))])))
(monad model (hash 'w 0 'x 0 'y 0 'z 0) input))
(define As '(14 10 13 -8 11 11 14 -11 14 -1 -8 -5 -16 -6))
(define Bs '(12 9 8 3 0 11 10 13 3 10 10 14 6 5))
(define (monad* model)
(for/fold ([z 0])
([w model]
[A As]
[B Bs])
(define x (if (= w (- (remainder z 26) A)) 0 1))
(+ (* x (+ w B))
(* (add1 (* x 25))
(quotient z (if (positive? A) 1 26))))))
(define part1
(let loop ([model 99999999999999])
(define model* (number->digits model))
(if (member 0 model*)
(loop (sub1 model))
(if (zero? (monad* model*))
model
(loop (sub1 model))))))
(show-solution #f #f)