fork(1) download
  1. ; find the missing number
  2.  
  3. (define (next str)
  4. (number->string (+ (string->number str) 1)))
  5.  
  6. (define (missing-from start rest)
  7. (let ((len (string-length rest)))
  8. (if (zero? len) -1
  9. (let* ((n (next start))
  10. (n-len (string-length n)))
  11. (if (and (<= n-len len)
  12. (string=? n (substring rest 0 n-len)))
  13. (missing-from n (substring rest n-len len))
  14. (let* ((n1 (next n)) (n1-len (string-length n1)))
  15. (if (none-missing n1 (substring rest n1-len len))
  16. (string->number n) -1)))))))
  17.  
  18. (define (none-missing start rest)
  19. (let ((len (string-length rest)))
  20. (or (zero? len)
  21. (let* ((n (next start)) (n-len (string-length n)))
  22. (and (<= n-len len)
  23. (string=? n (substring rest 0 n-len))
  24. (none-missing n (substring rest n-len len)))))))
  25.  
  26. (define (missing-number str)
  27. (let ((len (string-length str)))
  28. (let loop ((m 1))
  29. (let* ((left (substring str 0 m))
  30. (right (substring str m len))
  31. (n (missing-from left right)))
  32. (if (negative? n) (loop (+ m 1)) n)))))
  33.  
  34. (display (missing-number "12346789")) (newline)
  35. (display (missing-number "26272829313233")) (newline)
  36. (display (missing-number "9293949596979899101")) (newline)
  37. (display (missing-number "9294959697")) (newline)
  38. (display (missing-number "99101102103104105")) (newline)
  39. (display (missing-number "596597598600601602")) (newline)
  40. (display (missing-number "989999009901990299049905")) (newline)
  41. (display (missing-number "98999901990299039904")) (newline)
  42. (display (missing-number "9998999910000100011000210004")) (newline)
  43. (display (missing-number "9899101102")) (newline)
Success #stdin #stdout 0s 7276KB
stdin
Standard input is empty
stdout
5
30
100
93
100
599
9903
9900
10003
100