; 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))))