Задача про очередь в Python
Задали лабораторную в институте по написанию очереди в python, задачу решил, загрузил на платформу (ejudge), но вот на 13 тесте выдало ошибку «Превышено время работы программы >3 сек», в чем проблема вообще понять не могу. Вот условие:
Задача про очередь
Реализуйте очередь, используя только массив. Ввод и вывод данных
осуществляется через файлы. Имена входного и выходного файлов задаются
через аргументы командной строки (первый и второй соответственно).
Формат входных данных Во входном файле задаётся последовательность
команд. Пустые строки игнорируются. Первая строка всегда содержит
«set_size N», где N — максимальный размер очереди, целое число. Каждая
последующая строка содержит ровно одну команду: push X, pop или print,
где X — произвольная строка без пробелов. Формат результата Команда
print выводит содержимое очередь (от головы к хвосту) одной строкой,
значения разделяются пробелами. Если очередь пуста, то выводится
«empty». В случае переполнения очереди выводится «overflow». Команда
pop выводит элемент или «underflow», если очередь пуста. Память под
очередь должна быть выделена не более одного раза, при вызове команды
«set_size». В любой непонятной ситуации результатом работы любой
команды будет «error».
import sys
class Queue:
def __init__(self, size):
self.queue = []
self.size = size
def push(self, value):
if len(self.queue) < self.size:
return self.queue.append(value)
else:
return 'overflow'
def pop(self):
if self.queue:
first = self.queue[0]
del self.queue[0]
return first
else:
return 'underflow'
def print(self):
global text
if len(self.queue) > 0:
for i, element in enumerate(self.queue):
if i + 1 < len(self.queue):
text += element + ' '
else:
text += element
else:
text += 'empty'
text += 'n'
return
names = []
if __name__ == "__main__":
for args in sys.argv[1:]:
names.append(args)
in_file = names[0]
out_file = names[1]
f = open(in_file)
defined = False
text = ''
for i in f:
com = i.strip('n')
if com.split(' ')[0] == 'set_size' and not defined:
size = int(com.split(' ')[1])
q = Queue(size)
defined = True
elif com == 'pop' and defined:
text += q.pop() + 'n'
elif com.split(' ')[0] == 'push' and len(com.split(' ')) == 2 and defined:
value = com.split(' ')[1]
pt = q.push(value)
if pt is not None:
text += pt + 'n'
elif com == 'print' and defined:
q.print()
elif com == '':
continue
else:
text += 'errorn'
f.close()
f = open(out_file, 'w')
f.write(text)
f.close()
Окно выполнения тестов, на 13, почему то выдало ошибку
Для понятности залил на этот гит два файла, «input» — файл, который платформа тестирования подает на вход, а «output», это правильный ответ на задачу. Мою программу принудительно остановили (из-за превышения времени), и она ничего не выдала
https://github.com/RoyalGoose/testrepos
В чем может быть проблема? Как я могу исправить код, чтобы он работал быстрее и прошел бы этот тест?
Сообщение | Кратко | Сообщается ли номер теста? | Значение вердикта | Возможная причина |
---|---|---|---|---|
OK | OK | Нет | Решение зачтено | Программа верно работает на соответствующем наборе тестов |
Compilation error | CE | Нет | Компиляция программы завершилась с ошибкой | 1. в программе допущена синтаксическая или семантическая ошибка 2. неправильно указан язык |
Wrong answer | WA | Да | Ответ неверен | 1. ошибка в программе 2. неверный алгоритм |
Presentation error | PE | Да | Тестирующая система не может проверить выходные данные, так как их формат не соответствует описанному в условиях задачи | 1. неверный формат вывода 2. программа не печатает результат 3. лишний вывод |
Time-limit exceeded | TL | Да | Программа превысила установленный лимит времени | 1. ошибка в программе 2. неэффективное решение |
Memory limit exceeded | ML | Да | Программа превысила установленный в условиях лимит памяти | 1. ошибка в программе (например, бесконечная рекурсия) 2. неэффективное решение |
Output limit exceeded | OL | Да | Программа превысила установленный в условиях лимит вывода | 1. программа выводит больше информации, чем установлено в ограничениях |
Run-time error | RE | Да | Программа завершила работу с ненулевым кодом возврата | 1. ошибка выполнения 2. программа на C или C++ не завершается оператором return 0 3. ненулевой код возврата указан явно 4. Программа на Java описана в пакете |
Precompile check failed | PCF | Нет | Программа не прошла проверку на качество кода перед компиляцией | 1. плохое качество кода 2. неправильно отформатированный код |
Idleness limit exceeded | IL | Да | Программа слишком долго не отвечала на запросы системы и не выполняла действий | 1. программа ожидает ввода с консоли, которого не должно быть 2. не использован flush() |
0 / 4 / 0
Регистрация: 31.10.2016
Сообщений: 21
1
22.02.2018, 21:15. Показов 8422. Ответов 3
Решаю задачки на одном сайте, там есть онлайн компилятор. Моя VS справляется, но компилятор с сайта говорит Time limit exceeded. Т.к. задача состоит из нескольких классов опишу только проблемный.
В этом классе метод должен принимать List<List<string>> text (мы разбили большой текст на предложения, а после на слова, в конечном итоге List<List<string>> состоит только из слов с нижним регистром)
Сама задача: Биграмма — это пара соседних слов предложения. Например, из текста: «She stood up. Then she left.» можно выделить следующие биграммы «She stood», «stood up», «Then she» и «she left», но не «up then».
Составьте словарь, который для каждого слова W хранит вторую часть V, наиболее частотной биграммы (W, V), начинающейся с W. Такой словарь называется биграммной моделью текста.
Ключи этого словаря — это все слова, с которых начинается хотя бы одна биграмма исходного текста. В качестве значения должно быть второе слово самой частой биграммы, начинающейся с ключа.
Если есть несколько биграмм с одинаковой частотой, то использовать лексикографически первую(в алфавит порядке) (используйте способ сравнения Ordinal, например с помощью метода string.CompareOrdinal).
В итоге должны получить Dictionary<string,string>. Вот мой код программы, подскажите,что в нем не так, в нем есть ошибка, или его надо оптимизировать?Если оптимизировать, то помогите!
За говнокод сорри.
C# | ||
|
2
Навигация: Главная страница/Система ejudge/Использование/Вердикты тестирования/Ошибка превышения лимита реального времени
Английское название: Wall Time Limit Exceeded, WT
Данный статус введен в ejudge 2.3.25. В предыдущих версиях вместо данной ошибки диагностировалась ошибка превышения лимита времени.
При работе тестируемой программы возможна ситуация, когда программа не потребляет процессорного времени. Например, программа пытается считывать входные данные со стандартного потока ввода вместо чтения из файла, или выполняет какой-либо системный вызов типа sleep. В таком случае ограничение на процессорное время не позволяет снять процесс за разумное астрономическое время.
Разные тестирующие системы решают эту проблему по-разному. В системе ejudge проблема решается ограниченим максимального астрономического времени (см. астрономическое время) для работы программы (см. max_real_time_limit). Рекомендуется устанавливать ограничение астрономического времени в несколько раз большим, чем ограничение процессорного времени. Если превышено ограничение на астрономическое время, тестируемая программа также снимается с выполнения с данной диагностикой.
Hi the given code is here
int a, b, c, d, e, f;
int fn( int n ) {
if( n == 0 ) return a;
if( n == 1 ) return b;
if( n == 2 ) return c;
if( n == 3 ) return d;
if( n == 4 ) return e;
if( n == 5 ) return f;
return( fn(n-1) + fn(n-2) + fn(n-3) + fn(n-4) + fn(n-5) + fn(n-6) );
}
int main() {
int n, caseno = 0, cases;
scanf("%d", &cases);
while( cases-- ) {
scanf("%d %d %d %d %d %d %d", &a, &b, &c, &d, &e, &f, &n);
printf("Case %d: %dn", ++caseno, fn(n) % 10000007);
}
return 0;
}
It has two problems. One is integer overflow. And another is Time Limit Exceeded. I fixed the integer overflow using long int. But problem is with time. When I submit the code, the online judge shows Time Limit Exceeded. Please help me to fix this problem.