This commit is contained in:
deadsmond 2019-12-03 13:09:51 +01:00
parent 367cd176c9
commit 056892ad6a
7 changed files with 156 additions and 4 deletions

0
TaskB04/Makefile Normal file
View File

View File

@ -1,7 +1,7 @@
Ścieżki
=======
Program powinien wczytać automat skończeniestanowy (bez wag) ze
Program powinien wczytać automat skończenie stanowy (bez wag) ze
standardowego wejścia. Zakładamy, że automat jest deterministyczny i
nie zawiera cykli. Alfabet automatu stanowią litery języka polskiego.

0
TaskX04/Makefile Normal file
View File

66
automate.class.py Normal file
View File

@ -0,0 +1,66 @@
#!/usr/bin/python3
import sys
import re
class automata:
# class variables init
def __init__(self):
# dictionary of connections between nodes
self.storage = {}
# list of accepting states
self.accepting_states = []
# list of current states
self.state = ['0']
# print for debug purposes
def __repr__(self):
return('%s\n\n%s\n\n%s\n\n' % (self.storage, self.accepting_states, self.state))
# add node in open fst format
def add_node(self, line):
node = line.replace('\n', '').split(' ')
if len(node) == 3:
if node[0] in self.storage:
# add value to existing node
self.storage[node[0]].append({node[2]: node[1]})
else:
# create new node
self.storage[node[0]] = [{node[2]: node[1]}]
elif len(node) == 1:
# add accepting state
self.accepting_states.append(node[0])
# check if string is accepted by automate
def test_string(self, text):
self.state = ['0']
text = text.replace('\n', '')
for i in text:
for q in self.state:
self.state = self.get_node_transition(q, i)
if not self.state:
return False
return self.check_if_accepted()
def check_if_accepted(self):
return not set(self.state).isdisjoint(self.accepting_states)
def get_node_transition(self, query):
for i in self.storage:
if i[0] == query:
return i[1]
return []
def sort(self):
self.storage = sorted(self.storage, key = lambda x: (x[0][0], x[0][1]))
auto = automata()
for line in sys.stdin:
auto.add_node(line)
f = open(sys.argv[1], 'r')
for line in f:
print(auto.test_string(line))

86
automate.nondet.class.py Normal file
View File

@ -0,0 +1,86 @@
#!/usr/bin/python3
import sys
import re
class automata:
# class variables init
def __init__(self):
# dictionary of connections between nodes
self.graph = {}
# list of accepting states
self.accepting_states = []
# list of current states
self.state = ['0']
# word variable
self.word = ''
# print for debug purposes
def __repr__(self):
return('%s\n\n%s\n\n%s\n\n' % (self.graph, self.accepting_states, self.state))
# add node in open fst format
def add_node(self, line):
node = line.replace('\n', '').split(' ')
if len(node) == 3:
if node[0] in self.graph:
# add value to existing node
self.graph[node[0]].append({node[2]: node[1]})
else:
# create new node
self.graph[node[0]] = [{node[2]: node[1]}]
elif len(node) == 1:
# add accepting state
self.accepting_states.append(node[0])
# check if string is accepted by automate
def test_string(self, word):
self.state = ['0']
self.word = word.replace('\n', '')
# for all values in word
for i in self.word:
# for all actual states
result = []
for q in self.state:
# move state to its transition
result = self.get_node_transition(q, i)
# if the list is empty, return false
if not self.state:
return False
# flatten list of states
self.state = [item for sublist in result for item in sublist]
# check if automata is in accepting state
return self.check_if_accepted()
# check if there is common part between states of automata and accepting states
def check_if_accepted(self):
return not set(self.state).isdisjoint(self.accepting_states)
def get_node_transition(self, q, i):
result = []
# if the node exists
try:
# search through all its connections to find value
for connections in self.graph[q]:
for value in connections:
if value == i:
# append next node
result.append(connections[value])
except KeyError:
return result
# return list of next nodes
return result
auto = automata()
for line in sys.stdin:
auto.add_node(line)
f = open(sys.argv[1], 'r')
for line in f:
if auto.test_string(line):
print("TRUE %s" % auto.word)
else:
print("FALSE %s" % auto.word)

View File

@ -1,2 +1,2 @@
2: A00 A13 A42 A45
2: A00 A13 A40 A45
3: B01 B03

View File

@ -1,3 +1,3 @@
git add TaskA%1/run
git add Task%1/run
git commit -m 'hm'
git push origin master