diff --git a/3/GNUmakefile b/3/GNUmakefile new file mode 100644 index 0000000..eed98a1 --- /dev/null +++ b/3/GNUmakefile @@ -0,0 +1,2 @@ +# -*- makefile-gmake -*- +include ../gnu.mk diff --git a/3/main.scm b/3/main.scm new file mode 100644 index 0000000..5eba1bb --- /dev/null +++ b/3/main.scm @@ -0,0 +1,31 @@ +(import (scheme base) + (scheme char) + (scheme cxr) + (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))) diff --git a/3/makefile b/3/makefile new file mode 100644 index 0000000..116f73a --- /dev/null +++ b/3/makefile @@ -0,0 +1,4 @@ +# -*- makefile-bsdmake -*- +# Disable Skint because no numerical tower +SCHEMES=chibi chicken gauche guile racket sagittarius +.include "../common.mk"