#!/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 (reduce-right reducer initial list) (if (null? list) initial (reducer (car list) (reduce-right reducer initial (cdr list))))) (define (map mapper list) (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 (sum numbers) (reduce-right + 0 numbers)) (define (repeat value number) (if (= number 0) '() (cons value (repeat value (- number 1))))) (define (is-numeric-char char) (if (char-numeric? char) #t #f)) (define (first-last predicate list) (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))) (display (solve-all (read-lines)))