Skip to content

Instantly share code, notes, and snippets.

@qookei
Created December 3, 2024 22:10
Show Gist options
  • Save qookei/413f63940e5b20102dc4616712c55f4a to your computer and use it in GitHub Desktop.
Save qookei/413f63940e5b20102dc4616712c55f4a to your computer and use it in GitHub Desktop.
(use-modules (srfi srfi-1) (ice-9 textual-ports) (ice-9 peg)
(ice-9 match) (ice-9 pretty-print) (srfi srfi-26))
(define-peg-string-patterns
"insn <- (mul / dont / do)
mul <-- MUL number COMMA number RPAREN
dont <-- 'don' ['] 't()'
do <-- 'do()'
number <-- [0-9]+
junk < (!insn .)*
MUL < 'mul('
RPAREN < ')'
COMMA < ','
NL < '\n'
")
(define-peg-pattern top all (peg "junk? (insn junk?)+ !."))
(define (%parse-item item)
(match item
[('mul ('number a) ('number b))
(list (string->number a) (string->number b))]
[('do _) '(0 0)]
[('dont _) '(0 0)]))
(define (p1-tree tree)
(map %parse-item (cdr tree)))
(define (p2-tree tree)
(let next ([acc '()]
[enabled #t]
[rest (cdr tree)])
(if (null? rest)
acc
(next (cons
(if enabled
(%parse-item (car rest))
'(0 0))
acc)
(cond
[(eq? (caar rest) 'do) #t]
[(eq? (caar rest) 'dont) #f]
[else enabled])
(cdr rest)))))
(define (sum-muls tree)
(fold + 0 (map (cut apply * <>) tree)))
(let* ([input (get-string-all (current-input-port))]
[peg-tree (peg:tree (match-pattern top input))])
(pretty-print (sum-muls (p1-tree peg-tree)))
(pretty-print (sum-muls (p2-tree peg-tree))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment