diff --git a/TaskB05/run b/TaskB05/run new file mode 100644 index 0000000..dc1556f --- /dev/null +++ b/TaskB05/run @@ -0,0 +1,2 @@ +#!/bin/bash +python TaskB05/run.py "$@" diff --git a/TaskB05/run.py b/TaskB05/run.py new file mode 100644 index 0000000..5b65a82 --- /dev/null +++ b/TaskB05/run.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re +import sys + +atandt_desc_pattern = re.compile(r"^([0-9]+)\t([0-9]+)\t(\S+)$") #^([0-9]+)\t([0-9]+)\t(\S+)$ regex for tab separated columns +atandt_accepted_state_pattern = re.compile(r"^[0-9]+$") + +current_state = 0 +accept_states = set() +visited_nodes = [] + +state_move = set() + +# function that filters set by starting node and returns all edges that starts in that node +def filter_set(xs, filtered_value): + return set(filter(lambda x: x[0] == filtered_value, xs)) + + +def dfs(graph, start): + visited = set() + stack = set() + for el in filter_set(state_move, 0): + stack.add(el) + while stack: + edge = stack.pop() + print('Current edge: {edge}'.format(edge = edge)) + if edge not in visited: + visited.add(edge) + children = set() + for val in filter_set(state_move, edge[2]): + stack.add(val) + print('Stack: {stack}'.format(stack = stack)) + print('Visited: {visited}'.format(visited = visited)) + else: + return [-1] + return visited + + +for line in sys.stdin: + line = line.replace('\n', '') + move = atandt_desc_pattern.match(line) + succes = atandt_accepted_state_pattern.match(line) + if move: + node = str(move.group(3)).decode('utf-8') + state_move.add((int(move.group(1)), node, int(move.group(2)))) + if succes: + accept_states.add(int(line)) +print('Moves: {state_move}'.format(state_move = state_move)) +print('Accept states: {accept_states}'.format(accept_states = accept_states)) + +vis = dfs(state_move, 0) +if -1 in vis: + print("Cycle") +else: + print("Tree")