#!/usr/bin/python3
# ==================================================================
# day of the week hash demo
# convert day string to day-of-the-week number
# ==================================================================
import random
import sys
import user_interface as ui
# ---- days of the week dictionary (string:day-of-the-week)
days = { 'Monday':1, 'Tuesday':2, 'Wednesday':3, 'Thursday':4,
'Friday':5, 'Saturday':6, 'Sunday':7 }
# ---- aphabet dictionary (character:position-in-alphabet)
abc = { 'A':1, 'B':2, 'C':3, 'D':4, 'E':5, 'F':6,
'g':7, 'H':8, 'I':9, 'J':10, 'K':11, 'L':12,
'M':13, 'N':14, 'O':15, 'P':16, 'Q':17, 'R':18,
'S':19, 'T':20, 'U':21, 'V':22, 'W':23, 'X':24,
'Y':25, 'Z':26 }
# ------------------------------------------------------------------
# ---- hash maximum value
# ------------------------------------------------------------------
def hash_max():
max = 0
for day in days.keys():
h = abc[day[0].upper()] + (abc[day[1].upper()] * 2)
if h > max:
max = h
return max
# ------------------------------------------------------------------
# ---- create a hash table based on days-of-the-week
# ------------------------------------------------------------------
def create_hash_table(max):
ht = [None] * max
for s in list(days.keys()):
hash = abc[s[0].upper()] + (abc[s[1].upper()] * 2)
ht[hash] = days[s]
return ht
# ------------------------------------------------------------------
# ---- return a day's hash value
# ------------------------------------------------------------------
def hash(day,ht):
# ---- calculate hash
h = abc[day[0].upper()] + (abc[day[1].upper()] * 2)
# ---- check if hash is out of bounds
if h >= len(ht):
print('internal error - hash table size exceeded - ({h})')
sys.quit()
# ---- return
return ht[h]
# ------------------------------------------------------------------
if __name__ == '__main__':
print()
# ---- maximum hash value
hmax = hash_max()
print(f'hash max: {hmax}')
# ---- alphabet dictionary
print()
for s in days:
c = s[0].upper()
print(f'abc[{c}] = {abc[c]}')
# -- hash table
ht = create_hash_table(hmax+1)
print()
print('hash table')
print(f'size: {len(ht)}')
for i,v in enumerate(ht):
if v is not None:
print(f'hash: ht[{i}] = {v}')
# ---- process user input
while(True):
print()
s = ui.get_user_input('Enter a test count: ')
if not s:
sys.exit()
tf,cnt = ui.is_integer(s)
if tf is not True:
print(f'bad integer entered ({s}')
continue
if cnt < 1 or cnt > 100:
print(f'bad count entered {cnt} (limit 1 to 100)')
continue
break
# ---- create random list of days
k = list(days.keys())
rdays = []
for _ in range(cnt):
rdays.append(random.choice(k))
# ---- get hashed value
print()
for d in rdays:
v = hash(d,ht)
print(f'random-day = {d:9} v = {v} (day-of-the-week)')
# --------------------------------------------------------------
# ---- now that the testing has been none
# ---- let's collect statistics
# --------------------------------------------------------------