From 2c55dad82a157c53f6d5d2409fd4e4f86eacb293 Mon Sep 17 00:00:00 2001 From: HOME-VM-TOSCHOOL Date: Thu, 2 Nov 2023 00:36:33 +0100 Subject: [PATCH] B08 --- TaskB08/fsa_description.arg | 19 +++++++ TaskB08/run.py | 101 ++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 TaskB08/fsa_description.arg create mode 100644 TaskB08/run.py diff --git a/TaskB08/fsa_description.arg b/TaskB08/fsa_description.arg new file mode 100644 index 0000000..12dd618 --- /dev/null +++ b/TaskB08/fsa_description.arg @@ -0,0 +1,19 @@ +0 1 j +1 2 u +2 3 l +3 4 i +4 5 e +5 6 t +1 1 j +2 1 j +3 1 j +4 1 j +5 1 j +6 6 abcdefghijklmnopqrstuvwxyz +0 0 abcdefghiklmnopqrstuvwxyz +1 0 abcdefghiklmnopqrstvwxyz +2 0 abcdefghikmnopqrstuvwxyz +3 0 abcdefghklmnopqrstuvwxyz +4 0 abcdfghiklmnopqrstuvwxyz +5 0 abcdefghiklmnopqrsuvwxyz +6 \ No newline at end of file diff --git a/TaskB08/run.py b/TaskB08/run.py new file mode 100644 index 0000000..871f28c --- /dev/null +++ b/TaskB08/run.py @@ -0,0 +1,101 @@ +import sys +import csv +import os + +from numpy import append + +DIR = os.path.dirname(__file__) +alfabet = "abcdefghijklmnopqrstuvwxyz " + + +def join_path(filename: str) -> str: + return os.path.join(DIR, filename) + + +if len(sys.argv) == 1: + print("Default arguments parsed\n") + sys.argv.append("fsa_description.arg") + sys.argv.append("simple.in") + sys.argv.append("simple.exp") + +with open(join_path(sys.argv[1]), "r", newline="", encoding="utf8") as csvfile: + filereader = csv.reader(csvfile, delimiter="\t", quotechar="|") + fsa_description = list(filereader) + accepting_state = int(fsa_description[-1][0]) + fsa_description = fsa_description[:-1] + fsa_description_map = {} + is_error = False + for num, item in enumerate(fsa_description): + for letter in item[2]: + if letter not in alfabet: + print("ERROR - letter not in alfabet: ", letter, "| line:", num + 1) + exit(-1) + if (int(item[0]), letter) in fsa_description_map: + print("ERROR - duplicate letter:", letter, "| line:", num + 1) + is_error = True + tuple = (int(item[0]), letter) + fsa_description_map[tuple] = int(item[1]) + + if is_error: + exit(-1) + +states = {} +for item in fsa_description_map: + states[item[0]] = states[item[0]] + item[1] if item[0] in states else item[1] + + +from collections import Counter + + +# check if all letters are used once +def is_permutation(str1, str2): + return Counter(str1) == Counter(str2) + + +def find_missing_letters(str1, str2) -> str: + missing_letters = "" + for char in str2: + if char not in str1: + missing_letters += char + return missing_letters + + +for state in states: + if not is_permutation(states[state], alfabet): + print( + f"ERROR - state {state} doesn't match: {states[state]} | {alfabet} | diff - {find_missing_letters(states[state], alfabet)}" + ) + exit(-1) + + +with open(join_path(sys.argv[2]), "r", newline="", encoding="utf8") as csvfile: + filereader = csv.reader(csvfile, delimiter="\t", quotechar="|") + test_in = list(filereader) + +with open(join_path(sys.argv[3]), "r", newline="", encoding="utf8") as csvfile: + filereader = csv.reader(csvfile, delimiter="\t", quotechar="|") + test_out = list(filereader) + + +is_difference = [] +for i, word in enumerate(test_in): + current_state = 0 + if len(word) != 0: + for letter in word[0]: + current_state = fsa_description_map[(current_state, letter)] + + print(str(i + 1) + "\t", end="") + if current_state == accepting_state: + print("YES\t", end="") + if "YES" != test_out[i][0]: + print("ERROR", word, end="") + is_difference.append(i) + else: + print("NO\t", end="") + if "NO" != test_out[i][0]: + print("ERROR", word, end="") + is_difference.append(i) + print() + +if len(is_difference) != 0: + print(is_difference)