Skip to content

Instantly share code, notes, and snippets.

@qookei
Last active December 7, 2024 16:18
Show Gist options
  • Save qookei/4088b4d4fe11e930c825ee0d6ebc0520 to your computer and use it in GitHub Desktop.
Save qookei/4088b4d4fe11e930c825ee0d6ebc0520 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 (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