fork(1) download
  1. ; decreasing-increasing array
  2.  
  3. (define (split-while pred? xs)
  4. (let loop ((xs xs) (ys '()))
  5. (if (or (null? xs) (not (pred? (car xs))))
  6. (values (reverse ys) xs)
  7. (loop (cdr xs) (cons (car xs) ys)))))
  8.  
  9. (define (sorted? pred? xs)
  10. (cond ((or (null? xs) (null? (cdr xs))) #t)
  11. ((not (pred? (car xs) (cadr xs))) #f)
  12. (else (sorted? pred? (cdr xs)))))
  13.  
  14. (define (decr-incr xs)
  15. (if (< (length xs) 3) #f
  16. (let ((pivot (apply min xs)))
  17. (let-values (((decr incr)
  18. (split-while (lambda (x) (not (= x pivot))) xs)))
  19. (if (and (not (null? decr)) (not (null? incr))
  20. (sorted? <= (reverse decr)) (sorted? <= incr))
  21. pivot
  22. #f)))))
  23.  
  24. (display (decr-incr '(10 10 10 8 8 6 4 4 3 12 13 22 31 40 59 68))) (newline)
  25. (display (decr-incr '(1 2 4 8 16 32 64))) (newline)
Success #stdin #stdout 0.01s 7960KB
stdin
Standard input is empty
stdout
3
#f