Solutions of some puzzles in Scheme (Lisp), my first experience with it.
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.

51 lines
1.2 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 (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)))