[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/DXx4AX1q    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Jan 31:
; 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)


Output:
1
2
3
4
1 A
26 Z
27 AA
256 IV


Create a new paste based on this one


Comments: