diff --git a/TaskC00/run.py b/TaskC00/run.py index 0bea6c8..64ecf48 100644 --- a/TaskC00/run.py +++ b/TaskC00/run.py @@ -20,17 +20,24 @@ class FSA: else: self.transitions[state_from] = dict() self.transitions[state_from][symbol] = {state_to} - def get_final_state(self, string): + def get_final_state(self, string, start_state): - current_state = self.initial_state + current_state = start_state for symbol in string: - current_state = self.transitions[current_state][symbol] + try: + for state in self.transitions[current_state][symbol]: + current_state = self.get_final_states(string[1:], state) + if current_state in self.final_states: + return current_state + except KeyError: + return -1 return current_state + def add_final_state(self, state): self.final_states.add(state) def accepts(self, string): - if self.get_final_state(string) in self.final_states: + if self.get_final_state(string, self.initial_state) in self.final_states: return True else: return False diff --git a/TaskC06/run.py b/TaskC06/run.py index 2294861..5948b67 100644 --- a/TaskC06/run.py +++ b/TaskC06/run.py @@ -1,15 +1,13 @@ import sys -class NFA: +class FSA: def __init__(self): - self.initial_state = '0' - self.final_states = set() - - self.transitions = dict() - self.alphabet = set() + self.initial_state = '0' + self.final_states = set() + self.transitions = dict() + self.alphabet = set() def add_transition(self, state_from, state_to, symbol): - if state_from in self.transitions.keys(): if symbol not in self.transitions[state_from].keys(): self.transitions[state_from][symbol] = {state_to} @@ -18,36 +16,25 @@ class NFA: else: self.transitions[state_from] = dict() self.transitions[state_from][symbol] = {state_to} - def add_final_state(self, state): self.final_states.add(state) + def get_all_paths(self): + paths = [] + stack = [('', '0')] + while stack: + current_path, current_state = stack.pop() + if current_state in self.final_states: + paths.append(current_path) + if current_state in self.transitions: + for symbol, states in self.transitions[current_state].items(): + stack.extend((current_path + symbol, state) for state in states) + return sorted(paths) - def get_final_states(self, string): - current_states = {self.initial_state} - for symbol in string: - current_states = {state for current_state in current_states for state in self.transitions.get(current_state, {}).get(symbol, set())} - return current_states - - def accepts(self, string): - return any(final_state in self.final_states for final_state in self.get_final_states(string)) - - -nfa = NFA() - -table = open(sys.argv[1]) -for line in table: - line = line.rstrip('\n') - if len(line.split('\t')) == 3: - a, b, c = line.split('\t') - c = c.replace("'","") - c = list(c) - for x in c: - nfa.add_transition(a, b, x) - nfa.alphabet.add(x) - elif len(line.split('\t')) == 1: - nfa.add_final_state(line) - else: - assert False +fsa = FSA() for line in sys.stdin: - print("YES" if nfa.accepts(line.strip()) else "NO") \ No newline at end of file + parts = line.strip().split('\t') + if parts == ['']: break + [fsa.add_transition(parts[0], parts[1], parts[2]) for parts in [parts]] if len(parts) == 3 else fsa.add_final_state(parts[0]) +for path in fsa.get_all_paths(): + print(path) \ No newline at end of file diff --git a/TaskE48/run.py b/TaskE48/run.py index 8bf2db7..a90b94e 100644 --- a/TaskE48/run.py +++ b/TaskE48/run.py @@ -1,9 +1,10 @@ import sys import re -for line in sys.stdin: - numbers = re.match(r'^[a-ząćęłńóśźżA-ZĄĆĘŁŃÓŚŹŻ]([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]*[a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ])?$', line.replace("\n", ""), flags=re.IGNORECASE) - if numbers: - print('yes') - else: - print("no") \ No newline at end of file +def emo_case(s): + p = re.compile(r'^([A-Z\u0104-\u017B]?([a-z\u0105-\u017C][A-Z\u0104-\u017B])+[a-z\u0105-\u017C]?)') + return "yes" if p.match(s) else "no" + + +for _, l in enumerate(sys.stdin, start=1): + print(emo_case(l)) diff --git a/run_report.py b/run_report.py index d248bd7..402ce32 100644 --- a/run_report.py +++ b/run_report.py @@ -71,7 +71,7 @@ def does_task_match_index(dir, index): def get_tasks(index): - all_tasks = Path('../djfz-2023-464933').glob('Task*') + all_tasks = Path('../djfz-2023-s464933').glob('TaskC06') return [task for task in all_tasks if does_task_match_index(task, index)]