; self-locating strings in pi
(define (take n xs)
(let loop ((n n) (xs xs) (ys '()))
(if (or (zero? n) (null? xs))
(reverse ys)
(loop (- n 1) (cdr xs)
(cons (car xs) ys)))))
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
; https://p...content-available-to-author-only...s.com/2009/02/20/the-digits-of-pi/
(define (pi-spigot z)
(let loop ((z z) (ds '()) (q 1) (r 0) (t 1) (k 1) (n 3) (m 3))
(cond ((zero? z) (reverse ds))
((< (+ q q q q r (- t)) (* n t))
(loop (- z 1) (cons n ds) (* 10 q) (* 10 (- r (* n t)))
t k (- (quotient (* 10 (+ q q q r)) t) (* 10 n)) m))
(else (loop z ds (* q k) (* (+ q q r) m) (* t m) (+ k 1)
(quotient (+ (* q (+ k k k k k k k 2)) (* r m))
(* t m)) (+ m 2))))))
(define pi (pi-spigot 100))
(do ((n 0 (+ n 1)) (ps (cdr pi) (cdr ps))) ((null? ps))
(let* ((ds (digits n)) (len (length ds)))
(when (equal? ds (take len ps)) (display n) (newline))))