Задача Дек на яндексе контесте
Помогите пожалуйста с задачей на яндекс контесте. вот так удалось решить не без помощи интернета, но проверяющий хочет доработки. вот скриншот
Если перехватываю SizeError то программа не работает. А по поводу распаковки не пойму как сделать(
Задание:
Гоша реализовал структуру данных Дек, максимальный размер которого определяется заданным числом. Методы
push_back(x),push_front(x),pop_back(),pop_front()работали корректно. Но, если в деке было много элементов, программа работала очень долго. Дело в том, что не все операции выполнялись за O(1). Помогите Гоше! Напишите эффективную реализацию.Внимание: при реализации используйте кольцевой буфер.
Формат ввода
В первой строке записано количество команд n — целое число, не превосходящее 100000. Во второй строке записано число m — максимальный размер дека. Он не превосходит 50000. В следующих n строках записана одна из команд:
push_back(value)– добавить элемент в конец дека. Если в деке уже находится максимальное число элементов, вывести «error».push_front(value)– добавить элемент в начало дека. Если в деке уже находится максимальное число элементов, вывести «error».pop_front()– вывести первый элемент дека и удалить его. Если дек был пуст, то вывести «error».pop_back()– вывести последний элемент дека и удалить его. Если дек был пуст, то вывести «error».
Value— целое число, по модулю не превосходящее 1000.Формат вывода
Выведите результат выполнения каждой команды на отдельной строке. Для успешных запросов
push_back(x)иpush_front(x)ничего выводить не надо.
Вот сам код:
def SizeError(Exception):
pass
class Deque:
def __init__(self, max_size: int) -> None:
self.__max_size: int = max_size
self.__queue: list = [None] * max_size
self.__head: int = 0
self.__tail: int = 0
self.__size_of: int = 0
def push_back(self, value: str) -> None:
if self.__size_of == self.__max_size:
raise SizeError
else:
if self.__queue[self.__tail]:
self.__tail = (self.__tail + 1) % self.__max_size
self.__queue[self.__tail] = value
self.__size_of += 1
def pop_back(self) -> None:
if self.__size_of == 0:
raise SizeError
else:
x = self.__queue[self.__tail]
self.__queue[self.__tail] = None
if self.__size_of > 1:
self.__tail = (self.__tail - 1) % self.__max_size
self.__size_of -= 1
print(x)
def pop_front(self) -> None:
if self.__size_of == 0:
raise SizeError
else:
x = self.__queue[self.__head]
self.__queue[self.__head] = None
if self.__size_of > 1:
self.__head = (self.__head + 1) % self.__max_size
self.__size_of -= 1
print(x)
def push_front(self, value: str) -> None:
if self.__size_of == self.__max_size:
raise SizeError
else:
if self.__queue[self.__head]:
self.__head = (self.__head - 1) % self.__max_size
self.__queue[self.__head] = value
self.__size_of += 1
def main() -> None:
n: int = int(input())
max_size: int = int(input())
queue: Deque = Deque(max_size)
for i in range(n):
values: list = input().split()
try:
getattr(queue, values.pop(0))(*values)
except Exception:
print('error')
if __name__ == '__main__':
main()
Ответы (1 шт):
По поводу распаковки. Вот так в command попадет название команды, в arguments - все остальное.
values: list = input().split()
command, *arguments = values
Далее по поводу исключений. Ожидаемые исключения - это конкретные исключения, которые в этом блоке try-except могут возникнуть. Т.е. это конкретные классы исключений, вместо общего класса Exception.
Сначала убираете ваш try-except вообще или делаете печать исключения:
def main() -> None:
n: int = int(input())
max_size: int = int(input())
queue: Deque = Deque(max_size)
for i in range(n):
values: list = input().split()
command, *arguments = values
getattr(queue, command)(*arguments)
Пробуете разными способами сломать вашу программу, записываете все возникающие исключения. Например, пробуете вводить несуществующую команду, недостаточное количество аргументов, лишние аргументы, и т.д., потом добавляете except на соответствующие случаи.
Потом возвращаете try-except обратно, добавляете except на каждый тип исключения с выводом конкретной ошибки.
def main() -> None:
n: int = int(input())
max_size: int = int(input())
queue: Deque = Deque(max_size)
for i in range(n):
values: list = input().split()
command, *arguments = values
try:
getattr(queue, command)(*arguments)
except SizeError:
print("Ошибка размера Deque")
except AttributeError:
# Введено имя, которое не является именем метода класса Deque
print("Неизвестная команда")
except TypeError:
# Ошибка возникает, например, если введено больше или меньше параметров чем нужно,
# или например при попытке вызвать метод __init__
print("Неправильный формат команды")
... # Аналогично обрабатываете другие ошибки
В конце можно добавить except Exception:, но обязательно с выводом фактической ошибки с полным стектрейсом (например, через traceback.print_exception(), чтобы вы могли понять, какая именно проблема произошла), а не просто с выводом "error".
