Ваша задача - смоделировать пару нажатий клавиш, которые вводит пользователь.
вход
Массив строк или строка с выбранным вами разделителем (вне диапазона 32-126), содержащая как минимум одно нажатие клавиши.
Этот массив будет содержать только два типа строк: пассивные нажатия клавиш (одиночные символы) и команды (символы в скобках [ ]
).
- Пассивные нажатия клавиш
- Коды символов ASCII
[32-126]
- Коды символов ASCII
- Команды:
[B]
: Backspace (удалить последний добавленный символ, если он есть)[C]
: скопировать все что уже написано[D]
: удалить все написанное[P]
: вставь что было скопировано
Выход
Строка, создаваемая клавишами.
Примеры
['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
[D]
где используется не единственный, так что код не будет простоsplit('[D]')[1]
или что-то в этом роде.[D]
Ответы:
05AB1E ,
34333127 байтИспользует кодировку CP-1252 .
Попробуйте онлайн!
объяснение
Пары функций, вычисленные в приведенном выше коде:
Сохранено 4 байта, используя
mod 5
трюк из ответа Линн CJamисточник
Вим,
76, 64, 62, 58 нажатий клавишСпасибо Loovjo за сохранение 7 нажатий клавиш
Кто-то сказал имитировать нажатия клавиш? Ну, это хорошая вещь , мой любимый язык для игры в гольф в это все о имитирующих нажатии клавиш!
Вход поступает в следующем формате:
Это довольно простой ответ. Он просто переводит каждую «команду» в комбинацию клавиш vim, эквивалентную этой команде. Давайте рассмотрим это построчно.
Это экономит тонну байтов. Vim имеет встроенную «командную строку», в которой вы можете создавать сопоставления, изменять настройки, сохранять файлы и т. Д. Здесь мы создаем сопоставление.
:no
сокращенно:nnoremap
означает «Когда мы находимся в нормальном режиме, замените эту левую часть этой правой стороны». Поскольку мы звоним:%s/
пять раз , это экономит много. Это\M
хороший трюк. Это означает, что следующий поиск будет «Very No Magic», что означает, что регулярное выражение[B]
будет соответствовать буквальному тексту,[B]
а не диапазону, содержащему только B. Поскольку большинство замещающих команд содержат квадратные скобки, мы заполняем первую.Затем мы вызываем пять замещающих команд. Стоит отметить, почему я звонил
<C-v>
так много раз. Символы , такие как<esc>
,<C-v>
,<C-r>
и т.д., непечатные символы, и должны быть введены в командной строки с<C-v>
.[B]: возврат. Это довольно легко. Просто замените каждый
[B]
наCtrl-h
, что эквивалентно backspace в vim.[C]: скопировать все, что уже было написано. Это переводится на
<esc>0y$A
. Это означает:Мы могли бы почти просто сделать
Y
вместо0y$
что означает «дергать всю строку», но это также захватывает новую строку, которая нам не нужна.[D]: удалить все написанное. Это
<esc>"_S
. Как и прежде,<esc>
выходит из режима вставки, чтобы мы могли запускать команды. Есть некоторые вещи, которые более удобны здесь. Итак, мы делаем[P]: вставить то, что было скопировано. Этот тоже очень простой. Это просто
<C-r>"
что значитInsert the contents of register '"'
."
оказывается основным регистром, к которому 'y' дергает.Теперь, когда мы перевели все команды, мы должны объединить все строки, удалив все символы новой строки. Благодаря нашему картографированию, это просто
Это
<bs>
возврат (ASCII 0x08), и он нам нужен из-за[
заполнения.К настоящему времени мы перевели ввод в код vim, и нам просто нужно его запустить. Итак, мы:
источник
<C-r>
задокументировано влияние режима вставки ?:h mode_keystroke
. В этом случае это будет:h i_ctrl-r
/g
флаге. Я добавлю эти детали в.0ii<esc>D@"
?CJam , 33 байта
Попробуйте онлайн!
объяснение
«Хэш-функция»
1>3b
карты[B]
до 291 (= 1 мод 5),[D]
до 297 (= 2 мод 5),[P]
до 333 (= 3 мод 5),[C]
до 294 (= 4 мод 5).Это значение (мод 5) используется в качестве индекса в списке фрагментов кода CJam:
h
фрагмент"h"
, который помещает односимвольную строку в стек.[B]
,;
возвращается фрагмент , который выскакивает элемент.[D]
фрагмент];
, который очищает стек.[P]
фрагментL~
, который добавляет переменнуюL
в стек.[C]
,]:L~
возвращается фрагмент , который сохраняет текущий стек в переменнойL
.Эти фрагменты связаны и выполнены; окончательный стек печатается неявно CJam.
L
изначально пустой список, поэтому буфер копирования изначально «пустой».источник
Python 2,
969593 байтаисточник
or"E"
к определению,x
чтобы сэкономить место?x
не стоит.x=="C"
Может быть простоo=="[C]"
.Желе ,
50 5148 байтTryItOnline
или все тесты
Как?
Например
- с заглавной буквы
'B'
в качестве контрольного примера, так как до того, как я исправил ошибку, он бы вернулся"I likeees!"
источник
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 байтБлагодаря @Neil сохранено 3 байта, еще один - @ edc65
.map
на два байта длиннее:Тестовый фрагмент
Показать фрагмент кода
источник
reduce
версии с помощью(s,[c,z])
..map
версии тоже.x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')
На 1 байт меньше Любопытно, что неопределенный <любой символ неверенx=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")
сохраняет еще один символ Если z правдив, вставьте, иначе добавьте char к выводу.z?s+t:s+c
что это на 1 байт большеs+=z?t:c
Perl,
5350 байтВключает +1 для
-p
Введите ввод в STDIN, завершенный символом новой строки (последний символ новой строки может быть пропущен, поэтому он считается строкой, разделенной символом новой строки):
дает
keystrokes.pl
:Почти поймал ответ желе, но злодей ушел на 48 байтов ...
источник
Python
120 119116 байтIdeone
Рекурсивная функция с вводом,
s
список нажатий клавиш.Каждый рекурсивный вызов обновляет текст возврата
r
и, в случае[C]
буфера обмена,c
пока неs
станет пустым.Новые ценности
r
иc
найдены путем индексации в словарь,{...}
и передаются с распаковкой*
. Для пассивных нажатий клавишs[0][1:2]
вернется пустая строка, и''
вместо нее будет использован ключ .источник
lambda s,r='',c=''
вместоlambda s,r,c=''
?s
), поэтому функция должна работать без другого ввода.Хаскелл,
136 133 130127 байтПопробуйте это на Ideone.
Объяснение:
k
выполняет хвостовую рекурсию по списку команд.b
является буфером, в котором строится строка,c
сохраняет скопированную часть.Редактировать: чтобы сохранить несколько байтов, команды
[B][C][D][P]
больше не совпадают, а сравниваются: меньше чем'C'
? ->B
и так далее. Спасибо @nimi за сохранение 3 байта.источник
init b
выдает исключение, еслиb
это пустой список.Mathematica, 100 байт
Анонимная функция. Принимает список строк в качестве входных данных и возвращает строку в качестве выходных данных. Игнорировать любые сгенерированные сообщения.
источник
Java 7,
207203 байтаЭто может определенно быть в гольфе еще немного,
но это мой первоначальный ответ. Будет редактировать после того, как я нашел что-то, чтобы удалить этизаменены наequals
-чеки ..charAt
, но, вероятно, все еще может быть в гольф ..Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
PHP, 131 байт
Сохранение 17 байтов троичным оператором @IsmaelMiguel
источник
<?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);
. (заменил всю вашуif()
цепочку цепочками операций).PHP, 108 байт
Использует подход на основе строки, а не на основе массива.
Используйте как:
edit: сохранил 8 байтов, изменяя порядок символов?: s и делая их отрицательными, чтобы избежать необходимости использовать так много скобок;
источник
$s=$argv[++$i]
вместо того,null!==$s=$argv[++$i]
чтобы использовать PHP> 7, вы можете написать,$s=$argv[++$i]??0
чтобы пропустить уведомление'0'
видя как'0'
ложь. Есть так много других уведомлений, что их пропуск, в частности, кажется пустой тратой времени.SpecBAS - 216 байт
Ввод задается в виде строки с запятыми, которая затем превращается в массив.
источник
V , 49 байтов
Попробуйте онлайн!
Поскольку это содержит непечатаемые символы, вот hexdump:
Это просто прямой перевод моего ответа на vim, чтобы я мог соревноваться с Jelly. К сожалению, у меня все еще один байт, но я все еще работаю над последним. :)
В любом случае, я больше горжусь этим ответом, поэтому, если вы хотите получить очень подробное объяснение, прочитайте его.
источник
На самом деле 56 байтов
Попробуйте онлайн!
Объяснение:
источник
Ява, 181
Более читаемая версия:
источник
if(s.length()>1){...}else
p==1
вp<2
MATL , 46 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
TCL, 186 байт
Красиво отформатирован:
Я просто хотел доказать, что я могу сделать это в TCL
источник
foreach
наlmap
;return
поset x
. Это то, что я могу сказать на первый взгляд.Scala, 158 байт
Ungolfed:
Решает эту проблему как складку с результатом и буфер обмена как аккумулятор. К сожалению, у scala нет троичного условного оператора, а вместо этого используется
if else
в качестве выражения.источник
PHP 7.1,
9592 байтаПримечание: требуется PHP 7.1 для отрицательных смещений строк.
Без отрицательных смещений строки (101 байт):
Запустите так:
объяснение
Tweaks
источник