fork download
  1. ; the last prime digit
  2.  
  3. (import (rnrs hashtables (6)))
  4.  
  5. (define (make-matrix rows columns . value)
  6. (do ((m (make-vector rows)) (i 0 (+ i 1)))
  7. ((= i rows) m)
  8. (if (null? value)
  9. (vector-set! m i (make-vector columns))
  10. (vector-set! m i (make-vector columns (car value))))))
  11.  
  12. (define (matrix-ref m i j) (vector-ref (vector-ref m i) j))
  13.  
  14. (define (matrix-set! m i j x) (vector-set! (vector-ref m i) j x))
  15.  
  16. (define (primegen)
  17. (let ((ps #f) (p #f) (q #f) (c #f) (d (make-eq-hashtable)))
  18. (lambda ()
  19. (define (add m s)
  20. (do () ((not (hashtable-ref d m #f))) (set! m (+ m s)))
  21. (hashtable-set! d m s))
  22. (cond ((not p) (set! p #t) 2) ((not q) (set! q #t) 3)
  23. (else (when (not ps) (set! ps (primegen)) (set! c 5)
  24. (set! p (and (ps) (ps))) (set! q (* p p)))
  25. (let loop ()
  26. (cond ((hashtable-ref d c #f) =>
  27. (lambda (s)
  28. (hashtable-delete! d c)
  29. (add (+ c s) s)
  30. (set! c (+ c 2)) (loop)))
  31. ((< c q) (let ((x c)) (set! c (+ c 2)) x))
  32. (else (add (+ c p p) (+ p p))
  33. (set! p (ps)) (set! q (* p p))
  34. (set! c (+ c 2)) (loop)))))))))
  35.  
  36. (define (grimes n)
  37. (let ((ps (primegen)) (counts (make-matrix 4 4 0)))
  38. (ps) (ps) (ps) ; discard 2,3,5
  39. (let loop ((prev (ps)) (n (- n 4)))
  40. (if (zero? n) counts
  41. (let ((curr (modulo (ps) 10)))
  42. (matrix-set! counts (quotient prev 3) (quotient curr 3)
  43. (+ 1 (matrix-ref counts (quotient prev 3) (quotient curr 3))))
  44. (loop curr (- n 1)))))))
  45.  
  46. (display (grimes 1000))
Success #stdin #stdout 0.21s 52776KB
stdin
Standard input is empty
stdout
#(#(34 83 97 31) #(45 23 85 99) #(70 77 26 81) #(96 69 45 35))