12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- (import (chicken string))
- (import (chicken io))
- (import (chicken sort))
- (import matchable)
- (import srfi-1)
- (define input
- (with-input-from-file "input"
- (lambda ()
- (let loop ((ret '()))
- (let ((line (read-line)))
- (if (eof-object? line)
- (reverse ret)
- (loop (cons line ret))))))))
- (set! input (map string-split input))
- (set! input (map (lambda (lst) (map string->number lst)) input))
- (define (diff in)
- (let loop ((lst in) (ret '()))
- (match lst
- ((a b . r) (loop (cdr lst) (cons (- a b) ret)))
- ((a) (reverse ret)))))
- (define (same-sign? in)
- (define prod (map (lambda (x) (* x (car in))) in))
- (foldl (lambda (a b) (and a b)) #t (map (lambda (x) (> x 0)) prod)))
- (define (extend in)
- (let loop ((lst in) (head '()) (ret '()))
- (if (null? lst)
- (cons in ret)
- (loop (cdr lst)
- (cons (car lst) head)
- (cons (append (reverse head) (cdr lst)) ret)))))
- (define (ladder-safe? in)
- (and (same-sign? in)
- (not (any (lambda (x) (> (abs x) 3)) in))))
- (define (safe? in)
- (any ladder-safe? (map diff (extend in))))
- (display (length (filter safe? input)))
- (newline)
|