You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
#!/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)))
|
|
|