(import (scheme base) (scheme char) (scheme file) (scheme process-context) (scheme write)) (define (max-joltage line batteries) (let ((lst (map digit-value (string->list line)))) (let loop ((req-tail-length (- batteries 1)) (lst lst) (sum 0)) (if (negative? req-tail-length) sum ;; this is O^one million at least (let ((m (memq (apply max (reverse (list-tail (reverse lst) req-tail-length))) lst))) (loop (- req-tail-length 1) (cdr m) (+ (* sum 10) (car m)))))))) (define (part file batteries) (with-input-from-file file (lambda () (let loop ((line (read-line)) (sum 0)) (if (eof-object? line) (begin (display (number->string sum)) (newline)) (loop (read-line) (+ sum (max-joltage line batteries)))))))) (for-each (lambda (file) (part file 2)) (cdr (command-line))) (for-each (lambda (file) (part file 12)) (cdr (command-line)))