fork download
  1. ; spelling numbers
  2.  
  3. (define range
  4. (case-lambda
  5. ((stop) (range 0 stop (if (negative? stop) -1 1)))
  6. ((start stop) (range start stop (if (< start stop) 1 -1)))
  7. ((start stop step)
  8. (let ((le? (if (negative? step) >= <=)))
  9. (let loop ((x start) (xs (list)))
  10. (if (le? stop x) (reverse xs)
  11. (loop (+ x step) (cons x xs))))))
  12. (else (error 'range "too many arguments"))))
  13.  
  14. (define (spell n)
  15. (let ((ones '("" "one" "two" "three" "four" "five" "six"
  16. "seven" "eight" "nine" "ten" "eleven"
  17. "twelve" "thirteen" "fourteen" "fifteen"
  18. "sixteen" "seventeen" "eighteen" "nineteen"))
  19. (tens '("" "" "twenty" "thirty" "forty" "fifty"
  20. "sixty" "seventy" "eighty" "ninety")))
  21. (cond ((negative? n) (error 'spell "too small"))
  22. ((zero? n) "zero")
  23. ((< n 20) (list-ref ones n))
  24. ((< n 100) (string-append
  25. (list-ref tens (quotient n 10))
  26. (list-ref ones (modulo n 10))))
  27. ((= n 100) "onehundred")
  28. (else (error 'spell "too big")))))
  29.  
  30. (display (sort (range 101) (lambda (a b) (string<? (spell a) (spell b))))) (newline)
Success #stdin #stdout 0.01s 8300KB
stdin
Standard input is empty
stdout
(8 18 80 88 85 84 89 81 87 86 83 82 11 15 50 58 55 54 59 51 57 56 53 52 5 40 48 45 44 49 41 47 46 43 42 4 14 9 19 90 98 95 94 99 91 97 96 93 92 1 100 7 17 70 78 75 74 79 71 77 76 73 72 6 16 60 68 65 64 69 61 67 66 63 62 10 13 30 38 35 34 39 31 37 36 33 32 3 12 20 28 25 24 29 21 27 26 23 22 2 0)