|
|
|
#!/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 (map list mapper)
|
|
|
|
(if
|
|
|
|
(null? list)
|
|
|
|
'()
|
|
|
|
(cons (mapper (car list)) (map (cdr list) mapper))))
|
|
|
|
|
|
|
|
(define (reduce list reducer current)
|
|
|
|
(if
|
|
|
|
(null? list)
|
|
|
|
current
|
|
|
|
(reduce (cdr list) reducer (reducer current (car list)))))
|
|
|
|
|
|
|
|
(define (combine list combiner)
|
|
|
|
(if
|
|
|
|
(null? (car list))
|
|
|
|
(cdr list)
|
|
|
|
(if
|
|
|
|
(null? (cdr list))
|
|
|
|
(car list)
|
|
|
|
(combiner (car list) (cdr list)))))
|
|
|
|
|
|
|
|
(define (sum numbers) (reduce numbers + 0))
|
|
|
|
|
|
|
|
(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 list predicate)
|
|
|
|
(if
|
|
|
|
(null? list)
|
|
|
|
'()
|
|
|
|
(combine
|
|
|
|
(cons
|
|
|
|
(if
|
|
|
|
(predicate (car list))
|
|
|
|
(repeat (car list) 2)
|
|
|
|
'())
|
|
|
|
(first-last (cdr list) predicate))
|
|
|
|
(lambda (current rest)
|
|
|
|
(cons (car current) (cdr rest))))))
|
|
|
|
|
|
|
|
(define (solve-line line)
|
|
|
|
(
|
|
|
|
(lambda (first-last-result) (string->number (list->string first-last-result)))
|
|
|
|
(first-last (string->list line) is-numeric-char)))
|
|
|
|
|
|
|
|
(define (solve-all lines)
|
|
|
|
(sum (map lines solve-line)))
|
|
|
|
|
|
|
|
(display (solve-all (read-lines)))
|