; odometer
(define (next-char c)
(integer->char (+ (char->integer c) 1)))
(define (next1 c)
(cond ((char=? c #\Z) (values #\A #t))
((char=? c #\9) (values #\0 #t))
(else (values (next-char c) #f))))
(define (next str)
(let loop ((cs (reverse (string->list str))) (xs (list)) (carry? #f))
(if (null? cs) (list->string (reverse xs))
(call-with-values
(lambda () (next1 (car cs)))
(lambda (x carry?)
(if carry? (loop (cdr cs) (cons x xs) #f)
(list->string (append (reverse (cdr cs)) (cons x xs)))))))))
(display (next "123")) (newline)
(display (next "199")) (newline)
(display (next "999")) (newline)
(display (next "ABC")) (newline)
(display (next "FZZ")) (newline)
(display (next "G7TS39")) (newline)
OyBvZG9tZXRlcgoKKGRlZmluZSAobmV4dC1jaGFyIGMpCiAgKGludGVnZXItPmNoYXIgKCsgKGNoYXItPmludGVnZXIgYykgMSkpKQoKKGRlZmluZSAobmV4dDEgYykKICAoY29uZCAoKGNoYXI9PyBjICNcWikgKHZhbHVlcyAjXEEgI3QpKQogICAgICAgICgoY2hhcj0/IGMgI1w5KSAodmFsdWVzICNcMCAjdCkpCiAgICAgICAgKGVsc2UgKHZhbHVlcyAobmV4dC1jaGFyIGMpICNmKSkpKQoKKGRlZmluZSAobmV4dCBzdHIpCiAgKGxldCBsb29wICgoY3MgKHJldmVyc2UgKHN0cmluZy0+bGlzdCBzdHIpKSkgKHhzIChsaXN0KSkgKGNhcnJ5PyAjZikpCiAgICAoaWYgKG51bGw/IGNzKSAobGlzdC0+c3RyaW5nIChyZXZlcnNlIHhzKSkKICAgICAgKGNhbGwtd2l0aC12YWx1ZXMKICAgICAgICAobGFtYmRhICgpIChuZXh0MSAoY2FyIGNzKSkpCiAgICAgICAgKGxhbWJkYSAoeCBjYXJyeT8pCiAgICAgICAgICAoaWYgY2Fycnk/ICAobG9vcCAoY2RyIGNzKSAoY29ucyB4IHhzKSAjZikKICAgICAgICAgICAgKGxpc3QtPnN0cmluZyAgKGFwcGVuZCAocmV2ZXJzZSAoY2RyIGNzKSkgKGNvbnMgeCB4cykpKSkpKSkpKQoKKGRpc3BsYXkgKG5leHQgIjEyMyIpKSAobmV3bGluZSkKKGRpc3BsYXkgKG5leHQgIjE5OSIpKSAobmV3bGluZSkKKGRpc3BsYXkgKG5leHQgIjk5OSIpKSAobmV3bGluZSkKKGRpc3BsYXkgKG5leHQgIkFCQyIpKSAobmV3bGluZSkKKGRpc3BsYXkgKG5leHQgIkZaWiIpKSAobmV3bGluZSkKKGRpc3BsYXkgKG5leHQgIkc3VFMzOSIpKSAobmV3bGluZSk=