Задача "удаление" символов из строки

Тренажер представляет из себя серию заданий: запрос к пользователю набрать некоторую строку a.

После этого пользователь должен как можно быстрее набрать на экране строку a, используя только латинские буквы и клавиши управления.

Вася решил записывать все нажатия клавиш пользователя в отдельный лог. В нем присутствуют маленькие латинские буквы, а также управляющие конструкции

  • <delete> Удаление символа после текущей позиции курсора.

  • <bspace> Удаление символа перед текущей позицией курсора.

  • <left> Курсор перемещается влево на один символ.

  • <right> Курсор перемещается вправо на один символ.

Если управляющая конструкция перемещает курсор за границы текущей строки или пытается удалить несуществующий символ, то ничего не происходит.

Теперь у Васи есть строчка, которую должен был набрать пользователь, и последовательность нажатий клавиш, считанная из лога. Помогите Васе выяснить, справился ли пользователь с заданием!

Формат ввода

Даны две строки a и b, разделённые переводом строки, — задание пользователя и последовательность нажатий клавиш (1 ≤ |a|, |b| ≤ 1000).

Формат вывода

Если пользователь справился с заданием, выведите "Yes" (без кавычек), в противном случае выведите "No".

Код:

word = input()
task = [a for a in input().replace("<delete>", '|-|').replace("<bspace>", '|--|').replace("<left>", '|>|').replace("<right>", '|<|').split('|') if a]


ans = ''
curr_pos = 0

for t in task:
    if t == '>':
        if curr_pos > 0:
            curr_pos -= 1
    elif t == '<':
        if curr_pos < len(ans):
            curr_pos += 1
    elif t == '-':
        if curr_pos < len(ans):
            ans = ans[:curr_pos] + ans[curr_pos + 1:]
    elif t == '--':
        if curr_pos > 0:
            ans = ans[:curr_pos - 1] + ans[curr_pos:]
            curr_pos -= 1
    else:
        ans = ans[:curr_pos] + t + ans[curr_pos:]
        curr_pos += len(t)

if word == ans:
    print("Yes")
else:
    print("No")

Вроде все сделал, но тест не проходит какой-то. В чем косяк может быть?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Два стека висят слева и справа от курсора:

import re

word = input()

left = []
right = []

for m in re.finditer('<delete>|<bspace>|<left>|<right>|[a-z]', input()):
    match m.group():
        case '<delete>':
            if right:
                right.pop()
        case '<bspace>':
            if left:
                left.pop()
        case '<left>':
            if left:
                right.append(left.pop())
        case '<right>':
            if right:
                left.append(right.pop())
        case letter:
            left.append(letter)

print('Yes' if word == ''.join(left + right[::-1]) else 'No')
→ Ссылка