Sequential Generation from an Index Value#
I needed to be able to generate a sequence of letters from a specific index value. Basically, I wanted to loop through a sequence of values and retrieve the corresponding string value. For example, 0 would be A; 4 would be E; 36 would be AK; etc.
0 = A
1 = B
2 = C
3 = D
4 = E
5 = F
21 = V
22 = W
23 = X
24 = Y
25 = Z
26 = AA
27 = AB
28 = AC
36 = AK
37 = AL
38 = AM
39 = AN
I have created a small python script as a proof of concept that does the calculation using two different methods.
Method 1#
Method 1, uses a recursive function to build up the correct sequence from the index value. Essentially the code is treating the index integer as a value that has the index into a large 2D array encoded within it. We use the modulus method to extract the index for the particular row. We then subtract the difference from the index to see if there are any more letters stored in the encoded index. Method 1 returns the value of the sequence in the correct order.
def get_name(index):
"""
Translate the index to a set of letters in sequential order.
"""
#termination criteria
if index < 0:
return ''
#Take the modulus of the current index and translate it into one of the
#characters stored in the letters string.
selected_index = index % lettersCount
return letters[selected_index] + get_name(math.floor((index - lettersCount)/lettersCount))
Method 2#
Method 2 works in a similar manor, yet simpler, to Method 1. However it calculates the sequence in reverse order. So in order for the result to be useful, the sequence must be reversed.
def get_name2(index, values = []):
"""
Translate the index to a set of letters in sequential order, but reversed.
"""
if not values:
values = []
#termination criteria
if index < 0:
return values
#Take the modulus of the current index and translate it into one of the
#characters stored in the letters string.
selected_index = index % lettersCount
values.append(letters[selected_index])
return get_name2(math.floor((index - lettersCount)/lettersCount), values)
Demonstration Script#
Here is a script to demonstrate the methods:
1#!/usr/bin/encodednv python3
2#-*- coding:utf-8 -*-
3"""
4index = 0, value = A
5index = 1, value = B
6index = 2, value = C
7index = 3, value = D
8index = 4, value = E
9index = 5, value = F
10index = 6, value = G
11index = 7, value = H
12index = 8, value = I
13index = 9, value = J
14index = 10, value = K
15index = 11, value = L
16index = 12, value = M
17index = 13, value = N
18index = 14, value = O
19index = 15, value = P
20index = 16, value = Q
21index = 17, value = R
22index = 18, value = S
23index = 19, value = T
24index = 20, value = U
25index = 21, value = V
26index = 22, value = W
27index = 23, value = X
28index = 24, value = Y
29index = 25, value = Z
30index = 26, value = AA
31index = 27, value = AB
32index = 28, value = AC
33index = 29, value = AD
34index = 30, value = AE
35index = 31, value = AF
36index = 32, value = AG
37index = 33, value = AH
38index = 34, value = AI
39index = 35, value = AJ
40index = 36, value = AK
41index = 37, value = AL
42index = 38, value = AM
43index = 39, value = AN
44"""
45
46import math
47import sys
48
49letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
50# letters = 'ABCDEF'
51lettersCount = len(letters)
52
53def get_name(index):
54 """
55 Translate the index to a set of letters in sequential order.
56 """
57
58 #termination criteria
59 if index < 0:
60 return ''
61
62 #Take the modulus of the current index and translate it into one of the
63 #characters stored in the letters string.
64 selected_index = index % lettersCount
65
66 return letters[selected_index] + get_name(math.floor((index - lettersCount)/lettersCount))
67
68def test1():
69 print(letters)
70 print('index = 8: ', get_name(8)[::-1])
71 print('index = 15: ', get_name(15)[::-1])
72 print('index = 17: ', get_name(17)[::-1])
73 print('index = 18: ', get_name(18)[::-1])
74 print('index = 75: ', get_name(75)[::-1])
75 print('index = 1000: ',get_name(1000)[::-1])
76 print()
77
78 for i in range(100):
79 print('index = {}, value = {}'.format(i, get_name(i)[::-1]))
80
81def get_name2(index, values = []):
82 """
83 Translate the index to a set of letters in sequential order, but reversed.
84 """
85
86 if not values:
87 values = []
88
89 #termination criteria
90 if index < 0:
91 return values
92
93 #Take the modulus of the current index and translate it into one of the
94 #characters stored in the letters string.
95 selected_index = index % lettersCount
96 values.append(letters[selected_index])
97
98 return get_name2(math.floor((index - lettersCount)/lettersCount), values)
99
100
101def test2():
102 print(letters)
103
104 for i in range(1000):
105 print('index = {}, value = {}'.format(i,
106 ''.join(reversed(get_name2(i)))))
107
108
109def main():
110 """
111 This runs the rest of the functions in this module
112 """
113
114 print('test1')
115 test1()
116
117 print('test2')
118 test2()
119
120 return 0 # success
121
122
123if __name__ == '__main__':
124 status = main()
125 sys.exit(status)