В те туманные годы, когда по земле шли веерные терминалы, там жили странные существа. Странно покалеченный и в то же время странно мощный, линейный редактор изобиловал неисчислимыми числами программистов; покрывая землю, насколько глаз мог видеть.
Теперь настали трудные времена. Это огромное население охотилось, преследовало и доведено до грани исчезновения. Осталось только несколько экземпляров, большинство в тесных и неукрашенных клетках в менее просвещенном зоопарке, хотя несколько чучел и конных образцов можно увидеть в захолустных музеях. Ох, и есть ed
.
Подобно Франкенштейну, мы воскресим благородного зверя!
команды
Наш редактор довольно минимален и будет поддерживать следующие команды
Фокус движущихся команд
<number>[,<number>]
- переместить фокус на указанную строку и, если второй аргумент задан столбцу состояния. Чрезмерный номер строки получает последнюю строку. Чрезмерный номер столбца получает конец строки.,<number>
- перейти к номеру столбца в текущей строкеe
- переместить фокус в конец файла, но не начинать новую строку.b
- переместить фокус в начало файла.
Информационные команды
L
- Эхо текущего контекста. Печатается пять строк по центру текущей строки. Все пять строк имеют отступ от одного символа; текущая строка отмечена ">", остальные - "". Под этими строками печатается другая строка, состоящая полностью из пробелов, за исключением символа «^» в текущем столбце (всего печатаются шесть строк).l
- повторить текущую строкуp [[<start>],[<end>]]
- Распечатать файл от начального до конечного адреса. Эти значения по умолчанию равны 1 и 0 (конец файла).
Команды изменения файлов
A [<text>]
- Перейти к строке за концом файла (то есть начать новую строку) и (возможно) добавить текст.<return>
(один) - Вставить новую строку. Таким образомa <return> <return>
вставляет новую строку после текущей.r <text>
- заменяет все от фокуса до конца строки текстом.i [<text>]
- вставляет текст, за которым следует новая строка в текущем фокусе. Любая часть этой строки за пределами фокуса попадает на следующую строку.I <text>
- вставляет текст в текущий фокус, сохраняя остальную часть строки. Фокус остается на этой линии.d
- Удалить содержимое текущей строки или, если текущая строка уже пуста, удалить строку.j
- присоединить эту строку к следующей
Из этой последней группы первые четыре заканчиваются фокусом, перемещающимся на следующую строку, в то же время I
сохраняя фокус в конце добавленного текста. При удалении или присоединении фокус остается в той же строке и номер столбца .
Интерпретация номеров строк в командах
Числа, начинающиеся с «+» или «-», интерпретируются как смещения от номера текущей строки. Числа без знака интерпретируются как абсолютные номера строк, за исключением того, что «0» означает последнюю строку файла.
Оперативность и взаимодействие
Редактор работает как оболочка, а подсказка имеет форму, <line>','<column>'>'
где строка - это номер строки, за исключением того, что «конец» используется, когда фокус находится на последнем символе файла.
Каждая команда принимается только тогда, когда пользователь нажимает перевод строки. И вступает в силу.
Поддержка Readline разрешена, но не обязательна.
Обратная связь не предоставляется, за исключением изменения значений и в приглашении, если это явно не указано в описании команд.
счет
Это Код-гольфпоэтому самый короткий ответ на каждом языке выигрывает.
Ответы:
C (gcc),
12881212118811711146 байтдемонстрация
В первый раз пытаюсь сделать что-то подобное, так что, вероятно, есть некоторые упущенные возможности сделать его меньше. (Спасибо Джерри Иеремии за то, что указал на некоторые)
Вот (немного) более читаемая версия:
Эта проблема оставляет довольно много угловых случаев для изучения - я думаю, я уже исправил все ошибки, но если кто-то найдет еще одну, пожалуйста, прокомментируйте. Что касается ревизий, я удалил подсчет байтов для более ранних версий, которые содержали незначительные ошибки.
источник
D
после цикла, я думаю , что вы можете сохранить байты, заменив ссылки наo-1
иo
сo
,--o
,o
,o
,++o
. Кроме того, вы можете делать аналогичные вещиx
в той же области.--o
для первогоo-1
здесь будет UB, потому что это не секвенируется с другим доступомo
:(AWK ,
747 807 829807 байтПопробуйте онлайн!
Удаление
else
s делает строки немного короче / читабельнее, но назначение курсора немного сложнее.Просто для смеха я создал версию, чтобы добавить немного больше «функциональности»:
q
выходит из программыw <outfile[defaults to input file]>
пишет изменения.Попробуйте онлайн!
источник
L
командой здесьend>
в позиции EOF, а ваша -end,[col]>
в последней строке. оба не совсем то , что указано, я думаю ...Сборка 6502 (загрузчик C64, BASIC),
57615352 байтадемонстрация
Эта запись просто для развлечения и, вероятно, никогда не достигнет приличного количества байтов. Это просто потому, что задача о каком-то «древнем» инструменте, почему бы не реализовать его для древней машины;)
В процессе создания этой вещи мне еще раз напомнили, что система C64 не предоставляет какого-либо разумного способа преобразования между строками и целыми числами - покрываются только строки и числа с плавающей точкой, и это смешно, так что этот фрагмент кода содержит собственный процедуры преобразования. Фактически, единственными вызываемыми подпрограммами ОС являются
GETIN
(чтение одного символа с клавиатуры) иCHROUT
(запись одного символа на экран).Сейчас сборка, пожалуй, самый "плохой" язык в мире. Для того, чтобы «сыграть в гольф», моя идея, как показано здесь, - это загрузчик BASIC, записывающий байты финального двоичного файла в какую-то ячейку памяти и прыгающий туда. Таким образом, это рабочая ОСНОВНАЯ программа;) Если у кого-то есть идея, как играть в гольф, оставьте комментарий!
Текстовый буфер довольно ограничен, занимая пространство между
$6000
и$BFFF
(BASIC ROM отключен, поскольку он не нужен), и сама программа находится в$C000
. В общем, есть место для 255 строк по 95 символов в каждой, и программа не выполняет никаких проверок границ, поэтому, играя с этим, убедитесь, что ваши строки не становятся слишком большими;)Наконец, ищите читаемый источник , включая мой «инструмент для игры в гольф».
Поскольку это довольно ограниченный материал, и C64 может добиться большего успеха, вот «роскошная версия» с использованием 80 колонок. Чтобы сделать это, Kernal должна быть отключена, поэтому основные вещи , как драйвер клавиатуры, шрифт, растровый манипуляции логики для вывода, обработку прерываний и т.д. , должны быть включены, поэтому это довольно сложная задача , чтобы соответствовать все это в 4K области
$C000-$CFFF
(и это необходим для загрузки программы из основной программы для работы).Несколько случайных фактов об этой версии:
но узко ... получил 6 "запасных" байтов, теперь36863841 байт;)137431338513963 байта (используется сохраненные байты для новой функции «редактирование строки»)$D000-$DFFF
$E000-$FF3F
, свободно доступную, потому что ядро выключеноq
выходит из редактораRIGHT
иLEFT
, Pos1 (HOME
), End (SHIFT + HOME
) и Backspace (DEL
)демонстрация
Программу наберите в себе, если вы хотите 80-е ощущения от компьютера:
Читаемый исходный код .
источник