Created
December 7, 2024 15:32
-
-
Save qookei/db8cb864c597c94b2961b7cf4870079c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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