Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2016 00:53:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

sharkk
Все тесты твои проходит, а на сайте универа - нет.

Я ничего не добавлял, ты просто не запускал тесты
[guest@localhost oneedit]$ python3 -m doctest oneedit3.doct 
**********************************************************************
File "oneedit3.doct", line 27, in oneedit3.doct
Failed example:
f(-1, '', 'a')
Expected:
''
Got:
'a'
**********************************************************************
File "oneedit3.doct", line 39, in oneedit3.doct
Failed example:
f(0, 'a', 'Rb')
Expected:
'ab'
Got:
'ba'
**********************************************************************
File "oneedit3.doct", line 41, in oneedit3.doct
Failed example:
f(0, 'a', 'RRb')
Expected:
'ab'
Got:
'ba'
**********************************************************************
File "oneedit3.doct", line 48, in oneedit3.doct
Failed example:
f(0, 'a', 'RbLLc')
Expected:
'cab'
Got:
'cba'
**********************************************************************
File "oneedit3.doct", line 50, in oneedit3.doct
Failed example:
f(1, 'a', 'LbRRc')
Expected:
'bac'
Got:
'bca'
**********************************************************************
File "oneedit3.doct", line 53, in oneedit3.doct
Failed example:
f(0, 'a', 'LRb')
Expected:
'ab'
Got:
'ba'
**********************************************************************
File "oneedit3.doct", line 55, in oneedit3.doct
Failed example:
f(0, 'a', 'LLRb')
Expected:
'ab'
Got:
'ba'
**********************************************************************
File "oneedit3.doct", line 57, in oneedit3.doct
Failed example:
f(0, 'a', 'LLLRb')
Expected:
'ab'
Got:
'ba'
**********************************************************************
1 items had failures:
8 of 37 in oneedit3.doct
***Test Failed*** 8 failures.
[guest@localhost oneedit]$

Это короткий, длинный, новый длинный.
[guest@localhost oneedit]$ ./oneeditcmp.py 
[4.688379621999957, 4.692161592000048, 4.687527015999876]
[2.4444403080001393, 2.4103668410002683, 2.424508097999933]
[2.4301258609998513, 2.449462324999786, 2.420072983999944]
[guest@localhost oneedit]$

И я смотрю, ты всё ещё возвращаешь список, надо-то возвращать строку.
Вот пример короткого, возвращающего строку.
def k(p, text, command):
    text = list(text)
    for i in command:
        if i.islower():
            text.insert(p, i)
            p += 1
        if i == 'L':
            p -= 1
        if i == 'R':
            p += 1
        if i == 'X':
            text.pop(p)
    return ''.join(text)



Отредактировано py.user.next (Апрель 4, 2016 00:57:48)

Офлайн

#2 Апрель 6, 2016 16:37:29

sharkk
Зарегистрирован: 2015-12-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

В две секунды все равно не укладывается.
Надо делать линкед лист наверно)

Офлайн

#3 Апрель 6, 2016 17:19:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

Сделай её хотя бы раз правильно. Ни одного решения не выдал, все с ошибками. Это гораздо важнее скорости.
Я нашёл один сайт с этой задачей, будет время - посмотрю, как решить.
Твой короткий вариант (неправильный который) даёт 3.5 секунды.

sharkk
Надо делать линкед лист наверно)
Ну, да, либо два стека. Хотя сам список можно сделать на базе двух стеков.



Отредактировано py.user.next (Апрель 6, 2016 17:34:27)

Офлайн

#4 Апрель 6, 2016 20:05:53

sharkk
Зарегистрирован: 2015-12-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

Этот вариант заваливается по пределу времени на 7 тесте из 10.

def k(p, text, command):
text_before = list(text[:p])
text_after = list(text[p:])
cur = len(text_after)
if p < 0:
p = 0
if p > len(text):
p = len(text)
else:
for i in command:
if i.islower():
text_before.append(i)
p += 1
if i == 'L' and text_before != []:
if p == -1:
p = 0
else:
text_after.insert(0, text_before.pop())
p -= 1
cur += 1
if i == 'R' and text_after != []:
if cur == -1:
cur = 0
else:
text_before.append(text_after.pop(0))
p += 1
cur -= 1
if i == 'X' and text_after != []:
if cur == -1:
cur = 0
else:
text_after.pop(0)
cur -= 1
return text_before + text_after

print(''.join(k(int(input()), str(input()), str(input()))))
Этот аналогично падает по времени. Я просто вывожу в ответ немного по другому
def k(p, text, command):
text = list(text)
for i in command:
if i.islower():
text.insert(p, i)
p += 1
if i == 'L':
p -= 1
if i == 'R':
p += 1
if i == 'X':
text.pop(p)
return text

print(''.join(k(int(input()), str(input()), str(input()))))

Отредактировано sharkk (Апрель 6, 2016 20:09:49)

Офлайн

#5 Апрель 7, 2016 01:48:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

sharkk
Я просто вывожу в ответ немного по другому
Ну, ты подаешь строку, а возращаешь список, а потом типа каждый раз будешь строку получать. И всё это ты сделал, чтобы ускорить функцию - это халтура и говнокодерство.
Если ты подал строку, то и получить должен строку. Потому что эта строка должна быть готова к использованию в других алгоритмах.

Вот тебе пример
print(k(0, 'abcd', 'defg'))
и вот
print(k(1, k(3, 'abcd', 'X').upper(), 'defg'))
Куда ты собрался свои join'ы вставлять здесь?

Хоть этот тест и подаёт отрицательный индекс, но алгоритм не должен его пропускать.
[guest@localhost oneedit]$ python3 -m doctest oneedit4.doct 
**********************************************************************
File "oneedit4.doct", line 27, in oneedit4.doct
Failed example:
f(-1, '', 'a')
Expected:
''
Got:
'a'
**********************************************************************
1 items had failures:
1 of 37 in oneedit4.doct
***Test Failed*** 1 failures.
[guest@localhost oneedit]$

Добавил его в замеры.
[guest@localhost oneedit]$ ./oneeditcmp.py 
[4.911109806999775, 4.887167595000392, 4.959216190999996]
[2.5055572030000803, 2.5339830960001564, 2.497651128000143]
[2.470925120999709, 2.5043154899999536, 2.434840758000064]
[2.506145970000034, 2.4773937669997395, 2.492269657000179]
[guest@localhost oneedit]$



Отредактировано py.user.next (Апрель 7, 2016 01:50:23)

Офлайн

#6 Апрель 7, 2016 06:11:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

Посмотрел вариант с двусвязным списком - то же самое всё. Так что, я думаю, там какой-то прикол с самими командами. Допустим, если там p = 1 и LRLRLR, то там вообще ничего двигать не надо, так как они друг друга поглощают.
Так что хранить строку с текстом надо простым способом, а сами команды перед разбором преобразовать. Потому что там длина - 100000 команд может превратиться в 10 команд.



Отредактировано py.user.next (Апрель 7, 2016 06:15:16)

Офлайн

#7 Апрель 7, 2016 14:13:42

sharkk
Зарегистрирован: 2015-12-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача. Текстовый редактор

py.user.next
Ну, ты подаешь строку, а возращаешь список, а потом типа каждый раз будешь строку получать. И всё это ты сделал, чтобы ускорить функцию - это халтура и говнокодерство.
Если ты подал строку, то и получить должен строку. Потому что эта строка должна быть готова к использованию в других алгоритмах.
Спасибо, учту на будущее.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version