; base-26 arithmetic
(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))))))
(define (undigits ds . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((ds ds) (n 0))
(if (null? ds) n
(loop (cdr ds) (+ (* n b) (car ds)))))))
(define (number->prashant n)
(define (d->c d) (integer->char (+ d 65)))
(list->string (map d->c (digits n 26))))
(define (prashant->number p)
(define (c->d c) (- (char->integer c) 65))
(undigits (map c->d (string->list p)) 26))
(display (number->prashant 1234567)) (newline)
(display (prashant->number "CSGHJ")) (newline)
(define (prashant-times x y)
(number->prashant
(* (prashant->number x)
(prashant->number y))))
(display (prashant-times "CSGHJ" "CBA")) (newline)