Имитация нажатия клавиш


33

Ваша задача - смоделировать пару нажатий клавиш, которые вводит пользователь.

вход

Массив строк или строка с выбранным вами разделителем (вне диапазона 32-126), содержащая как минимум одно нажатие клавиши.

Этот массив будет содержать только два типа строк: пассивные нажатия клавиш (одиночные символы) и команды (символы в скобках [ ]).

  • Пассивные нажатия клавиш
    1. Коды символов ASCII [32-126]
  • Команды:
    1. [B] : Backspace (удалить последний добавленный символ, если он есть)
    2. [C] : скопировать все что уже написано
    3. [D] : удалить все написанное
    4. [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!'

Это , поэтому выигрывает самый короткий код в байтах!


К вашему сведению, я обнаружил ошибку в своем коде, могу ли я предложить контрольный пример с большой буквы B для пчел :)
Джонатан Аллан

Также должен быть пример, [D]где используется не единственный, так что код не будет просто split('[D]')[1]или что-то в этом роде.
mbomb007

@ mbomb007, я добавил тестовые случаи (# 8, # 9)
Даниэль

И я думаю, что mbomb007 просил контрольный пример с несколькими удалениями.
Мартин Эндер

@MartinEnder, о, я думал, что он хотел одну, где есть команды, кроме[D]
Даниэль

Ответы:


7

05AB1E , 34 33 31 27 байт

Использует кодировку CP-1252 .

õUvygiyJë"XJ¨DU\"4äyáÇ5%è.V

Попробуйте онлайн!

объяснение

õU                                  # initialize X as the empty string
v                                   # for each y in input
 ygiyJ                              # if len(y) == 1 join y with stack
      ë                             # else
       "XJ¨DU\"                     # push this string
               4ä                   # split into 4 parts (of size [2,1,2,1])
                 yá                 # push only letters of y
                   Ç5%              # mod its ascii code by 5
                      è             # index into the string above with this
                       .V           # evaluate as 05AB1E code

Пары функций, вычисленные в приведенном выше коде:

DU    # [C] -> duplicate and store in X
XJ    # [P] -> push X and join with stack
¨     # [B] -> remove last char of string
\     # [D] -> remove top of stack 

Сохранено 4 байта, используя mod 5трюк из ответа Линн CJam


34

Вим, 76, 64, 62 , 58 нажатий клавиш

Спасибо Loovjo за сохранение 7 нажатий клавиш


Кто-то сказал имитировать нажатия клавиш? Ну, это хорошая вещь , мой любимый язык для игры в гольф в это все о имитирующих нажатии клавиш!

:no s :%s/\M[
sB]/<C-v><C-h>
sC]/<C-v><esc>0y$A
sD]/<C-v><esc>"_S
sP]/<C-v><C-r>"
s<bs>\n
S<C-r>"

Вход поступает в следующем формате:

h
e
l
l
o

[C]
[P]

Это довольно простой ответ. Он просто переводит каждую «команду» в комбинацию клавиш vim, эквивалентную этой команде. Давайте рассмотрим это построчно.

