Моделюйте натискання клавіш


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!'

Це , тому найкоротший код у байтах виграє!


FYI Я знайшов помилку в своєму коді, чи можу я запропонувати тестовий випадок із великої літери Б для бджіл :)
Джонатан Аллан

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

@ mbomb007, я додав тестові справи (№8, №9)
Даніель

І я думаю, що mbomb007 просив тестовий випадок із декількома видаленнями.
Мартін Ендер

@MartinEnder, о, я думав, він хотів би одного, де є інші команди, крім[D]
Daniel

Відповіді:


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 Lynn


34

Vim, 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, що еквівалентно зворотній простір у 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).

Це значення (mod 5) використовується як індекс до списку фрагментів коду CJam:

  • Для односимвольних рядків, скажімо h, "h"повертається фрагмент , який висуває рядок з одним символом до стеку.
  • Бо повертається [B]фрагмент ;, який спливає елемент.
  • Бо повертається [D]фрагмент ];, який очищає стек.
  • Бо [P]фрагмент L~повертається, який додає змінну Lдо стека.
  • Для [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 байт

Збережено 3 байти завдяки @Neil, ще 1 завдяки @ 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]).
Ніл

@Neil Nice! Це також економить байт на .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 байт менше. Цікаво не визначено <будь-яка char є помилковою
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

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

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

Ідеон

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

Кожен рекурсивний виклик оновлює текст повернення, rа у випадку [C]буфера обміну - cдо sпорожнього.

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


Чи можу я запитати, чому ви визначаєте лямбда як lambda s,r='',c=''замість lambda s,r,c=''?
L. Steer

Специфікація полягає в тому, що ми беремо вхідний масив символів (тут s), тому функція повинна працювати без іншого вводу.
Джонатан Аллан

Мої вибачення, невдача з розумінням читання.
L. Steer

4

Haskell, 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 Це розумно, дякую! Щодо анонімної функції, я якось мав на увазі, що анонімні функції є прийнятними лише тоді, коли вони є єдиним твердженням, а інших допоміжних функцій немає. Однак пошук мета не виявив нічого подібного, тому я гадаю, що це нормально.
Лайконі

2
Ось воно . Дозволяється оголошувати допоміжні функції для виразів, які оцінюються на функції.
німі

3

Математика, 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, але, ймовірно, все ще можна пограти в гольф ..

Невикористаний і тестовий код:

Спробуйте тут.

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]"

редагувати: збережено 8 байтів, встановивши порядок ?: s і зробивши їх негативними, щоб уникнути необхідності використання стільки дужок;


$s=$argv[++$i]замість того, null!==$s=$argv[++$i]якщо ви використовуєте PHP> 7, ви можете написати, $s=$argv[++$i]??0щоб пропустити повідомлення
Jörg Hülsermann

1
Це не для того, щоб пропустити сповіщення, але щоб ви могли ввести, щоб '0'бачити як '0'помилкове. Є так багато інших повідомлень, що пропуск цього конкретного, здається, трата часу.
користувач59178

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@"

Спробуйте в Інтернеті!

Оскільки це містить недруковані символи, ось шістнадцятковий набір:

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. Це я можу сказати швидким поглядом.
сергіол

1

Скала, 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

Безголівки:

(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.

Налаштування

  • Збережено 3 байти, поєднавши обробку виводу з обробкою команд

Приємно побачити запис PHP докладно пояснено :)
Emigna
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.