Нужно реализовать класс TextHistory, который хранит текст и историю его изменений.
Поддерживается три типа изменений — вставка текста (insert),
замена текста (replace) и удаление (delete).
Интерфейс:
h.text— текущий текст, read onlyh.version— текущая версия, read only. Начинается с 0 и только растет.h.insert(text, pos=pos)— вставить текст с позиции pos (по умолчанию — конец строки). Кидает ValueError, если указана недопустимая позиция. Возвращает номер новой версии.h.replace(text, pos=pos)— заменить текст с позиции pos (по умолчанию — конец строки). Кидает ValueError, если указана недопустимая позиция. Замена за пределами строки работает как вставка (т. е. текст дописывается). Возвращает номер новой версии.h.delete(pos, length)— удаляетlengthсимволов начиная с позицииpos. Возвращает номер новой версии.h.action(action)— применяет действиеaction(см. ниже). Возвращает номер новой версии. Версия растет не на 1, а устанавливается та, которая указана вaction.h.get_actions(from_version=v1, to_version=v2)— возвращаетlistвсех действий между двумя версиями.
Действия выражаются наследниками Action: InsertAction, ReplaceAction и DeleteAction.
Конструктор принимает позицию (pos) и строку (text) или позицию и длину (length),
а так же стартовую и конечную версию.
Если версии указаны неверно, кидается ValueError.
Единственный публичный метод apply принимает строку и возвращает модифицированную строку.
Метод get_actions должен уметь применять к полученному списку оптимизации, которые
сокращают количество действий. Например, очевидно, что последовательные insert('x', pos=42)
и insert('y', pos=43) можно заменить на insert('xy', pos=42).
Тестов на это нет, надо придумать минимум две любые оптимизации и реализовать.