# =================================================================== # Enigma Machine Simulation - support functions # =================================================================== import copy from datetime import date import re import sys import random import user_interface as ui # ------------------------------------------------------------------- # ---- create a randomize rotor list # ---- 1. input list must contain a least two values # ---- 2. input list must contain an even number of values # ---- 3. this function ensures every list-value will end up in a # ---- different location (list-index) in the randomized list. # ---- different locations are required by the enigma machine. # ---- we are simulating electric circuits. IN can not be the # ---- same wire as OUT. See the electric circuit diagram # ---- elsewhere. # ---- 4. no list-value in the list is allowed to be randomized # ---- to itself (ie. lst[10] can not be 10) # ------------------------------------------------------------------- def create_randomized_rotor_list(lst, debug=False): ranlst = copy.deepcopy(lst) i = 0 # ranlst list index s = 1 # start of random range e = len(ranlst)-1 # end of random range if debug: print(f'ranlst: {ranlst} (original list)') while s < e: j = random.randint(s,e) tmp = ranlst[i] ranlst[i] = ranlst[j] ranlst[j] = tmp if debug: print(f'ranlst: {ranlst}') i += 1 s += 1 # ---- make sure the last two don't encode themselves tmp = ranlst[-1] ranlst[-1] = ranlst[-2] ranlst[-2] = tmp if debug: print(f'ranlst: {ranlst} (last two swapped list)') # ---- return the randomized list return ranlst # ------------------------------------------------------------------- # ---- create a randomize reflector list # ---- 1. input list must contain a least two values # ---- 2. input list must contain an even number of values # ---- 3. this function ensures every list element is paired with # ---- another list element. Each pair is unique and reference # ---- each other (i.e. lst[6] = 10 and lst[10] = 6) # ------------------------------------------------------------------- def create_randomized_reflector_list(lst, debug=False): def _pop_random(lst): idx = random.randrange(0,len(lst)) return lst.pop(idx) cpylst = copy.deepcopy(lst) reflst = [None] * len(lst) while cpylst: idx1 = _pop_random(cpylst) idx2 = _pop_random(cpylst) reflst[idx1] = idx2 reflst[idx2] = idx1 return reflst