Initial
This commit is contained in:
commit
a355de5d8b
24 changed files with 1133 additions and 0 deletions
33
advent/common/char_reader.py
Normal file
33
advent/common/char_reader.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
from advent.common.provider import EofException
|
||||
from .char_provider import CharProvider
|
||||
|
||||
|
||||
class ReaderException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class CharReader:
|
||||
@staticmethod
|
||||
def read_word(provider: CharProvider, word: str) -> str:
|
||||
result = ''
|
||||
for expected_char in word:
|
||||
try:
|
||||
char = provider.get()
|
||||
if char == expected_char:
|
||||
result += char
|
||||
else:
|
||||
raise ReaderException(f'Expected {word} but received {result}{char}')
|
||||
except EofException:
|
||||
raise ReaderException(f'Expected {word} but received {result}[EOF]')
|
||||
|
||||
return word
|
||||
|
||||
@staticmethod
|
||||
def read_unsigned_int(provider: CharProvider) -> int:
|
||||
if not provider.peek().isdigit():
|
||||
raise ReaderException('Expected unsigned int')
|
||||
|
||||
number = 0
|
||||
while not provider.finished() and provider.peek().isdigit():
|
||||
number = number * 10 + int(provider.get())
|
||||
return number
|
||||
Loading…
Add table
Add a link
Reference in a new issue