fork download
  1. ; list slices
  2.  
  3. (define (split n xs)
  4. (let loop ((n n) (xs xs) (zs '()))
  5. (if (or (zero? n) (null? xs))
  6. (values (reverse zs) xs)
  7. (loop (- n 1) (cdr xs) (cons (car xs) zs)))))
  8.  
  9. (define (filter pred? xs)
  10. (let loop ((xs xs) (ys '()))
  11. (cond ((null? xs) (reverse ys))
  12. ((pred? (car xs))
  13. (loop (cdr xs) (cons (car xs) ys)))
  14. (else (loop (cdr xs) ys)))))
  15.  
  16. (define (slice widths xs)
  17. (let loop ((ws widths) (xs xs) (zs (list)))
  18. (if (null? ws) (reverse zs)
  19. (let-values (((front back) (split (car ws) xs)))
  20. (loop (cdr ws) back (cons front zs))))))
  21.  
  22. (display (slice '(1 2 3) '(1 2 2 3 3 3))) (newline)
  23. (display (slice '(1 2 3) '(1 2 2 3))) (newline)
  24. (display (slice '(1 2 3) '(1 2 2))) (newline)
  25. (display (slice '(1 2 3) '(1 2 2 3 3 3 4 4 4 4))) (newline)
  26.  
  27. (display (let ((xs (map list->string
  28. (slice '(3 3 4)
  29. (filter char-numeric?
  30. (string->list "123.456.7890"))))))
  31. (string-append "(" (car xs) ")" (cadr xs) "-" (caddr xs))))
  32. (newline)
Success #stdin #stdout 0s 7876KB
stdin
Standard input is empty
stdout
((1) (2 2) (3 3 3))
((1) (2 2) (3))
((1) (2 2) ())
((1) (2 2) (3 3 3))
(123)456-7890