lab2
This commit is contained in:
63
lab2/programm/finite_automaton.py
Normal file
63
lab2/programm/finite_automaton.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import random
|
||||
|
||||
|
||||
class FiniteAutomaton:
|
||||
def __init__(
|
||||
self,
|
||||
transitions: dict[str, list[tuple[str, str]]],
|
||||
initial_state: str,
|
||||
final_states: set[str],
|
||||
alphabet: set[str],
|
||||
):
|
||||
self.transitions = transitions
|
||||
self.initial_state = initial_state
|
||||
self.final_states = final_states
|
||||
self.alphabet = alphabet
|
||||
|
||||
def _get_next_state(self, current_state: str, char: str) -> str | None:
|
||||
if current_state in self.transitions:
|
||||
for transition, next_state in self.transitions[current_state]:
|
||||
if char in transition:
|
||||
return next_state
|
||||
return None
|
||||
|
||||
def process_input(self, input_string: str) -> tuple[str, list[str]]:
|
||||
current_state = self.initial_state
|
||||
transitions_path = [current_state]
|
||||
|
||||
for char in input_string:
|
||||
if char not in self.alphabet:
|
||||
return f"Символ '{char}' не из алфавита", transitions_path
|
||||
|
||||
next_state = self._get_next_state(current_state, char)
|
||||
|
||||
if next_state is None:
|
||||
return "Строка не соответствует", transitions_path
|
||||
|
||||
transitions_path.append(next_state)
|
||||
current_state = next_state
|
||||
|
||||
return (
|
||||
"Строка соответствует"
|
||||
if current_state in self.final_states
|
||||
else "Строка не соответствует"
|
||||
), transitions_path
|
||||
|
||||
def generate_random_string(self, stop_probability: float = 0.3) -> str:
|
||||
result = []
|
||||
current_state = self.initial_state
|
||||
|
||||
while True:
|
||||
if (
|
||||
current_state in self.final_states
|
||||
and random.random() < stop_probability
|
||||
):
|
||||
break
|
||||
|
||||
transition, next_state = random.choice(self.transitions[current_state])
|
||||
|
||||
char = random.choice(transition)
|
||||
result.append(char)
|
||||
current_state = next_state
|
||||
|
||||
return "".join(result)
|
||||
Reference in New Issue
Block a user