zadania c

This commit is contained in:
Weranda 2023-11-25 21:13:35 +01:00
parent cd74536d74
commit 798ea9440e
18 changed files with 338 additions and 1 deletions

View File

@ -1,4 +1,3 @@
# automat akceptuje dwa napisy - "aaaa" i "a" powielone 4038 razy
0 1 a 0 1 a
1 2 a 1 2 a
2 3 a 2 3 a

41
TaskC00/run.py Normal file
View File

@ -0,0 +1,41 @@
import sys
def load_data(file_path):
nfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split('\t')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
if key in nfa:
nfa[key].add(int(next_state))
else:
nfa[key] = {int(next_state)}
return nfa
def is_accepted(nfa, input, current_states, accepting_states):
for symbol in input:
new_states = set()
for state in current_states:
key = (state, symbol)
if key in nfa:
new_states.update(nfa[key])
current_states = new_states
return any(state in accepting_states for state in current_states)
# Set of accepting states
accepting_states = {3,4}
nfa_file = sys.argv[1]
nfa = load_data(nfa_file)
for line in sys.stdin:
input_str = line.strip()
start_states = {0}
if is_accepted(nfa, input_str, start_states, accepting_states):
print("YES")
else:
print("NO")

BIN
TaskC00/test.exp Normal file

Binary file not shown.

41
TaskC01/run.py Normal file
View File

@ -0,0 +1,41 @@
import sys
def load_data(file_path):
nfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split(' ')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
if key in nfa:
nfa[key].add(int(next_state))
else:
nfa[key] = {int(next_state)}
return nfa
def is_accepted(nfa, input, current_states, accepting_states):
for symbol in input:
new_states = set()
for state in current_states:
key = (state, symbol)
if key in nfa:
new_states.update(nfa[key])
current_states = new_states
return any(state in accepting_states for state in current_states)
# Set of accepting states
accepting_states = {2}
nfa_file = sys.argv[1]
nfa = load_data(nfa_file)
for line in sys.stdin:
input_str = line.strip()
start_states = {0}
if is_accepted(nfa, input_str, start_states, accepting_states):
print("YES")
else:
print("NO")

7
TaskC01/test.arg Normal file
View File

@ -0,0 +1,7 @@
0 0 a
0 0 c
0 0 b
0 1 b
1 2 a
1 2 c
1 2 b

Binary file not shown.

41
TaskC02/run.py Normal file
View File

@ -0,0 +1,41 @@
import sys
def load_data(file_path):
nfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split(' ')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
if key in nfa:
nfa[key].add(int(next_state))
else:
nfa[key] = {int(next_state)}
return nfa
def is_accepted(nfa, input, current_states, accepting_states):
for symbol in input:
new_states = set()
for state in current_states:
key = (state, symbol)
if key in nfa:
new_states.update(nfa[key])
current_states = new_states
return any(state in accepting_states for state in current_states)
# Set of accepting states
accepting_states = {2}
nfa_file = sys.argv[1]
nfa = load_data(nfa_file)
for line in sys.stdin:
input_str = line.strip()
start_states = {0}
if is_accepted(nfa, input_str, start_states, accepting_states):
print("YES")
else:
print("NO")

5
TaskC02/test.arg Normal file
View File

@ -0,0 +1,5 @@
0 0 a
0 0 c
0 0 b
0 1 a
1 2 b

Binary file not shown.

41
TaskC03/run.py Normal file
View File

@ -0,0 +1,41 @@
import sys
def load_data(file_path):
nfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split(' ')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
if key in nfa:
nfa[key].add(int(next_state))
else:
nfa[key] = {int(next_state)}
return nfa
def is_accepted(nfa, input, current_states, accepting_states):
for symbol in input:
new_states = set()
for state in current_states:
key = (state, symbol)
if key in nfa:
new_states.update(nfa[key])
current_states = new_states
return any(state in accepting_states for state in current_states)
# Set of accepting states
accepting_states = {3}
nfa_file = sys.argv[1]
nfa = load_data(nfa_file)
for line in sys.stdin:
input_str = line.strip()
start_states = {0}
if is_accepted(nfa, input_str, start_states, accepting_states):
print("YES")
else:
print("NO")

9
TaskC03/test.arg Normal file
View File

@ -0,0 +1,9 @@
0 0 a
0 0 c
0 0 b
0 1 a
1 2 b
2 3 c
3 3 a
3 3 b
3 3 c

Binary file not shown.

48
TaskC04/run.py Normal file
View File

