fork download
  1. ; pandigital squares
  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-syntax fold-of
  15. (syntax-rules (range in is)
  16. ((_ "z" f b e) (set! b (f b e)))
  17. ((_ "z" f b e (v range fst pst stp) c ...)
  18. (let* ((x fst) (p pst) (s stp)
  19. (le? (if (positive? s) <= >=)))
  20. (do ((v x (+ v s))) ((le? p v) b)
  21. (fold-of "z" f b e c ...))))
  22. ((_ "z" f b e (v range fst pst) c ...)
  23. (let* ((x fst) (p pst) (s (if (< x p) 1 -1)))
  24. (fold-of "z" f b e (v range x p s) c ...)))
  25. ((_ "z" f b e (v range pst) c ...)
  26. (fold-of "z" f b e (v range 0 pst) c ...))
  27. ((_ "z" f b e (x in xs) c ...)
  28. (do ((t xs (cdr t))) ((null? t) b)
  29. (let ((x (car t)))
  30. (fold-of "z" f b e c ...))))
  31. ((_ "z" f b e (x is y) c ...)
  32. (let ((x y)) (fold-of "z" f b e c ...)))
  33. ((_ "z" f b e p? c ...)
  34. (if p? (fold-of "z" f b e c ...)))
  35. ((_ f i e c ...)
  36. (let ((b i)) (fold-of "z" f b e c ...)))))
  37.  
  38. (define-syntax list-of (syntax-rules ()
  39. ((_ arg ...) (reverse (fold-of
  40. (lambda (d a) (cons a d)) '() arg ...)))))
  41.  
  42. (define sort #f)
  43. (define merge #f)
  44. (let ()
  45. (define dosort
  46. (lambda (pred? ls n)
  47. (if (= n 1)
  48. (list (car ls))
  49. (let ((i (quotient n 2)))
  50. (domerge pred?
  51. (dosort pred? ls i)
  52. (dosort pred? (list-tail ls i) (- n i)))))))
  53. (define domerge
  54. (lambda (pred? l1 l2)
  55. (cond
  56. ((null? l1) l2)
  57. ((null? l2) l1)
  58. ((pred? (car l2) (car l1))
  59. (cons (car l2) (domerge pred? l1 (cdr l2))))
  60. (else (cons (car l1) (domerge pred? (cdr l1) l2))))))
  61. (set! sort
  62. (lambda (pred? l)
  63. (if (null? l) l (dosort pred? l (length l)))))
  64. (set! merge
  65. (lambda (pred? l1 l2)
  66. (domerge pred? l1 l2))))
  67.  
  68. (define (digits n . args)
  69. (let ((b (if (null? args) 10 (car args))))
  70. (let loop ((n n) (d '()))
  71. (if (zero? n) d
  72. (loop (quotient n b)
  73. (cons (modulo n b) d))))))
  74.  
  75. (define (pandigital? n)
  76. (equal? (sort < (digits n)) (range 10)))
  77.  
  78. (define ps
  79. (list-of (list n n2)
  80. (n range 10000 100000)
  81. (n2 is (* n n))
  82. (pandigital? n2)))
  83.  
  84. (display (length ps)) (newline)
  85.  
  86. (display ps) (newline)
Success #stdin #stdout 3.73s 10688KB
stdin
Standard input is empty
stdout
87
((32043 1026753849) (32286 1042385796) (33144 1098524736) (35172 1237069584) (35337 1248703569) (35757 1278563049) (35853 1285437609) (37176 1382054976) (37905 1436789025) (38772 1503267984) (39147 1532487609) (39336 1547320896) (40545 1643897025) (42744 1827049536) (43902 1927385604) (44016 1937408256) (45567 2076351489) (45624 2081549376) (46587 2170348569) (48852 2386517904) (49314 2431870596) (49353 2435718609) (50706 2571098436) (53976 2913408576) (54918 3015986724) (55446 3074258916) (55524 3082914576) (55581 3089247561) (55626 3094251876) (56532 3195867024) (57321 3285697041) (58413 3412078569) (58455 3416987025) (58554 3428570916) (59403 3528716409) (60984 3719048256) (61575 3791480625) (61866 3827401956) (62679 3928657041) (62961 3964087521) (63051 3975428601) (63129 3985270641) (65634 4307821956) (65637 4308215769) (66105 4369871025) (66276 4392508176) (67677 4580176329) (68763 4728350169) (68781 4730825961) (69513 4832057169) (71433 5102673489) (72621 5273809641) (75759 5739426081) (76047 5783146209) (76182 5803697124) (77346 5982403716) (78072 6095237184) (78453 6154873209) (80361 6457890321) (80445 6471398025) (81222 6597013284) (81945 6714983025) (83919 7042398561) (84648 7165283904) (85353 7285134609) (85743 7351862049) (85803 7362154809) (86073 7408561329) (87639 7680594321) (88623 7854036129) (89079 7935068241) (89145 7946831025) (89355 7984316025) (89523 8014367529) (90144 8125940736) (90153 8127563409) (90198 8135679204) (91248 8326197504) (91605 8391476025) (92214 8503421796) (94695 8967143025) (95154 9054283716) (96702 9351276804) (97779 9560732841) (98055 9614783025) (98802 9761835204) (99066 9814072356))