2023-05-06 15:16:58 +02:00
|
|
|
ANSI_COLOR_RESET = "\x1b[0m"
|
|
|
|
|
ANSI_COLOR_YELLOW = "\x1b[33m"
|
|
|
|
|
ANSI_BOLD = "\x1b[1m"
|
|
|
|
|
ANSI_COLOR_GREEN = "\x1b[32m"
|
|
|
|
|
|
|
|
|
|
CONSOLE_COLOR_DEFAULT = ANSI_COLOR_RESET
|
|
|
|
|
CONSOLE_COLOR_PROMPT = ANSI_COLOR_YELLOW
|
|
|
|
|
CONSOLE_COLOR_USER_INPUT = ANSI_BOLD + ANSI_COLOR_GREEN
|
|
|
|
|
|
2024-07-09 12:20:17 -04:00
|
|
|
|
2023-05-06 15:16:58 +02:00
|
|
|
# Iterative search
|
|
|
|
|
# Actively searches and prevents a pattern from being returned
|
|
|
|
|
class IterSearch:
|
2024-07-09 12:20:17 -04:00
|
|
|
def __init__(self, pattern):
|
|
|
|
|
self.pattern = list(pattern)
|
|
|
|
|
self.buffer = []
|
2023-05-06 15:16:58 +02:00
|
|
|
|
2024-07-09 12:20:17 -04:00
|
|
|
def __call__(self, char):
|
|
|
|
|
self.buffer += [char]
|
2023-05-06 15:16:58 +02:00
|
|
|
|
2024-07-09 12:20:17 -04:00
|
|
|
if self.pattern[: len(self.buffer)] == self.buffer:
|
|
|
|
|
if len(self.buffer) >= len(self.pattern):
|
|
|
|
|
self.buffer.clear()
|
|
|
|
|
return []
|
2023-05-06 15:16:58 +02:00
|
|
|
|
2024-07-09 12:20:17 -04:00
|
|
|
_tmp = self.buffer[:]
|
|
|
|
|
self.buffer.clear()
|
|
|
|
|
return _tmp
|
2023-05-06 15:16:58 +02:00
|
|
|
|
|
|
|
|
|
2024-07-09 12:20:17 -04:00
|
|
|
class Circle:
|
|
|
|
|
def __init__(self, size, default=0):
|
|
|
|
|
self.list = [default] * size
|
|
|
|
|
self.maxsize = size
|
|
|
|
|
self.size = 0
|
|
|
|
|
self.offset = 0
|
|
|
|
|
|
|
|
|
|
def append(self, elem):
|
|
|
|
|
if self.size < self.maxsize:
|
|
|
|
|
self.list[self.size] = elem
|
|
|
|
|
self.size += 1
|
|
|
|
|
else:
|
|
|
|
|
self.list[self.offset] = elem
|
|
|
|
|
self.offset = (self.offset + 1) % self.maxsize
|
|
|
|
|
|
|
|
|
|
def __getitem__(self, val):
|
|
|
|
|
if isinstance(val, int):
|
|
|
|
|
if 0 > val or val >= self.size:
|
|
|
|
|
raise IndexError("Index out of range")
|
|
|
|
|
return (
|
|
|
|
|
self.list[val]
|
|
|
|
|
if self.size < self.maxsize
|
|
|
|
|
else self.list[(self.offset + val) % self.maxsize]
|
|
|
|
|
)
|
|
|
|
|
elif isinstance(val, slice):
|
|
|
|
|
start, stop, step = val.start, val.stop, val.step
|
|
|
|
|
if step is None:
|
|
|
|
|
step = 1
|
|
|
|
|
if start is None:
|
|
|
|
|
start = 0
|
|
|
|
|
if stop is None:
|
|
|
|
|
stop = self.size
|
|
|
|
|
if start < 0:
|
|
|
|
|
start = self.size + start
|
|
|
|
|
if stop < 0:
|
|
|
|
|
stop = self.size + stop
|
|
|
|
|
|
|
|
|
|
indices = range(start, stop, step)
|
|
|
|
|
return [
|
|
|
|
|
self.list[(self.offset + i) % self.maxsize]
|
|
|
|
|
for i in indices
|
|
|
|
|
if i < self.size
|
|
|
|
|
]
|
|
|
|
|
else:
|
|
|
|
|
raise TypeError("Invalid argument type")
|
2023-05-06 15:16:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2024-07-09 12:20:17 -04:00
|
|
|
c = Circle(5)
|
|
|
|
|
|
|
|
|
|
c.append(1)
|
|
|
|
|
print(c.list)
|
|
|
|
|
print(c[:])
|
|
|
|
|
assert c[0] == 1
|
|
|
|
|
assert c[:5] == [1]
|
|
|
|
|
|
|
|
|
|
for i in range(2, 5 + 1):
|
|
|
|
|
c.append(i)
|
|
|
|
|
print(c.list)
|
|
|
|
|
print(c[:])
|
|
|
|
|
assert c[0] == 1
|
|
|
|
|
assert c[:5] == [1, 2, 3, 4, 5]
|
|
|
|
|
|
|
|
|
|
for i in range(5 + 1, 9 + 1):
|
|
|
|
|
c.append(i)
|
|
|
|
|
print(c.list)
|
|
|
|
|
print(c[:])
|
|
|
|
|
assert c[0] == 5
|
|
|
|
|
assert c[:5] == [5, 6, 7, 8, 9]
|
|
|
|
|
# assert c[:-5] == [5,6,7,8,9]
|
|
|
|
|
assert c[:10] == [5, 6, 7, 8, 9]
|