:no s :%s/\M[

Это экономит тонну байтов. 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. Это означает:

    <esc>      " Escape to normal mode
         0     " Move to the beginning of this line
          y$   " Yank to the end of the line
            A  " Re enter insert mode at the end of this line.
    

    Мы могли бы почти просто сделать Yвместо0y$ что означает «дергать всю строку», но это также захватывает новую строку, которая нам не нужна.

  • [D]: удалить все написанное. Это <esc>"_S. Как и прежде, <esc>выходит из режима вставки, чтобы мы могли запускать команды. Есть некоторые вещи, которые более удобны здесь. Итак, мы делаем

      S         " Delete this whole line and enter insert mode again
    "_          " Send it to 'the black hole register'. This is just so that we don't overwrite the main register.
    
  • [P]: вставить то, что было скопировано. Этот тоже очень простой. Это просто <C-r>"что значит Insert the contents of register '"'. "оказывается основным регистром, к которому 'y' дергает.

Теперь, когда мы перевели все команды, мы должны объединить все строки, удалив все символы новой строки. Благодаря нашему картографированию, это просто

s<bs>\n

Это <bs>возврат (ASCII 0x08), и он нам нужен из-за [заполнения.

К настоящему времени мы перевели ввод в код vim, и нам просто нужно его запустить. Итак, мы:

S           " Delete this whole line and enter insert mode
 <C-r>"     " Insert the keystrokes of register '"' as if they were typed by the user

Где <C-r>задокументировано влияние режима вставки ?
Нил

1
@Neil В общем, вы можете найти ключ для определенного режима на :h mode_keystroke. В этом случае это будет:h i_ctrl-r
DJMcMayhem

@Loovjo Ой, прости, я забыл упомянуть. Ожидается, что ввод будет состоять из нескольких строк, так что мне не придется беспокоиться о запятых или /gфлаге. Я добавлю эти детали в.
DJMcMayhem

2
Кроме того, что делает 0ii<esc>D@"?
Loovjo

1
Отображения, а? :) спасибо за подробное объяснение, я всегда узнаю что-то новое!
Кристиан Рондо

9

CJam , 33 байта

q~{_[`';"];""L~""]:L~"]\1>3b=}%s~

Попробуйте онлайн!

объяснение

q~                                  Read an evaluate input list.
  {                          }%     Map over each string in it:
   _                                 Duplicate the string, say S.
    [`';"];""L~""]:L~"]              Replace it the following list:
                                      [repr(S) '; "];" "L~" "]:L~"]
                       \             Bring S on top of the stack.
                        1>           Chop off the first char.
                          3b         Base-3 conversion.
                            =        Modular index into the list.
                               s~   Concatenate and run as CJam code.

«Хэш-функция» 1>3bкарты

  • односимвольные строки до 0 (= 0 мод 5),
  • [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в стек.
  • For [C], ]:L~возвращается фрагмент , который сохраняет текущий стек в переменной L.

Эти фрагменты связаны и выполнены; окончательный стек печатается неявно CJam. Lизначально пустой список, поэтому буфер копирования изначально «пустой».


8

Python 2, 96 95 93 байта

r=c=""
for o in input():c=[c,r][x=="[C]"];r=[r+c,r[:-1],r,"",r+o][ord(o[1:2]or"E")%5]
print r

Можете ли вы перейти or"E"к определению, xчтобы сэкономить место?
xnor

@xnor Я верю в это.
orlp

1
На самом деле, похоже, что определение xне стоит. x=="C"Может быть просто o=="[C]".
xnor

7

Желе , 50 51 48 байт

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®”
L>1a2ị$i@“BCDP0”ịÇ
Ç€“⁶Ṗ©”;FV

TryItOnline
или все тесты

Как?

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®” - Link 1, CreateCodeLookupValueList: keystroke
      “Ṗ“ø©“ḣ0“;®” - list of strings, ["Ṗ","ø©","ḣ0"";®"] - these are Jelly code for:
                         Ṗ  : pop (i.e. delete last entry)
                         ø© : niladic separation and copy to register (i.e. copy)
                         ḣ0 : head to 0 (i.e. delete all entries)
                         ;® : concatenate with value of register (i.e. paste)
    µ              - monadic chain separation
Ṿ                  - uneval - make a Jelly code version of the keystroke
                                               e.g. "I" -> "“I”"
 ”;                - string literal ";"                      |
   ;               - concatenate e.g. ";I"                   v
     ṭ             - tack, to make the list ["Ṗ","ø©",";®","“I”"] 
                             a keystroke - a command will evaluate to a string like
                             "“[C]”" but wont be accessed)

L>1a2ị$i@“BCDP0”ịÇ - Link 2, ConvertAKeystokeToJellyCodeString: keystroke
L>1                - length greater than 1? (i.e. isCommand?)
      $            - last two links as a monad
   a               - and
    2ị             - index 2 of the keystroke (0 due to and for a passive keystroke)
         “BCDP0”   - Literal string "BCP0"
       i@          - find first matching index of, with reversed arguments
                ị  - index into
                 Ç - call last link (1) as a monad (get code to replace this keystroke)

Ç€“⁶Ṗ©”;FV - Main link: list of keystrokes
Ç€         - call last link (2) as a monad (convert to Jelly code)
  “⁶Ṗ©”    - literal string "⁶Ṗ©" - setup the register with an empty string:
                 ⁶ :literal " ";
                 Ṗ : pop the space to give an empty string;
                 © : places it into the register
       ;   - concatenate (put that at the front)
        F  - flatten list (lists and strings are equivalent in Jelly)
         V - evaluate the string

Например

The input:
    ['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'B', '[P]', '[P]', 's', '!']
Becomes the Jelly code:
    "⁶Ṗ©;“e”ø©Ṗ;“I”;“ ”;“l”;“i”;“k”;®;“ ”;“B”;®;®;“s”;“!”"
Which then evaluates to
    "I like Bees!"

- с заглавной буквы 'B'в качестве контрольного примера, так как до того, как я исправил ошибку, он бы вернулся"I likeees!"


1
Я не уверен , что это действительный тест, но я попытался с чрезмерно сложной строки , и это , кажется, не в состоянии : ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Дом Гастингс

Ах, да, я пропустил этот крайний случай, перед удалением всей строки есть копия, и написанный мной код игнорирует ее. Я посмотрю на это чуть позже, спасибо, что уведомили меня.
Джонатан Аллан

Хорошо, я исправил это, и это также экономит байты!
Джонатан Аллан

7

JavaScript (ES6), 84 80 77 76 байт

Благодаря @Neil сохранено 3 байта, еще один - @ edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,t="")

.map на два байта длиннее:

x=>x.map(([c,z])=>s=z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,s=t="")&&s

Тестовый фрагмент


Разница в том, что вы можете сохранить 3 байта в reduceверсии с помощью (s,[c,z]).
Нил

@ Нил Хорошо! Это экономит байт на .mapверсии тоже.
ETHproductions

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')На 1 байт меньше Любопытно, что неопределенный <любой символ неверен
edc65

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 к выводу.
Grax32 10.10.16

@Grax при вставке вы должны добавить к текущему выводу, так z?s+t:s+c что это на 1 байт большеs+=z?t:c
edc65 10.10.16

5

Perl, 53 50 байт

Включает +1 для -p

Введите ввод в STDIN, завершенный символом новой строки (последний символ новой строки может быть пропущен, поэтому он считается строкой, разделенной символом новой строки):

keystrokes.pl
H
e
[C]
[D]
a
b
[B]
[P]
z
^D

дает

aHez

keystrokes.pl:

#!/usr/bin/perl -p
$\.=/^.$/?$&:/P/?$a:(/C/?$a=$\:chop($\x=/B/))x0}{

Почти поймал ответ желе, но злодей ушел на 48 байтов ...


4

Python 120 119 116 байт

f=lambda s,r='',c='':f(s[1:],*{'B':(r[:-1],c),'C':(r,r),'D':('',c),'P':(r+c,c),'':(r+s[0],c)}[s[0][1:2]])if s else r

Ideone

Рекурсивная функция с вводом, s список нажатий клавиш.

Каждый рекурсивный вызов обновляет текст возврата rи, в случае [C]буфера обмена,c пока не sстанет пустым.

Новые ценности rиc найдены путем индексации в словарь, {...}и передаются с распаковкой *. Для пассивных нажатий клавиш s[0][1:2]вернется пустая строка, и ''вместо нее будет использован ключ .


Могу я спросить, почему вы определяете лямбду lambda s,r='',c=''вместо lambda s,r,c=''?
Л. Стир

Спецификация состоит в том, что мы берем входной массив символов (здесь s), поэтому функция должна работать без другого ввода.
Джонатан Аллан

Мои извинения, сбой понимания прочитанного.
Л. Стир

4

Хаскелл, 136 133 130 127 байт

k c b(('[':m:_):i)|m<'C'=k c[q|b>"",q<-init b]i|m<'D'=k b b i|m<'P'=k c""i|1<3=k c(b++c)i
k c b(s:i)=k c(b++s)i
k c b[]=b
k""""

Попробуйте это на Ideone.

Объяснение: k выполняет хвостовую рекурсию по списку команд. bявляется буфером, в котором строится строка, cсохраняет скопированную часть.

k c b ("[B]":i) = k c (take(length b - 1)b) i -- remove last element of buffer
k c b ("[C]":i) = k b b i                     -- set copy to buffer
k c b ("[D]":i) = k c "" i                    -- clear the buffer
k c b ("[P]":i) = k c (b++c) i                -- append content of copy to the buffer
k c b (s:i)     = k c (b++s) i                -- append char to the buffer
k c b []        = b                           -- command list is empty, return buffer
f = k "" ""                                   -- initialise copy and buffer with empty strings

Редактировать: чтобы сохранить несколько байтов, команды [B][C][D][P]больше не совпадают, а сравниваются: меньше чем 'C'? -> Bи так далее. Спасибо @nimi за сохранение 3 байта.


@nimi init bвыдает исключение, если bэто пустой список.
Лайкони

@nimi Это умно, спасибо! Что касается анонимной функции, то я как-то имел в виду, что анонимные функции допустимы только тогда, когда они являются единственным оператором, а других вспомогательных функций нет. Однако поиск Meta ничего подобного не дал, так что, думаю, все в порядке.
Лайкони

2
Здесь . Разрешено объявлять вспомогательные функции для выражений, которые оцениваются как функции.
Ними,

3

Mathematica, 100 байт

""<>Fold[Switch[#2,"[B]",Most@#~Check~{},"[C]",a=#,"[D]",{},"[P]",#~Join~a,_,Append@##]&,a={};{},#]&

Анонимная функция. Принимает список строк в качестве входных данных и возвращает строку в качестве выходных данных. Игнорировать любые сгенерированные сообщения.


2

Java 7, 207 203 байта

String c(String[]a){String r="",c=r;for(String s:a){int k=s.length(),l=r.length(),z;if(k>1){z=s.charAt(1);r=z<67?l>0?r.substring(0,l-1):"":z<68?r:z<69?"":z<81?r+c:r+s;c=z==67?r:c;}r+=k<2?s:"";}return r;}

Это может определенно быть в гольфе еще немного, но это мой первоначальный ответ. Будет редактировать после того, как я нашел что-то, чтобы удалить эти equals-чеки .. заменены наcharAt , но, вероятно, все еще может быть в гольф ..

Ungolfed & тестовый код:

Попробуй это здесь.

class M{
  static String c(final String[] a) {
    String r = "",
           c = r;
    for(String s : a){
      int k = s.length(),
          l = r.length(),
          z;
      if(k > 1){
        z = s.charAt(1);
        r = z < 67
             ? l > 0
                ? r.substring(0, l-1)
                : ""
             : z < 68
                ? r
                : z < 69
                   ? ""
                   : z < 81
                      ? r + c
                      : r + s;
        c = z == 67
             ? r
             : c;
      }
      r += k < 2
            ? s
            : "";
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o" }));
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o", " ", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "[D]", "D", "[B]" }));
    System.out.println(c(new String[]{ "H", "[C]", "i", "[P]", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "e", "[C]", "[B]", "I", " ", "l", "i", "k", "[P]", " ", "b", "[P]", "[P]", "s", "!" }));
    System.out.println(c(new String[]{ "N", "[P]" }));
    System.out.println(c(new String[]{ "#", "5", "0", "K", "0", "0", "1", "[D]", "#", "n", "o", "t" }));
    System.out.println(c(new String[]{ "H", "o", "w", " ", "[D]", "H", "e", "y" }));
    System.out.println(c(new String[]{ "s", "u", "d", "[B]", "p", "[C]", "[D]", "I", " ", "h", "a", "v", "e", " ", "[P]", "p", "e", "r", "!" }));
  }
}

Выход:

Hello
Hello Hello 

HiHHiH
I like bees!
N
#not
Hey
I have supper!

2

PHP, 131 байт

Сохранение 17 байтов троичным оператором @IsmaelMiguel

<?$c=[];foreach($_GET[a]as$v)($t=$v[1])!=P?$t!=C?$t!=B?$t!=D?$o[]=$v:$o=[]:array_pop($o):$c=$o:$o=array_merge($o,$c);echo join($o);

1
147 байт: <?$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()цепочку цепочками операций).
Исмаэль Мигель

@IsmaelMiguel Спасибо. У меня не было желания пользоваться оператором
Йорг Хюльсерманн

Я понимаю почему. Это выглядит так некрасиво и ... это действительно то, что болит глаз.
Исмаэль Мигель

1

PHP, 108 байт

for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;

Использует подход на основе строки, а не на основе массива.

Используйте как:

php -r "for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;" a b "[C]" "[B]" "[P]" "[C]" "[D]" j "[P]"

edit: сохранил 8 байтов, изменяя порядок символов?: s и делая их отрицательными, чтобы избежать необходимости использовать так много скобок;


$s=$argv[++$i]вместо того, null!==$s=$argv[++$i]чтобы использовать PHP> 7, вы можете написать, $s=$argv[++$i]??0чтобы пропустить уведомление
Йорг Хюльсерманн

1
Это не для того, чтобы пропустить уведомление, но чтобы позволить вам войти, '0'видя как '0'ложь. Есть так много других уведомлений, что их пропуск, в частности, кажется пустой тратой времени.
user59178 10.10.16

1

SpecBAS - 216 байт

1 s$,t$="": INPUT a$: DIM b$(SPLIT a$,NOT ",")
2 FOR EACH l$ IN b$()
3 CASE l$
4 WHEN "[B]": s$=s$( TO LEN s$-1)
5 WHEN "[C]": t$=s$
6 WHEN "[D]": s$=""
7 WHEN "[P]": s$=s$+t$
8 OTHERWISE : s$=s$+l$
9 END CASE
10 NEXT l$: ?s$

Ввод задается в виде строки с запятыми, которая затем превращается в массив.

введите описание изображения здесь


1

V , 49 байтов

íÛBÝ/
íÛCÝ/0y$A
íÛDÝ/"_S
íÛPÝ/"
íî
0éiD@"

Попробуйте онлайн!

Поскольку это содержит непечатаемые символы, вот hexdump:

0000000: eddb 42dd 2f16 080a eddb 43dd 2f16 1b30  ..B./.....C./..0
0000010: 7924 410a eddb 44dd 2f16 1b22 5f53 0aed  y$A...D./.."_S..
0000020: db50 dd2f 1612 220a edee 0a30 e969 4440  .P./.."....0.iD@
0000030: 22

Это просто прямой перевод моего ответа на vim, чтобы я мог соревноваться с Jelly. К сожалению, у меня все еще один байт, но я все еще работаю над последним. :)

В любом случае, я больше горжусь этим ответом, поэтому, если вы хотите получить очень подробное объяснение, прочитайте его.


1

На самом деле 56 байтов

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR

Попробуйте онлайн!

Объяснение:

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR
''j                                                       insert an apostrophe between every pair of commands
   "'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ         replace:
   "'[B]"'XaÆ                                               "'[B]" with "X"
             "'[C]""k;╗i"aÆ                                 "'[C]" with "k;╗i"
                           "'[P]""╜i"aÆ                     "'[P]" with "╜i"
                                       "'[D]"'éaÆ           "'[D]" with "é"
                                                 ''+      prepend an apostrophe
                                                          now the input has been converted to the equivalent Actually program ("'<character>" pushes the character, "X" removes the last character, "k;╗i" saves the current stack state to a register, and "╜i" pushes the saved stack state)
                                                    ƒ     execute the code
                                                     kΣ   concatenate the characters
                                                       R  reverse the string

1

Ява, 181

String v(String[]a){String r="",c=r;for(String s:a){try{int p=s.charAt(1)%5;r=p<1?r+c:p>2?"":p==1?r.length()<2?"":r.split(".$")[0]:r;c=p==2?r:c;}catch(Exception e){r+=s;}}return r;}

Более читаемая версия:

String v(String[]a){
    String r="",c=r;
    for(String s:a){
        try{
            int p=s.charAt(1)%5;
            r= p<1
                 ? r+c
                 : p>2
                    ? ""
                    :p==1
                        ? r.length()<2
                                     ?""
                                     :r.split(".$")[0]
                        :r;
            c=p==2?r:c;
        }catch(Exception e){
            r+=s;
        }
    }return r;
}

Вы можете сохранить некоторый байт (1 или 2), изменив свой улов попытки наif(s.length()>1){...}else
AxelH

и изменить p==1вp<2
AxelH

1

MATL , 46 байт

vXKx"@gtnq?2)XJ66=?3L)}J67=?XK}J68=?vx}K]]]]&h

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

v                % Push empty array
XK               % Copy to clipboard K. This initiallizes it as empty
x                % Delete
"                % Implicitly input cell array. For each
  @g             % Push current cell's contents
  t              % Duplicate elements
  n              % Number of elements
  q?             % If more then 1
    2)           % Get second char. Copy to clipboard J
    66=?         % If it ss 'B'
      3L)        % Remove last element from string built up to now
    }            % Else
      J67=?      % If it was a 'C'
        XK       % Copy string built up to now into clipboard K
      }          % Else
        J68=?    % If was a 'D'
          vx     % Delete stack. This deletes string built up to now, if any
        }        % Else: it was a 'P'
          K      % Paste from clipboard K
        ]        % End if
      ]          % End if
    ]            % End if
  ]              % End if
  &h             % Horizontally concatenate stack
                 % Implicitly end for
                 % Implicitly display

1

TCL, 186 байт

proc t w {foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;foreach g $w {eval "set c \$[string index ${g}N 1]";eval "set r \"$c\""};return $r}

Красиво отформатирован:

proc t w {
    foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;
    foreach g $w {
        eval "set c \$[string index ${g}N 1]"
        eval "set r \"$c\""
    }
    return $r
}

Я просто хотел доказать, что я могу сделать это в TCL


Вы можете сохранить байты: заменить foreachна lmap; returnпо set x. Это то, что я могу сказать на первый взгляд.
sergiol

1

Scala, 158 байт

(i:Seq[String])=>(("","")/:i){case((a,c),k)=>if(k.size<2)(a+k,c)else
if(k=="[B]")(a dropRight 1,c)else
if(k=="[C]")(a,a)else
if(k=="[D]")("",c)else(a+c,c)}._1

Ungolfed:

(i:Seq[String]) => i.foldLeft(("", "")){
  case ((res,clipboard),key) =>
    if (k.size == 1) (res+key,clipboard)
    else if (k=="[B]") (res dropRight 1, clipboard)
    else if (k=="[C]") (res, res)
    else if (k=="[D]") ("", clipboard)else(acc+clipboard,clipboard)
}._1

Решает эту проблему как складку с результатом и буфер обмена как аккумулятор. К сожалению, у scala нет троичного условного оператора, а вместо этого используется if elseв качестве выражения.


1

PHP 7.1, 95 92 байта

Примечание: требуется PHP 7.1 для отрицательных смещений строк.

for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;

Без отрицательных смещений строки (101 байт):

php -r 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o=substr($o,0,-1):$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s ! 2>/dev/null;echo

Запустите так:

php -nr 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s !;echo
> I like bees!

объяснение

for(
  ;
  n|$i=$argv[++$x];   # Iterates over the input until null.
)
  ($l=$i[1])?         # Check if this item is a command, if so set to $l
    $l^r?             # If the command is not B
      $l^s?           # If the command is not C
        $l^t?         # If the command is not D
          $o.=$c      # Then it's P, so paste the clipboard ($c)
        :$o=""        #      It's D, so delete output
      :$c=$o          #      It's C, so copy output to clipboard
    :$o[-1]=""        #      It's B, so remove the last output char
  :$o.=$i;            # No command, add the current item to the output.

echo$o;               # Print the output.

Tweaks

  • Сохранено 3 байта путем объединения обработки вывода с обработкой команды

Приятно видеть, что PHP-запись подробно объяснена :)
Emigna 10.10.16
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.