Редактор с выделением, буфером обмена и отменой
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- Python
- JavaScript
- TypeScript
- Java
- Go
- Темы
- Классы и ООП
- Строки
- Стек, очередь, связные списки
Реализуйте однострочный текстовый редактор. Сначала текст пуст, курсор в позиции 0, выделения нет, буфер обмена пуст. Дан список команд commands; каждая команда — список строк: имя и аргументы (числа записаны десятичными строками). После каждой команды добавьте в ответ состояние редактора: текст, в который в позицию курсора вставлен символ |, а если есть выделение — текст, в котором выделенная часть обрамлена [ и ] (тогда | не пишется).
Команды:
["type", s]: вставить непустую строкуs(буквы, цифры, пробелы) в позицию курсора; если есть выделение,sзаменяет его. Курсор встаёт после вставленного, выделение снимается.["select", a, b]: выделить символы с позицииmin(a, b)доmax(a, b)(не включая её); оба числа сначала прижимаются к отрезку[0, длина текста]. Если они совпали, выделения нет, а курсор встаёт в эту позицию.["left", k],["right", k](k≥ 0): при выделении курсор встаёт в его начало (left) или конец (right), выделение снимается,kне важно; без выделения курсор сдвигается наk, не выходя за края текста.["backspace"]: удалить выделение, а без него — символ перед курсором (в начале текста ничего не происходит).["copy"]: положить выделенный текст в буфер (без выделения ничего не происходит).["cut"]: то же и удалить выделение.["paste"]: какtypeс содержимым буфера; при пустом буфере ничего не происходит.["undo"]: отменить последний шаг изменения текста и вернуть текст, курсор и выделение такими, какими они были перед этим шагом.["redo"]: вернуть последний отменённый шаг (состояние сразу после него). Если отменять или возвращать нечего, ничего не происходит.
Шаг изменения — каждая команда type, backspace, cut или paste, которая изменила текст; такая команда очищает список шагов для redo. Исключение: type, перед которой в списке стоит тоже type, не создаёт новый шаг, а продолжает шаг предыдущей, так что одна undo отменяет обе. До 300 команд.
Пример: [["type", "hi"], ["type", "!"], ["undo"]] → ["hi|", "hi!|", "|"].
Источник: задача CodeShare