#!/usr/bin/guile -s !# (use-modules (ice-9 rdelim)) (define (read-lines) (let loop ((line (read-line))) (if (eof-object? line) '() (cons line (loop (read-line)))))) (define (id value) 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)) '())) (define (compose-two f g) (lambda (x) (f (g x)))) (define compose (reduce-right compose-two id)) (define (combine combiner) (lambda (a b) (if (null? a) b (if (null? b) a (combiner a b))))) (define sum (reduce-right + 0)) (define (repeat value) (Y (lambda (f) (lambda (n) (if (= n 0) '() (cons value (f (- n 1)))))))) (define solve-line (compose (list string->number list->string (reduce-right (combine (lambda (left right) (cons (car left) (cdr right)))) '()) (map (lambda (char) (if (char-numeric? char) ((repeat char) 2) '()))) string->list))) (define solve-all (compose (list sum (map solve-line)))) (display (solve-all (read-lines)))