# COMP9021 24T1 # Assignment 1 *** Due Monday 25 March (Week 7) @ 9.00am # DO *NOT* WRITE YOUR NAME TO MAINTAIN ANONYMITY FOR PLAGIARISM DETECTION import re def num2roman(num): string = '' roman_dict_des = {1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC', 50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 1: 'I'} for k, v in roman_dict_des.items(): while num >= k: string += v num -= k return string def roman2num(roman): roman = roman.upper() total = 0 for i in roman: if i == 'I': total += 1 elif i == 'V': total += 5 elif i == "X": total += 10 elif i == 'L': total += 50 elif i == 'C': total += 100 elif i == 'D': total += 500 elif i == 'M': total += 1000 if 'IV' in roman: total -= 2 if 'IX' in roman: total -= 2 if 'XL' in roman: total -= 20 if 'XC' in roman: total -= 20 if 'CD' in roman: total -= 200 if 'CM' in roman: total -= 200 return total def check_roman_valid(roman): roman = roman.upper() if bool(re.search(r"^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$",roman)) == True: return True else: return False def generalised_roman_symbol(value, morse_code): morse_code = list(morse_code) morse_dict = dict() morse_dict[morse_code[-1]] = 1 length_check = len(morse_code) for i in range(len(morse_code)-2, -1, -1): if morse_code[i] in morse_dict: return False else: if length_check % 2 == 0: if i % 2 == 0: morse_dict[morse_code[i]] = morse_dict[morse_code[i + 1]] * 5 else: morse_dict[morse_code[i]] = morse_dict[morse_code[i + 1]] * 2 else: if i % 2 == 0: morse_dict[morse_code[i]] = morse_dict[morse_code[i + 1]] * 2 else: morse_dict[morse_code[i]] = morse_dict[morse_code[i + 1]] * 5 if value.isalpha() == True: value = list(value) int_result = 0 current_value = value[0] check_occur = 0 for i in range(len(value)): if value[i] not in morse_code: return False else: if current_value == value[i]: current_value = value[i] check_occur += 1 if '5' in str(morse_dict[value[i]]): if check_occur >= 2: return False else: if i < len(value) - 1 and morse_dict[value[i]] < morse_dict[value[i + 1]]: int_result -= morse_dict[value[i]] else: int_result += morse_dict[value[i]] elif '1' in str(morse_dict[value[i]]): if check_occur >= 4: return False else: if 2 <= check_occur <= 3: if morse_dict[value[i]] < morse_dict[value[i + 1]]: return False else: if i < len(value) - 1 and morse_dict[value[i]] < morse_dict[value[i + 1]]: int_result -= morse_dict[value[i]] else: int_result += morse_dict[value[i]] else: if i < len(value) - 1 and morse_dict[value[i]] < morse_dict[value[i + 1]]: int_result -= morse_dict[value[i]] else: int_result += morse_dict[value[i]] else: check_occur = 0 if i < len(value) - 1 and morse_dict[value[i]] < morse_dict[value[i + 1]]: int_result -= morse_dict[value[i]] else: int_result += morse_dict[value[i]] return int_result elif value.isdigit() == True: value = int(value) str_result = '' num_list = list() for k in morse_dict: num_list.append(morse_dict[k]) num_list.reverse() switch_dict = {value: key for key, value in morse_dict.items()} for i in range(len(num_list) - 1): if '5' in str(num_list[i]): switch_dict[num_list[i] - num_list[i + 1]] = switch_dict[num_list[i + 1]] + switch_dict[num_list[i]] elif '1' in str(num_list[i]): switch_dict[num_list[i] - num_list[i + 2]] = switch_dict[num_list[i + 2]] + switch_dict[num_list[i]] sort_dict = dict(sorted(switch_dict.items(), key=lambda item: item[0], reverse=True)) for k, v in sort_dict.items(): while value >= k: str_result += v value -= k return str_result else: return False def convert_minimally(letter): letter = list(letter) len_of_letter = len(letter) int_result = 0 current_value = letter[0] check_occur = 0 general_dict = dict() general_dict[letter[-1]] = 1 no_dup = list() for i in letter[::-1]: if i not in no_dup: no_dup.append(i) for i in range(1,len(no_dup)): if i in general_dict: continue else: if len(general_dict) % 2 == 0: general_dict[no_dup[i]] = general_dict[no_dup[i - 1]] * 2 else: general_dict[no_dup[i]] = general_dict[no_dup[i - 1]] * 5 if len_of_letter > 3 and letter[0] == letter[-1]: return False elif len_of_letter == 3 and letter[0] == letter[-1]: return 19, letter[0]+'_'+letter[1] elif len_of_letter == 2 and letter[0] != letter[1]: return 4, letter[-1]+letter[0] for i in range(len(letter)): if current_value == letter[i]: current_value = letter[i] check_occur += 1 if '5' in str(general_dict[letter[i]]): if check_occur >= 2: return False else: if i < len(letter) - 1 and general_dict[letter[i]] < general_dict[letter[i + 1]]: int_result -= general_dict[letter[i]] else: int_result += general_dict[letter[i]] elif '1' in str(general_dict[letter[i]]): if check_occur >= 4: return False else: if 2 <= check_occur <= 3: if general_dict[letter[i]] < general_dict[letter[i + 1]]: return False else: if i < len(letter) - 1 and general_dict[letter[i]] < general_dict[letter[i + 1]]: int_result -= general_dict[letter[i]] else: int_result += general_dict[letter[i]] else: if i < len(letter) - 1 and general_dict[letter[i]] < general_dict[letter[i + 1]]: int_result -= general_dict[letter[i]] else: int_result += general_dict[letter[i]] else: check_occur = 0 if i < len(letter) - 1 and general_dict[letter[i]] < general_dict[letter[i + 1]]: int_result -= general_dict[letter[i]] else: int_result += general_dict[letter[i]] str_return = '' sort_dict =dict(reversed(list(general_dict.items()))) print(general_dict) print(sort_dict) for i in sort_dict: str_return += i print(str_return) return int_result, str_return # def getting_dict(letter): def please_convert(): user_input = input("How can I help you? ") section = user_input.split(' ') length_of_section = len(section) if section[0] != 'Please' or section[1] != 'convert': print("I don't get what you want, sorry mate!") elif section[0] == 'Please' and section[1] == 'convert': if length_of_section == 3: num_letter = section[2] check_list = list(num_letter) if check_list[0] == '0': print("Hey, ask me something that's not impossible to do!") else: if num_letter.isdigit() == True: if 0 < int(num_letter) < 4000: print(f"Sure! It is {num2roman(int(num_letter))}") else: print("Hey, ask me something that's not impossible to do!") elif check_roman_valid(num_letter) == True: print(f"Sure! It is {roman2num(num_letter)}") else: print("Hey, ask me something that's not impossible to do!") elif length_of_section == 5 and section[3] == 'using': num_letter = section[2] check_list = list(num_letter) if check_list[0] == '0': print("Hey, ask me something that's not impossible to do!") else: if generalised_roman_symbol(num_letter, section[-1]) != False: print(f"Sure! It is {generalised_roman_symbol(num_letter, section[-1])}") else: print("Hey, ask me something that's not impossible to do!") elif length_of_section == 4 and section[-1] == 'minimally': num_letter = section[2] check_list = list(num_letter) if check_list[0] == '0': print("Hey, ask me something that's not impossible to do!") else: if num_letter.isalpha() == True: if convert_minimally(num_letter) != False: int_result, str_return = convert_minimally(num_letter) print(f"Sure! It is {int_result} using {str_return}") else: print("Hey, ask me something that's not impossible to do!") else: print("Hey, ask me something that's not impossible to do!") else: print("I don't get what you want, sorry mate!") else: print("I don't get what you want, sorry mate!") please_convert()