@ -0,0 +1,48 @@
import sys
def load_data(file_path):
dfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split('\t')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
dfa[key] = int(next_state)
return dfa
def is_accepted(dfa, input_str, current_state, accepting_states):
for i, symbol in enumerate(input_str):
key = (current_state, symbol)
if key in dfa:
current_state = dfa[key]
elif (current_state, '<eps>') in dfa: # Check for <eps> transition
current_state = dfa[(current_state, '<eps>')]
else:
# If there is no transition for the current symbol or <eps>, reject the string
return False
# If it's the last symbol and the current state is not accepting, check for <eps> transition
if i == len(input_str) - 1 and current_state not in accepting_states:
if (current_state, '<eps>') in dfa:
current_state = dfa[(current_state, '<eps>')]
if current_state in accepting_states:
return True
return current_state in accepting_states
# Set of accepting states
accepting_states = {2,5}
dfa_file = sys.argv[1]
dfa = load_data(dfa_file)
for line in sys.stdin:
input_str = line.strip()
start_state = 0
if is_accepted(dfa, input_str, start_state, accepting_states):
print("YES", input_str)
else:
print("NO", input_str)

BIN
TaskC04/test.exp Normal file

Binary file not shown.

67
TaskC05/run.py Normal file
View File

@ -0,0 +1,67 @@
import codecs
import sys
def process_input(fsa, input_string):
current_state = 0
output = ""
for symbol in input_string:
if (current_state, symbol) in fsa:
current_state = fsa[(current_state, symbol)]
else:
return f"{input_string};OOV"
if (current_state, ";") in fsa:
current_state = fsa[(current_state, ";")]
code_paths = check_transition(fsa, current_state, 24)
if code_paths is None:
return f"{input_string};OOV"
for code in sorted(code_paths):
code_str = "".join(code)
output += f"{input_string};{code_str}\n"
return output
def check_transition(fsa, start_state, target_state):
def find_transitions(state, target_state, current_path, all_paths):
if state == target_state:
all_paths.append(current_path.copy())
return
for (s, symbol), next_state in fsa.items():
if s == state:
current_path.append(symbol)
find_transitions(next_state, target_state, current_path, all_paths)
current_path.pop()
current_state = start_state
all_paths = []
find_transitions(current_state, target_state, [], all_paths)
if not all_paths:
return None
return all_paths
fsa_file = "./multi.arg" # FSA FILE
fsa = {}
with open(fsa_file, 'r', encoding='utf-8') as f:
for line in f:
parts = line.strip().split('\t')
if len(parts) == 3:
state, next_state, symbol = parts
fsa[(int(state), symbol)] = int(next_state)
input_file_path = "./multi.in" # INPUT STRING
output_file_path = "test.exp" # OUTPUT FILE
with open(input_file_path, 'r', encoding='utf-8') as file, open(output_file_path, 'w', encoding='utf-8') as output_file:
for line in file:
input_string = line.strip()
result = process_input(fsa, input_string)
output_file.write(result)
# POCZĄTKOWO WSZYSTKIE ŚCIEŻKI DO PLIKÓW BYŁY PRZESYŁANE POPRZEZ TERMINAL ALE PRZEZ WZGLĄD NA POLSKIE ZNAKI MUSIAŁAM ZAMIESZCZAĆ ŚCIEŻKI DO PLIKÓW W KODZIE
# NIESTETY NIE UDAŁO MI SIĘ ZNALEŹĆ W JAKI SPOSÓB PRZESYŁAĆ PLIKI BY UŻYWAĆ UTF-8

2
TaskC05/test.exp Normal file
View File

@ -0,0 +1,2 @@
piła;N
piła;V

32
TaskC06/run.py Normal file
View File

@ -0,0 +1,32 @@
import sys
fsa_file = "./small2.in" # FSA FILE
fsa = {}
with open(fsa_file, 'r', encoding='utf-8') as f:
for line in f:
parts = line.strip().split('\t')
if len(parts) == 3:
state, next_state, symbol = parts
state, next_state = int(state), int(next_state)
if (state, '') not in fsa:
fsa[(state, '')] = {}
fsa[(state, '')][symbol] = next_state
output_file_path = "./test.txt" # OUTPUT FILE
def get_paths(current_state, current_path):
if (current_state, '') not in fsa:
return [current_path]
paths = []
for symbol, next_state in fsa[(current_state, '')].items():
paths += get_paths(next_state, current_path + symbol)
return paths
with open(output_file_path, 'w', encoding='utf-8') as output_file:
start_state = min(state for state, _ in fsa)
paths = get_paths(start_state, '')
for path in paths:
output_file.write(path + '\n')

4
TaskC06/test.txt Normal file
View File

@ -0,0 +1,4 @@
biały
dom
piła
stali