Skip to content

Instantly share code, notes, and snippets.

@qookei
Created December 7, 2024 15:32
Show Gist options
  • Save qookei/db8cb864c597c94b2961b7cf4870079c to your computer and use it in GitHub Desktop.
Save qookei/db8cb864c597c94b2961b7cf4870079c to your computer and use it in GitHub Desktop.
(use-modules (srfi srfi-1) (ice-9 textual-ports) (ice-9 peg)
(ice-9 pretty-print) (srfi srfi-26) (ice-9 receive))
(define-peg-string-patterns
"entry <-- number COLON (SPACE number)+ NL
number <-- [0-9]+
COLON < ':'
SPACE < ' '
NL < '\n'
")
(define-peg-pattern top all (peg "entry* !."))
(define (%process-number number)
(string->number (cadr number)))
(define (%process-entry entry)
(cons (%process-number (cadr entry))
(map %process-number (caddr entry))))
(define (process-tree tree)
(map %process-entry (cdr tree)))
(define (try-next target operators acc remaining)
(any (cut try target operators acc <> remaining)
operators))
(define (try target operators acc op remaining)
(if (null? remaining)
(eqv? acc target)
(let ([new-acc (op acc (car remaining))])
(if (> new-acc target)
;; Bail out if we're not done and we're over the target
#f
(try-next target operators new-acc (cdr remaining))))))
(define (|| a b)
(+ (* a (integer-expt 10 (inexact->exact (ceiling (log10 b)))))
b))
(define +part-1-operators+ (list + *))
(define +part-2-operators+ (list + * ||))
(define (calibration-sum operators entries)
(fold
+ 0
(map
(λ (entry)
(if (try-next (car entry)
operators
(cadr entry)
(cddr entry))
(car entry)
0))
entries)))
(let* ([input (get-string-all (current-input-port))]
[peg-tree (peg:tree (match-pattern top input))]
[entries (process-tree peg-tree)])
(pretty-print (calibration-sum +part-1-operators+ entries))
(pretty-print (calibration-sum +part-2-operators+ entries)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment