demo_rotate_enigma_rotor_list.py

#!/usr/bin/python3
# ===================================================================
# use a python list to simulate rotating an enigma rotor
# the rotor is a hard wired substitution cipher and rotates "upward"
# or "forward" one position (a -> b -> c -> ...)
#
# a list index is an index into a alphabet list used to translate
# between indexes and alphabetic letters
#
# the list index is the IN character and the list value is the index
# of the OUT character
#
# ---- pattern the code is trying to duplicate ----------------------
#
#    [0]     [1]     [2]     [3]     [4]
#   IN OUT  IN OUT  IN OUT  IN OUT  IN OUT
#   0 -> 2  0 -> 2  0 -> 3  0 -> 1  0 -> 2 
#   1 -> 3  1 -> 0  1 -> 2  1 -> 3  1 -> 3
#   2 -> 1  2 -> 3  2 -> 0  2 -> 0  2 -> 1
#   3 -> 0  3 -> 1  3 -> 1  3 -> 2  3 -> 0
#
# ===================================================================

abc    = ['A','B','C','D']     # alphabet
lst    = [2,3,1,0]             # randomized list       
lstlen = len(lst)              # list length

# ---- display the current index list

def display_list(n,lst,lstlen,abc):
    print(f'[{n}] {lst}  [',end='')
    for i in range(lstlen):
        if i != 0: print(',',end='')
        print(f' {abc[lst[i]]}',end='')
    print(' ]')


# ---- main

print()
display_list(0,lst,lstlen,abc)

for j in range(1,8):           # rotate and display rotor list

    # ---- rotate the list (enigma rotor)
    # ---- move the list values up one position (a->b)
    # ---- modify the list value to be the index of the OUT
    # ---- character

    tmp = lst[0]

    for i in range(lstlen-1):
       lst[i] = (lst[i+1] - 1) % lstlen

    lst[-1] = (tmp-1) % lstlen

    if j % lstlen == 0:
        print()
    display_list(j,lst,lstlen,abc)