exceed Posted June 17, 2022 Share Posted June 17, 2022 ; EX:NUM->COL - 2022.06.17 exceed ; change numbers to alphabet numbers. (like EXCEL column) ; example ) A, B, C ~ Y, Z, AA ZZ, AAA ~ ZZZ, AAAA ~ ZZZZ, AAAAA ~ ZZZZZ ; allowed numbers 1 to 12356630 ; ; How to use ; (EX:NUM->COL number) (defun EX:NUM->COL ( c / answer c1 c2 c3 c4 c5 ) (setq c (- c 1)) (cond ((< c 0) ; case for under 0 value (setq answer (strcat "out of range")) ) ((and (>= c 0) (< c 26)) ; case for 1 ~ 26 (= A ~ Z) (setq c1 (+ c 1)) (setq answer (strcat (chr (+ 64 c1)))) ) ((and (>= c 26) (< c (+ 26 (* 26 26))) ) ; case for 26 ~ 702 (= AA ~ ZZ) (setq c (- c 26)) (setq c2 (fix (/ c 26))) (setq c1 (- c (* c2 26))) (setq c1 (+ c1 1)) (setq c2 (+ c2 1)) (setq answer (strcat (chr (+ 64 c2)) (chr (+ 64 c1)))) ) ((and (>= c (+ 26 (* 26 26))) (< c (+ 26 (* 26 26) (* 26 26 26)))) ; case for 702 ~ 18278 (= AAA ~ ZZZ) (setq c (- c (+ 26 (* 26 26)))) (setq c3 (fix (/ c (* 26 26)) ) ) (setq c2 (fix (/ (- c (* c3 26 26)) 26))) (setq c1 (- (- c (* c3 26 26)) (* c2 26))) (setq c1 (+ c1 1)) (setq c2 (+ c2 1)) (setq c3 (+ c3 1)) (setq answer (strcat (chr (+ 64 c3)) (chr (+ 64 c2)) (chr (+ 64 c1)))) ) ((and (>= c (+ 26 (* 26 26) (* 26 26 26))) (< c (+ 26 (* 26 26) (* 26 26 26) (* 26 26 26 26)) )) ; case for 18278 ~ 475254 (= AAAA (setq c (- c (+ 26 (* 26 26) (* 26 26 26)))) (setq c4 (fix (/ c (* 26 26 26)))) (setq c3 (fix (/ (- c (* c4 26 26 26)) (* 26 26)))) (setq c2 (fix (/ (- (- c (* c4 26 26 26)) (* c3 26 26)) 26))) (setq c1 (- (- (- c (* c4 26 26 26)) (* c3 26 26)) (* c2 26))) (setq c1 (+ c1 1)) (setq c2 (+ c2 1)) (setq c3 (+ c3 1)) (setq c4 (+ c4 1)) (setq answer (strcat (chr (+ 64 c4)) (chr (+ 64 c3)) (chr (+ 64 c2)) (chr (+ 64 c1)))) ) ((and (>= c (+ 26 (* 26 26) (* 26 26 26) (* 26 26 26 26))) (< c (+ 26 (* 26 26) (* 26 26 26) (* 26 26 26 26) (* 26 26 26 26 26)))) ; case for 475254 ~ 12356630 (setq c (- c (+ 26 (* 26 26) (* 26 26 26) (* 26 26 26 26)))) (setq c5 (fix (/ c (* 26 26 26 26)))) (setq c4 (fix (/ (- c (* c5 26 26 26 26)) (* 26 26 26)))) (setq c3 (fix (/ (- (- c (* c5 26 26 26 26)) (* c4 26 26 26)) (* 26 26)))) (setq c2 (fix (/ (- (- (- c (* c5 26 26 26 26)) (* c4 26 26 26)) (* c3 26 26)) 26))) (setq c1 (- (- (- (- c (* c5 26 26 26 26)) (* c4 26 26 26)) (* c3 26 26)) (* c2 26))) (setq c1 (+ c1 1)) (setq c2 (+ c2 1)) (setq c3 (+ c3 1)) (setq c4 (+ c4 1)) (setq c5 (+ c5 1)) (setq answer (strcat (chr (+ 64 c5)) (chr (+ 64 c4)) (chr (+ 64 c3)) (chr (+ 64 c2)) (chr (+ 64 c1)))) ) ((>= c (+ 26 (* 26 26) (* 26 26 26) (* 26 26 26 26) (* 26 26 26 26 26))) ; case for over 12356630 (setq answer (strcat "out of range")) ) ) answer ) ; EX:COL->NUM - 2022.06.17 exceed ; reverse function of EX:NUM->COL ; allowed alphabets A to ZZZZZ ; ; How to use ; (EX:COL->NUM string) (defun EX:COL->NUM ( c / answer clen cflag clist index catom clistlen ) (setq c (strcase c)) (setq clen (strlen c)) (if (and (> clen 0) (< clen 6)) (progn (setq cflag 0) (setq clist '()) (setq index 1) (repeat clen (setq catom (ascii (substr c index 1))) (if (and (>= catom 65) (<= catom 90)) (setq clist (cons (- catom 64) clist)) (setq cflag 1) ) (setq index (+ index 1)) ) (if (= cflag 0) (progn (setq clist (reverse clist)) (setq clistlen (length clist)) (cond ((= clistlen 1) (setq answer (nth 0 clist)) ) ((= clistlen 2) (setq answer (+ (* (nth 0 clist) 26) (nth 1 clist))) ) ((= clistlen 3) (setq answer (+ (* (nth 0 clist) 26 26) (* (nth 1 clist) 26) (nth 2 clist))) ) ((= clistlen 4) (setq answer (+ (* (nth 0 clist) 26 26 26) (* (nth 1 clist) 26 26) (* (nth 2 clist) 26) (nth 3 clist))) ) ((= clistlen 5) (setq answer (+ (* (nth 0 clist) 26 26 26 26) (* (nth 1 clist) 26 26 26) (* (nth 2 clist) 26 26) (* (nth 3 clist) 26) (nth 4 clist))) ) ) ) (progn (setq answer "Non-alphabetic impurities are mixed.") ) ) ) (progn (setq answer "Only 1 ~ 5 digits Alphabet can be calculated.") ) ) answer ) i have organized parts of this code for use elsewhere. https://www.cadtutor.net/forum/topic/74681-cad-output-excel-specified-page/?do=findComment&comment=591539 It seems like it could be made more concisely, but at my level, this is the limit. (EX:NUM->COL number) (EX:COL->NUM string) test code is below (defun c:test ( / a ) (princ "\n ================== ") (setq a 1) (repeat 40 (princ "\n input = ") (princ a) (princ " / NUM->COL = ") (princ (EX:NUM->COL a)) (princ " / COL->NUM = ") (princ (EX:COL->NUM (EX:NUM->COL a))) (setq a (+ a 1)) ) (princ "\n ================== ") (setq a 690) (repeat 20 (princ "\n input = ") (princ a) (princ " / NUM->COL = ") (princ (EX:NUM->COL a)) (princ " / COL->NUM = ") (princ (EX:COL->NUM (EX:NUM->COL a))) (setq a (+ a 1)) ) (princ "\n ================== ") (setq a 18270) (repeat 20 (princ "\n input = ") (princ a) (princ " / NUM->COL = ") (princ (EX:NUM->COL a)) (princ " / COL->NUM = ") (princ (EX:COL->NUM (EX:NUM->COL a))) (setq a (+ a 1)) ) (princ "\n ================== ") (setq a 475240) (repeat 20 (princ "\n input = ") (princ a) (princ " / NUM->COL = ") (princ (EX:NUM->COL a)) (princ " / COL->NUM = ") (princ (EX:COL->NUM (EX:NUM->COL a))) (setq a (+ a 1)) ) (princ "\n ================== ") (setq a 12356625) (repeat 10 (princ "\n input = ") (princ a) (princ " / NUM->COL = ") (princ (EX:NUM->COL a)) (princ " / COL->NUM = ") (princ (EX:COL->NUM (EX:NUM->COL a))) (setq a (+ a 1)) ) (princ "\n ================== ") (princ) ) and test result is below ================== input = 1 / NUM->COL = A / COL->NUM = 1 input = 2 / NUM->COL = B / COL->NUM = 2 input = 3 / NUM->COL = C / COL->NUM = 3 input = 4 / NUM->COL = D / COL->NUM = 4 input = 5 / NUM->COL = E / COL->NUM = 5 input = 6 / NUM->COL = F / COL->NUM = 6 input = 7 / NUM->COL = G / COL->NUM = 7 input = 8 / NUM->COL = H / COL->NUM = 8 input = 9 / NUM->COL = I / COL->NUM = 9 input = 10 / NUM->COL = J / COL->NUM = 10 input = 11 / NUM->COL = K / COL->NUM = 11 input = 12 / NUM->COL = L / COL->NUM = 12 input = 13 / NUM->COL = M / COL->NUM = 13 input = 14 / NUM->COL = N / COL->NUM = 14 input = 15 / NUM->COL = O / COL->NUM = 15 input = 16 / NUM->COL = P / COL->NUM = 16 input = 17 / NUM->COL = Q / COL->NUM = 17 input = 18 / NUM->COL = R / COL->NUM = 18 input = 19 / NUM->COL = S / COL->NUM = 19 input = 20 / NUM->COL = T / COL->NUM = 20 input = 21 / NUM->COL = U / COL->NUM = 21 input = 22 / NUM->COL = V / COL->NUM = 22 input = 23 / NUM->COL = W / COL->NUM = 23 input = 24 / NUM->COL = X / COL->NUM = 24 input = 25 / NUM->COL = Y / COL->NUM = 25 input = 26 / NUM->COL = Z / COL->NUM = 26 input = 27 / NUM->COL = AA / COL->NUM = 27 input = 28 / NUM->COL = AB / COL->NUM = 28 input = 29 / NUM->COL = AC / COL->NUM = 29 input = 30 / NUM->COL = AD / COL->NUM = 30 input = 31 / NUM->COL = AE / COL->NUM = 31 input = 32 / NUM->COL = AF / COL->NUM = 32 input = 33 / NUM->COL = AG / COL->NUM = 33 input = 34 / NUM->COL = AH / COL->NUM = 34 input = 35 / NUM->COL = AI / COL->NUM = 35 input = 36 / NUM->COL = AJ / COL->NUM = 36 input = 37 / NUM->COL = AK / COL->NUM = 37 input = 38 / NUM->COL = AL / COL->NUM = 38 input = 39 / NUM->COL = AM / COL->NUM = 39 input = 40 / NUM->COL = AN / COL->NUM = 40 ================== input = 690 / NUM->COL = ZN / COL->NUM = 690 input = 691 / NUM->COL = ZO / COL->NUM = 691 input = 692 / NUM->COL = ZP / COL->NUM = 692 input = 693 / NUM->COL = ZQ / COL->NUM = 693 input = 694 / NUM->COL = ZR / COL->NUM = 694 input = 695 / NUM->COL = ZS / COL->NUM = 695 input = 696 / NUM->COL = ZT / COL->NUM = 696 input = 697 / NUM->COL = ZU / COL->NUM = 697 input = 698 / NUM->COL = ZV / COL->NUM = 698 input = 699 / NUM->COL = ZW / COL->NUM = 699 input = 700 / NUM->COL = ZX / COL->NUM = 700 input = 701 / NUM->COL = ZY / COL->NUM = 701 input = 702 / NUM->COL = ZZ / COL->NUM = 702 input = 703 / NUM->COL = AAA / COL->NUM = 703 input = 704 / NUM->COL = AAB / COL->NUM = 704 input = 705 / NUM->COL = AAC / COL->NUM = 705 input = 706 / NUM->COL = AAD / COL->NUM = 706 input = 707 / NUM->COL = AAE / COL->NUM = 707 input = 708 / NUM->COL = AAF / COL->NUM = 708 input = 709 / NUM->COL = AAG / COL->NUM = 709 ================== input = 18270 / NUM->COL = ZZR / COL->NUM = 18270 input = 18271 / NUM->COL = ZZS / COL->NUM = 18271 input = 18272 / NUM->COL = ZZT / COL->NUM = 18272 input = 18273 / NUM->COL = ZZU / COL->NUM = 18273 input = 18274 / NUM->COL = ZZV / COL->NUM = 18274 input = 18275 / NUM->COL = ZZW / COL->NUM = 18275 input = 18276 / NUM->COL = ZZX / COL->NUM = 18276 input = 18277 / NUM->COL = ZZY / COL->NUM = 18277 input = 18278 / NUM->COL = ZZZ / COL->NUM = 18278 input = 18279 / NUM->COL = AAAA / COL->NUM = 18279 input = 18280 / NUM->COL = AAAB / COL->NUM = 18280 input = 18281 / NUM->COL = AAAC / COL->NUM = 18281 input = 18282 / NUM->COL = AAAD / COL->NUM = 18282 input = 18283 / NUM->COL = AAAE / COL->NUM = 18283 input = 18284 / NUM->COL = AAAF / COL->NUM = 18284 input = 18285 / NUM->COL = AAAG / COL->NUM = 18285 input = 18286 / NUM->COL = AAAH / COL->NUM = 18286 input = 18287 / NUM->COL = AAAI / COL->NUM = 18287 input = 18288 / NUM->COL = AAAJ / COL->NUM = 18288 input = 18289 / NUM->COL = AAAK / COL->NUM = 18289 ================== input = 475240 / NUM->COL = ZZZL / COL->NUM = 475240 input = 475241 / NUM->COL = ZZZM / COL->NUM = 475241 input = 475242 / NUM->COL = ZZZN / COL->NUM = 475242 input = 475243 / NUM->COL = ZZZO / COL->NUM = 475243 input = 475244 / NUM->COL = ZZZP / COL->NUM = 475244 input = 475245 / NUM->COL = ZZZQ / COL->NUM = 475245 input = 475246 / NUM->COL = ZZZR / COL->NUM = 475246 input = 475247 / NUM->COL = ZZZS / COL->NUM = 475247 input = 475248 / NUM->COL = ZZZT / COL->NUM = 475248 input = 475249 / NUM->COL = ZZZU / COL->NUM = 475249 input = 475250 / NUM->COL = ZZZV / COL->NUM = 475250 input = 475251 / NUM->COL = ZZZW / COL->NUM = 475251 input = 475252 / NUM->COL = ZZZX / COL->NUM = 475252 input = 475253 / NUM->COL = ZZZY / COL->NUM = 475253 input = 475254 / NUM->COL = ZZZZ / COL->NUM = 475254 input = 475255 / NUM->COL = AAAAA / COL->NUM = 475255 input = 475256 / NUM->COL = AAAAB / COL->NUM = 475256 input = 475257 / NUM->COL = AAAAC / COL->NUM = 475257 input = 475258 / NUM->COL = AAAAD / COL->NUM = 475258 input = 475259 / NUM->COL = AAAAE / COL->NUM = 475259 ================== input = 12356625 / NUM->COL = ZZZZU / COL->NUM = 12356625 input = 12356626 / NUM->COL = ZZZZV / COL->NUM = 12356626 input = 12356627 / NUM->COL = ZZZZW / COL->NUM = 12356627 input = 12356628 / NUM->COL = ZZZZX / COL->NUM = 12356628 input = 12356629 / NUM->COL = ZZZZY / COL->NUM = 12356629 input = 12356630 / NUM->COL = ZZZZZ / COL->NUM = 12356630 input = 12356631 / NUM->COL = out of range / COL->NUM = Only 1 ~ 5 digits Alphabet can be calculated. input = 12356632 / NUM->COL = out of range / COL->NUM = Only 1 ~ 5 digits Alphabet can be calculated. input = 12356633 / NUM->COL = out of range / COL->NUM = Only 1 ~ 5 digits Alphabet can be calculated. input = 12356634 / NUM->COL = out of range / COL->NUM = Only 1 ~ 5 digits Alphabet can be calculated. ================== I've been wrong on this problem twice before, sadly so please let me know if you find anything wrong number in 1 ~ 12356630 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.