Last active
December 7, 2024 16:18
-
-
Save qookei/4088b4d4fe11e930c825ee0d6ebc0520 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 (10**digits x) | |
(integer-expt 10 (inexact->exact (ceiling (log10 x))))) | |
(define (try target factors part-2?) | |
(cond | |
[(< target 0) #f] | |
[(null? (cdr factors)) | |
(eqv? target (car factors))] | |
[else | |
(or (and part-2? | |
(eqv? (car factors) | |
(remainder | |
target | |
(10**digits (car factors)))) | |
(try (quotient target (10**digits (car factors))) (cdr factors) part-2?)) | |
(and (eqv? 0 (remainder | |
target | |
(car factors))) | |
(try (quotient target (car factors)) (cdr factors) part-2?)) | |
(try (- target (car factors)) (cdr factors) part-2?))])) | |
(define (calibration-sum part-2? entries) | |
(fold | |
+ 0 | |
(map | |
(λ (entry) | |
(if (try (car entry) | |
(reverse (cdr entry)) | |
part-2?) | |
(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 #f entries)) | |
(pretty-print (calibration-sum #t entries))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment