Редактор с выделением, буфером обмена и отменой

Задача по программированию с проверкой онлайн

Сложность
Сложная
Языки
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

Решить онлайнБесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).

Ещё задачи

Все задачи для тренировки