diff --git a/day01-easy/main.scm b/day01-easy/main.scm index a2e49e7..83b2d07 100755 --- a/day01-easy/main.scm +++ b/day01-easy/main.scm @@ -10,51 +10,46 @@ '() (cons line (loop (read-line)))))) -(define (reduce-right reducer initial list) - (if - (null? list) - initial - (reducer (car list) (reduce-right reducer initial (cdr list))))) +(define (id value) value) -(define (map mapper list) +(define (compose result-transformer f argument-transformer) + (lambda (value) + (result-transformer (f (argument-transformer value))))) + +(define Y (lambda (f) (f (lambda (x) ((Y f) x))))) + +(define (reduce-right reducer initial) (Y + (lambda (f) (lambda (list) + (if (null? list) initial (reducer (car list) (f (cdr list)))))))) + +(define (map mapper) (reduce-right (lambda (current accumulator) (cons (mapper current) accumulator)) - '() - list)) + '())) -(define (combine combiner a b) - (if (null? a) b (if (null? b) a (combiner a b)))) +(define (combine combiner) + (lambda (a b) (if (null? a) b (if (null? b) a (combiner a b))))) -(define (sum numbers) (reduce-right + 0 numbers)) +(define sum (reduce-right + 0)) -(define - (repeat value number) - (if - (= number 0) - '() - (cons value (repeat value (- number 1))))) +(define (repeat value) (Y + (lambda (f) (lambda (n) + (if (= n 0) '() (cons value (f (- n 1)))))))) (define (is-numeric-char char) (if (char-numeric? char) #t #f)) -(define (first-last predicate list) +(define (first-last predicate) (compose + id (reduce-right - (lambda (current accumulator) - (combine - (lambda (left right) (cons (car left) (cdr right))) - current - accumulator)) - '() - (map - (lambda (entry) - (if (predicate entry) (repeat entry 2) '())) - list))) - -(define (solve-line line) - ((lambda (first-last-result) - (string->number (list->string first-last-result))) - (first-last is-numeric-char (string->list line)))) - -(define (solve-all lines) - (sum (map solve-line lines))) + (combine (lambda (left right) (cons (car left) (cdr right)))) + '()) + (map (lambda (entry) (if (predicate entry) ((repeat entry) 2) '()))))) + +(define solve-line (compose + (lambda (first-last-result) (string->number (list->string first-last-result))) + (first-last is-numeric-char) + string->list)) + +(define (solve-all lines) (sum ((map solve-line) lines))) (display (solve-all (read-lines)))