fork download
  1. ; prime anagrams
  2.  
  3. (define (fold-right op base xs)
  4. (if (null? xs)
  5. base
  6. (op (car xs) (fold-right op base (cdr xs)))))
  7.  
  8.  
  9. (define (primes n) ; list of primes not exceeding n
  10. (let* ((len (quotient (- n 1) 2)) (bits (make-vector len #t)))
  11. (let loop ((i 0) (p 3) (ps (list 2)))
  12. (cond ((< n (* p p))
  13. (do ((i i (+ i 1)) (p p (+ p 2))
  14. (ps ps (if (vector-ref bits i) (cons p ps) ps)))
  15. ((= i len) (reverse ps))))
  16. ((vector-ref bits i)
  17. (do ((j (+ (* 2 i i) (* 6 i) 3) (+ j p)))
  18. ((<= len j) (loop (+ i 1) (+ p 2) (cons p ps)))
  19. (vector-set! bits j #f)))
  20. (else (loop (+ i 1) (+ p 2) ps))))))
  21.  
  22. (define ps (list->vector (primes 1620)))
  23.  
  24. (define (signature str)
  25. (fold-right (lambda (c n)
  26. (modulo (* (vector-ref ps (char->integer c)) n)
  27. (- (expt 2 31) 1)))
  28. 1
  29. (string->list str)))
  30.  
  31. (define (anagram? str1 str2)
  32. (= (signature str1) (signature str2)))
  33.  
  34. (display (anagram? "time" "emit"))
Success #stdin #stdout 0.01s 7984KB
stdin
Standard input is empty
stdout
#t