Skip to content

Instantly share code, notes, and snippets.

@qookei
Created December 5, 2024 12:55
Show Gist options
  • Save qookei/571e7930ca44ecc3ec8e8b1bd497cf12 to your computer and use it in GitHub Desktop.
Save qookei/571e7930ca44ecc3ec8e8b1bd497cf12 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
"order <-- number PIPE number NL
update <-- (number COMMA?)* NL
number <-- [0-9]+
PIPE < '|'
COMMA < ','
NL < '\n'
")
(define-peg-pattern top all (peg "order* NL update* !."))
(define (%process-number number)
(string->number (cadr number)))
(define (%process-order order)
(map (λ (item)
(cons (%process-number (cadr item))
(%process-number (caddr item))))
order))
(define (%process-update update)
(map %process-number (cdr update)))
(define (%process-updates updates)
(map %process-update updates))
(define (process-tree tree)
(list (%process-order (cadr tree))
(%process-updates (caddr tree))))
(define (sum-updates updates)
(fold (λ (update acc)
(+ acc
(car (drop update (floor (/ (length update) 2))))
0))
0
updates))
(define (make-order< order)
(λ (a b)
(let* ([this-order (filter (λ (x) (eq? (car x) a)) order)]
[this-greater (map cdr this-order)])
(any (cut eq? b <>) this-greater))))
(let* ([input (get-string-all (current-input-port))]
[peg-tree (peg:tree (match-pattern top input))]
[post-tree (process-tree peg-tree)]
[updates (cadr post-tree)]
[order< (make-order< (car post-tree))])
(receive [good bad]
(partition (cut sorted? <> order<) updates)
(pretty-print (sum-updates good))
(pretty-print (sum-updates (map (cut sort <> order<) bad)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment