2023-12-10 21:57:29 +01:00
|
|
|
import pandas as pd
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import random
|
|
|
|
|
|
|
|
class Automat:
|
|
|
|
def __init__(self, df: pd.DataFrame, end_states: list):
|
|
|
|
self._df = df
|
|
|
|
self._end_states = end_states
|
|
|
|
|
|
|
|
def _consume_character(self, state: int, char: str):
|
|
|
|
filter = (self._df[0] == state) & (self._df[2] == char)
|
|
|
|
matching_rows = self._df[filter]
|
|
|
|
if matching_rows.empty:
|
|
|
|
return None
|
|
|
|
end_states = matching_rows.iloc[:,1].tolist()
|
|
|
|
return random.choice(end_states)
|
|
|
|
|
|
|
|
def consume_word(self, word: str):
|
2023-12-10 22:17:14 +01:00
|
|
|
prev_state = 0
|
2023-12-10 21:57:29 +01:00
|
|
|
state = 0
|
|
|
|
for char in word:
|
2023-12-10 22:17:14 +01:00
|
|
|
prev_state = state
|
2023-12-10 21:57:29 +01:00
|
|
|
state = self._consume_character(state, char)
|
|
|
|
if state is None:
|
2023-12-10 22:17:14 +01:00
|
|
|
return prev_state in self._end_states
|
2023-12-10 21:57:29 +01:00
|
|
|
return state in self._end_states
|
|
|
|
|
|
|
|
def create_automat_from_file(file_path: str):
|
|
|
|
automat_df = pd.read_csv(file_path, sep='\t', header=None)
|
|
|
|
|
|
|
|
end_states_condition = (automat_df[1].isnull()) & (automat_df[2].isnull())
|
|
|
|
end_states_df = automat_df[end_states_condition]
|
|
|
|
end_states = end_states_df.iloc[:,0].tolist()
|
|
|
|
|
|
|
|
automat_df = automat_df[~end_states_condition]
|
|
|
|
automat_df[2] = automat_df[2].astype(str)
|
|
|
|
|
|
|
|
return Automat(automat_df, end_states)
|
|
|
|
|
|
|
|
automat_path = os.path.join(os.path.dirname(__file__), 'test1.arg')
|
|
|
|
automat = create_automat_from_file(automat_path)
|
|
|
|
|
|
|
|
test_path = os.path.join(os.path.dirname(__file__), 'test1.in')
|
|
|
|
|
|
|
|
|
|
|
|
results = []
|
|
|
|
with open(test_path, 'r') as f:
|
|
|
|
for line in f:
|
|
|
|
results.append('YES' if automat.consume_word(line.strip()) else 'NO')
|
|
|
|
|
|
|
|
out_path = os.path.join(os.path.dirname(__file__), 'test1.out')
|
|
|
|
|
|
|
|
with open(out_path, 'w') as f:
|
|
|
|
for result in results:
|
|
|
|
f.write(result + '\n')
|