; excel columns
(define-syntax assert
(syntax-rules ()
((assert expr result)
(if (not (equal? expr result))
(for-each display `(
#\newline "failed assertion:" #\newline
expr #\newline "expected: " ,result
#\newline "returned: " ,expr #\newline))))))
(define (column excel) ; A=>1, AA=>27, IV=>256
(let loop ((cs (string->list excel)) (result 0))
(if (null? cs) result
(loop (cdr cs) (+ (* result 26) (char->integer (car cs)) -64)))))
(define (excel column) ; 1=>A, 27=>AA, 256=>IV
(let loop ((q column) (result '()))
(if (= q 0) (list->string result)
(let* ((q (- q 1))
(r (modulo q 26))
(q (quotient q 26)))
(loop q (cons (integer->char (+ r 65)) result))))))
(display (column "A")) (display " ") (display (excel 1)) (newline)
(display (column "Z")) (display " ") (display (excel 26)) (newline)
(display (column "AA")) (display " ") (display (excel 27)) (newline)
(display (column "IV")) (display " ") (display (excel 256)) (newline)
(define (test-excel)
(do ((i 1 (+ i 1))) ((< (expt 2 16) i))
(assert (column (excel i)) i)))
(test-excel)