fork download
  1. ; identifying anagrams
  2.  
  3. (define sort #f)
  4. (define merge #f)
  5. (let ()
  6. (define dosort
  7. (lambda (pred? ls n)
  8. (if (= n 1)
  9. (list (car ls))
  10. (let ((i (quotient n 2)))
  11. (domerge pred?
  12. (dosort pred? ls i)
  13. (dosort pred? (list-tail ls i) (- n i)))))))
  14. (define domerge
  15. (lambda (pred? l1 l2)
  16. (cond
  17. ((null? l1) l2)
  18. ((null? l2) l1)
  19. ((pred? (car l2) (car l1))
  20. (cons (car l2) (domerge pred? l1 (cdr l2))))
  21. (else (cons (car l1) (domerge pred? (cdr l1) l2))))))
  22. (set! sort
  23. (lambda (pred? l)
  24. (if (null? l) l (dosort pred? l (length l)))))
  25. (set! merge
  26. (lambda (pred? l1 l2)
  27. (domerge pred? l1 l2))))
  28.  
  29. (define (anagram1 str1 str2)
  30. (and (not (string=? str1 str2))
  31. (equal? (sort char<? (string->list str1))
  32. (sort char<? (string->list str2)))))
  33.  
  34. (display (anagram1 "DEPOSIT" "DOPIEST")) (newline)
  35. (display (anagram1 "STAR" "MOON")) (newline)
  36. (display (anagram1 "ZEBRA" "ZEBRA")) (newline)
  37.  
  38. (define (anagram2 str1 str2)
  39. (let ((counts (make-vector 256 0)))
  40. (define (add idx n)
  41. (vector-set! counts idx
  42. (+ (vector-ref counts idx) n)))
  43. (do ((cs (string->list str1) (cdr cs))) ((null? cs))
  44. (add (char->integer (car cs)) 1))
  45. (do ((cs (string->list str2) (cdr cs))) ((null? cs))
  46. (add (char->integer (car cs)) -1))
  47. (let loop ((i 65))
  48. (cond ((= i 91) (not (string=? str1 str2)))
  49. ((not (zero? (vector-ref counts i))) #f)
  50. (else (loop (+ i 1)))))))
  51.  
  52. (display (anagram2 "DEPOSIT" "DOPIEST")) (newline)
  53. (display (anagram2 "STAR" "MOON")) (newline)
  54. (display (anagram2 "ZEBRA" "ZEBRA")) (newline)
  55.  
  56. (define (anagram3 str1 str2)
  57. (let ((letters (vector 2 3 5 7 11 13 17 19 23 29 31
  58. 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101)))
  59. (define (lookup c)
  60. (vector-ref letters (- (char->integer c) 65)))
  61. (and (not (string=? str1 str2))
  62. (= (apply * (map lookup (string->list str1)))
  63. (apply * (map lookup (string->list str2)))))))
  64.  
  65. (display (anagram3 "DEPOSIT" "DOPIEST")) (newline)
  66. (display (anagram3 "STAR" "MOON")) (newline)
  67. (display (anagram3 "ZEBRA" "ZEBRA")) (newline)
Success #stdin #stdout 0s 7272KB
stdin
Standard input is empty
stdout
#t
#f
#f
#t
#f
#f
#t
#f
#f