70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
|
class Machine:
|
||
|
_state: int = 0
|
||
|
|
||
|
def consume_character(self, char: str) -> None:
|
||
|
if self._state == 0:
|
||
|
if char == '1':
|
||
|
self._state = 1
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 1:
|
||
|
if char == '9':
|
||
|
self._state = 2
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 2:
|
||
|
if char == '1' or char == '2' or char == '3' or char == '4' or char == '5' or char == '6' or char == '7' or char == '8' or char == '9':
|
||
|
self._state = 3
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 3:
|
||
|
if char == '1' or char == '2' or char == '3' or char == '4' or char == '5' or char == '6' or char == '7' or char == '8' or char == '9':
|
||
|
self._state = 4
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 4:
|
||
|
if char == ' ':
|
||
|
self._state = 5
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 5:
|
||
|
if char == 'r':
|
||
|
self._state = 6
|
||
|
else:
|
||
|
self._state = 0
|
||
|
elif self._state == 6:
|
||
|
if char == '.':
|
||
|
self._state = 7
|
||
|
else:
|
||
|
self._state = 0
|
||
|
|
||
|
|
||
|
def is_success_state(self) -> bool:
|
||
|
return self._state == 7
|
||
|
|
||
|
def restart(self) -> None:
|
||
|
self._state = 0
|
||
|
|
||
|
def find_lines_with_date(text: str) -> list[int]:
|
||
|
output: list[int] = []
|
||
|
line_number = 0
|
||
|
machine = Machine()
|
||
|
for char in text:
|
||
|
machine.consume_character(char)
|
||
|
if char == '\n':
|
||
|
if machine.is_success_state():
|
||
|
output.append(line_number)
|
||
|
machine.restart()
|
||
|
line_number += 1
|
||
|
if machine.is_success_state():
|
||
|
output.append(line_number)
|
||
|
line_number += 1
|
||
|
return output
|
||
|
|
||
|
|
||
|
text: str = None
|
||
|
with open('polish_wiki_excerpt.exp', 'r', encoding='utf8') as file:
|
||
|
text = file.read()
|
||
|
|
||
|
result = find_lines_with_date(text)
|
||
|
print(result)
|