Symuluj naciśnięcia klawiszy

33

Twoim zadaniem jest symulacja kilku naciśnięć klawiszy wprowadzanych przez użytkownika.

Wkład

Tablica lub ciąg znaków z wybranym ogranicznikiem (spoza zakresu 32-126) zawierający co najmniej jedno „naciśnięcie klawisza”.

Ta tablica będzie zawierać tylko dwa typy ciągów: pasywne naciśnięcia klawiszy (pojedyncze znaki) i polecenia (znaki w nawiasach kwadratowych [ ]).

  • Pasywne naciśnięcia klawiszy
    1. Kody znaków ASCII [32-126]
  • Polecenia:
    1. [B] : backspace (usuń ostatni dodany znak, jeśli taki istnieje)
    2. [C] : skopiuj wszystko, co już zostało napisane
    3. [D] : usuń wszystko, co zostało napisane
    4. [P] : wklej to, co zostało skopiowane

Wydajność

Ciąg produkowany przez naciśnięcia klawiszy.

Przykłady

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

To jest , więc wygrywa najkrótszy kod w bajtach!

Daniel
źródło
FYI Znalazłem błąd w moim kodu, mogę zaproponować przypadek testowy z kapitału B dla pszczół :)
Jonathan Allanowi
Powinien też istnieć przykład, w [D]którym nie jest to jedyny używany, więc kod nie będzie po prostu split('[D]')[1]ani czymś innym .
mbomb007,
@ mbomb007, dodałem przypadki testowe (# 8, # 9)
Daniel,
I myślę, że mbomb007 prosiło o przypadek testowy z wieloma usunięciami.
Martin Ender,
@MartinEnder, och, myślałem, że chciał taki, w którym są inne polecenia niż[D]
Daniel

Odpowiedzi:

7

05AB1E , 34 33 31 27 bajtów

Wykorzystuje kodowanie CP-1252 .

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

Wypróbuj online!

Wyjaśnienie

õ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

Pary funkcji ocenione w powyższym kodzie to:

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 

Zaoszczędzono 4 bajty przy użyciu mod 5sztuczki z odpowiedzi Lynn CJam

Emigna
źródło
34

Klawisze Vim, 76, 64, 62 , 58

Dzięki Loovjo za uratowanie 7 naciśnięć klawiszy


Czy ktoś powiedział, że symuluje naciśnięcia klawiszy? Dobrze więc, że jest to dobra rzecz, mój ulubiony język do golfa w to wszystko o symulowanie klawiszy!

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

Dane wejściowe są w tym formacie:

h
e
l
l
o

[C]
[P]

To dość prosta odpowiedź. To po prostu tłumaczy każde „polecenie” na skrót klawiaturowy vim tego polecenia. Weźmy to linia po linii.

:no s :%s/\M[

To oszczędza tonę bajtów. Vim ma wbudowaną „linię poleceń”, w której możesz tworzyć mapowania, zmieniać ustawienia, zapisywać pliki itp. Tutaj tworzymy mapowanie. :nooznacza skrót „ :nnoremapco oznacza, że ​​kiedy jesteśmy w trybie normalnym, zamień tę lewą stronę na prawą”. Ponieważ dzwonimy :%s/ pięć razy , to dużo oszczędza. To \Mniezła sztuczka. Oznacza to, że następujące wyszukiwanie będzie „Very No Magic”, co oznacza, że ​​regex [B]będzie pasował do dosłownego tekstu, [B]a nie do zakresu zawierającego tylko B. Ponieważ większość poleceń zastępczych ma w nawiasach kwadratowych, wypełniamy pierwsze.

Następnie wywołujemy pięć poleceń zastępczych. Warto zauważyć, dlaczego dzwoniłem <C-v>tyle razy. Postacie podoba <esc>, <C-v>, <C-r>, itd. Są niedrukowalnych znaków i musi być wpisane w wierszu polecenia z <C-v>.

  • [B]: backspace. Ten jest dość łatwy. Po prostu zamień każdy [B]z Ctrl-hnich na ekwiwalent backspace w vimie.

  • [C]: skopiuj wszystko, co już zostało napisane. To jest przetłumaczone na <esc>0y$A. To znaczy:

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

    Moglibyśmy prawie po prostu zrobić Yzamiast tego, 0y$co oznacza „szarpać całą linię”, ale to także przyciąga nową linię, której nie chcemy.

  • [D]: usuń wszystko, co zostało napisane. Jest <esc>"_S. Tak jak poprzednio, <esc>wychodzi z trybu wstawiania, dzięki czemu możemy uruchamiać polecenia. Jest kilka rzeczy, które są tutaj wygodniejsze. Tak robimy

      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]: wklej to, co zostało skopiowane. Ten jest również bardzo prosty. To tylko <C-r>"co oznacza Insert the contents of register '"'. "okazuje się być głównym rejestrem, na który „y”.

Po przetłumaczeniu wszystkich poleceń musimy połączyć wszystkie wiersze razem, usuwając wszystkie znaki nowego wiersza. Dzięki naszemu mapowaniu to jest po prostu

s<bs>\n

<bs>Jest to Backspace (ASCII 0x08) i musimy ją ze względu na [to wypełnione.

Do tej pory przetłumaczyliśmy dane wejściowe na kod vim i wystarczy je uruchomić. Więc my:

S           " Delete this whole line and enter insert mode
 <C-r>"     " Insert the keystrokes of register '"' as if they were typed by the user
DJMcMayhem
źródło
Gdzie <C-r>udokumentowano efekt trybu Wstaw ?
Neil,
1
@ Neil Zasadniczo klucz do określonego trybu można znaleźć pod adresem :h mode_keystroke. W tym przypadku byłoby to:h i_ctrl-r
DJMcMayhem
@Loovjo Oh przepraszam, zapomniałem wspomnieć. Dane wejściowe powinny znajdować się w wielu wierszach, dzięki czemu nie muszę się martwić przecinkami ani /gflagą. Dodam te szczegóły.
DJMcMayhem
2
Co też 0ii<esc>D@"robi?
Loovjo,
1
Mapowania, co? :) dzięki za szczegółowe wyjaśnienie, zawsze uczę się czegoś nowego!
Christian Rondeau,
9

CJam , 33 bajty

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

Wypróbuj online!

Wyjaśnienie

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>3bMapy „funkcji skrótu”

  • ciągi jednoznakowe do 0 (= 0 mod 5),
  • [B]do 291 (= 1 mod 5),
  • [D]do 297 (= 2 mod 5),
  • [P]do 333 (= 3 mod 5),
  • [C]do 294 (= 4 mod 5).

Ta wartość (mod 5) jest używana jako indeks do listy fragmentów kodu CJam:

  • Na przykład w przypadku ciągów hjednoznakowych "h"zwracany jest fragment , który wypycha ciąg stosów jednoznakowych na stos.
  • Na [B]ten fragment ;jest zwracany, który pojawia się element.
  • Na [D]ten fragment ];jest zwracany, który czyści stos.
  • Na [P]ten fragment L~jest zwracany, który dołącza zmienną Lna stosie.
  • Na [C]ten fragment ]:L~jest zwracany, który przechowuje aktualną stosu w zmiennej L.

Te fragmenty są łączone i wykonywane; ostatni stos jest drukowany domyślnie przez CJam. Ljest początkowo pustą listą, więc bufor kopiowania jest początkowo „pusty”.

Lynn
źródło
8

Python 2, 96 95 93 bajtów

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
orlp
źródło
Czy możesz przejść or"E"do definicji xoszczędzania miejsca?
xnor 10.10.16
@xnor Wierzę w to.
orlp 10.10.16
1
Wygląda na to, że definiowanie xnie jest tego warte. x=="C"Może po prostu być o=="[C]".
xnor 10.10.16
7

Galaretka , 50 51 48 bajtów

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

TryItOnline
Lub wszystkie przypadki testowe

W jaki sposób?

Ṿ”;;µṭ“Ṗ“ø©“ḣ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

Na przykład

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

- z kapitałem 'B'jako przypadek testowy, ponieważ zanim naprawiłem błąd, wróciłby"I likeees!"

Jonathan Allan
źródło
1
Nie jestem pewien, że to ważny sprawdzian, ale starałem się nadmiernie skomplikowanego łańcucha i to wydaje się niepowodzeniem: ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings,
Ach - tak, przegapiłem ten przypadek krawędzi, przed usunięciem całego łańcucha jest kopia, a napisany przeze mnie kod ignoruje ją. Zajmę się tym trochę później, dziękuję za powiadomienie.
Jonathan Allan,
OK Naprawiłem to i faktycznie oszczędza też bajty!
Jonathan Allan,
7

JavaScript (ES6), 84 80 77 76 bajtów

Zaoszczędź 3 bajty dzięki @Neil, 1 więcej dzięki @ 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 ma dwa bajty dłużej:

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

Testowy fragment kodu

ETHprodukcje
źródło
Różnica polega na tym, że można zapisać 3 bajty w reducewersji za pomocą (s,[c,z]).
Neil,
@Neil Nice! To oszczędza bajt również w .mapwersji.
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 bajt mniej. Co ciekawe, niezdefiniowany <jakikolwiek znak jest fałszywy
edc65 10.10.16
x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")ratuje jeszcze jedną postać. Jeśli z jest prawdą, wklej, w przeciwnym razie dodaj char do wyniku.
Grax32,
@Grax podczas wklejania musisz dodać do bieżącego wyjścia, więc z?s+t:s+c czyli o 1 bajt więcej niżs+=z?t:c
edc65
5

Perl, 53 50 bajtów

Obejmuje +1 dla -p

Podaj dane wejściowe STDIN zakończone znakami nowej linii (ostatni znak nowej linii może zostać pominięty, więc liczy się jako ciąg oddzielony znakami nowej linii):

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

daje

aHez

keystrokes.pl:

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

Prawie złapałem odpowiedź galaretki, ale diabeł uciekł do 48 bajtów ...

Ton Hospel
źródło
4

Python 120 119 116 bajtów

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

Funkcja rekurencyjna z wejściem, slista naciśnięć klawiszy.

Każde połączenie rekurencyjne aktualizuje tekst zwrotny r, aw przypadku [C]schowka,csbędzie pusty.

Nowe wartości ri csą uznane przez indeksowanie w słowniku, {...}i przekazywane z rozpakowaniu *. Pasywne naciśnięcia klawiszy s[0][1:2]zwrócą pusty ciąg, a ''zamiast tego zostanie użyty klucz .

Jonathan Allan
źródło
Czy mogę zapytać, dlaczego lambda s,r='',c=''zamiast definicji lambda lambda s,r,c=''?
L. Steer,
Specyfikacja jest taka, że ​​bierzemy tablicę znaków wejściowych (tutaj s), więc funkcja musi działać bez żadnych innych danych wejściowych.
Jonathan Allan
Przepraszam, brak zrozumienia czytania.
L. Steer,
4

Haskell, 136 133 130 127 bajtów

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

Wypróbuj na Ideone.

Objaśnienie: k wykonuje rekursję ogona na liście poleceń. bto bufor, w którym skonstruowany jest ciąg, czapisuje skopiowaną część.

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

Edycja: Aby zapisać niektóre bajty, polecenia [B][C][D][P]nie są już dokładnie dopasowane, ale porównywane: mniej niż 'C'? -> Bi tak dalej. Dzięki @nimi za zapisanie 3 bajtów.

Laikoni
źródło
@nimi init bzgłasza wyjątek, jeśli bjest pustą listą.
Laikoni,
@nimi To sprytne, dzięki! Jeśli chodzi o funkcję anonimową, w jakiś sposób miałem na myśli, że funkcje anonimowe są dopuszczalne tylko wtedy, gdy są jedyną instrukcją i nie ma innych funkcji pomocniczych. Jednak wyszukiwanie Meta nie wykazało niczego takiego, więc myślę, że jest w porządku.
Laikoni,
2
Oto ona . Dozwolone jest deklarowanie funkcji pomocniczych dla wyrażeń, które oceniają na funkcje.
nimi
3

Mathematica, 100 bajtów

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

Funkcja anonimowa. Pobiera listę ciągów wejściowych i zwraca ciąg wyjściowy. Zignoruj ​​wygenerowane wiadomości.

LegionMammal978
źródło
2

Java 7, 207 203 bajtów

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;}

Z pewnością można to jeszcze trochę pograć w golfa, ale to moja pierwsza odpowiedź. equalsDokonam edycji po znalezieniu czegoś do usunięcia tych -prawdzeń .. zastąpionych przezcharAt , ale prawdopodobnie nadal można grać w golfa ..

Kod niepoznany i testowy:

Wypróbuj tutaj.

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", "!" }));
  }
}

Wydajność:

Hello
Hello Hello 

HiHHiH
I like bees!
N
#not
Hey
I have supper!
Kevin Cruijssen
źródło
2

PHP, 131 bajtów

17 bajtów zapisanych przez trójskładnikowego operatora @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);
Jörg Hülsermann
źródło
1
147 bajtów: <?$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);. (zastąpił cały if()łańcuch łańcuchem operacji szkoleniowych).
Ismael Miguel
@IsmaelMiguel Thank You. Nie miałem ochoty korzystać z operatora
Jörg Hülsermann
Rozumiem dlaczego. Wygląda tak brzydko i ... to naprawdę boli oko.
Ismael Miguel,
1

PHP, 108 bajtów

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;

Wykorzystuje podejście oparte na łańcuchach, a nie na tablicy.

Użyj jak:

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: zapisano 8 bajtów, zmieniając kolejność znaków?: s i czyniąc je ujemnymi, aby uniknąć konieczności używania tylu nawiasów;

użytkownik59178
źródło
$s=$argv[++$i]zamiast null!==$s=$argv[++$i]jeśli używasz PHP> 7, możesz napisać, $s=$argv[++$i]??0aby pominąć ogłoszenie
Jörg Hülsermann 10.10.16
1
Nie chodzi o to, aby pominąć powiadomienie, ale aby umożliwić ci '0'zobaczenie, jak '0'fałszywe. Jest tak wiele innych uwag, że pominięcie tego w szczególności wydaje się stratą czasu.
user59178,
1

SpecBAS - 216 bajtów

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$

Dane wejściowe są podawane jako ciąg znaków z przecinkami, które są następnie przekształcane w tablicę.

wprowadź opis zdjęcia tutaj

Brian
źródło
1

V , 49 bajtów

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

Wypróbuj online!

Ponieważ zawiera znaki niedrukowalne, oto zrzut heksowy:

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

To tylko bezpośrednie tłumaczenie mojej odpowiedzi vima , abym mógł konkurować z Jelly. Niestety, wciąż jestem o jeden bajt, ale wciąż pracuję nad ostatnim. :)

W każdym razie jestem bardziej dumny z tej odpowiedzi, więc jeśli chcesz uzyskać bardzo szczegółowe wyjaśnienie, przeczytaj je zamiast tego.

DJMcMayhem
źródło
1

Właściwie 56 bajtów

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

Wypróbuj online!

Wyjaśnienie:

''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
Mego
źródło
1

Java, 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;}

Bardziej czytelna wersja:

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;
}
dpa97
źródło
Możesz zaoszczędzić trochę bajtu (1 lub 2), zmieniając swój catch catch naif(s.length()>1){...}else
AxelH,
i zmień p==1nap<2
AxelH,
1

MATL , 46 bajtów

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
Luis Mendo
źródło
1

TCL, 186 bajtów

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}

Ładnie sformatowany:

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
}

Chciałem tylko udowodnić, że mogę to zrobić w TCL

Grax32
źródło
Możesz zapisać bajty: zamień foreachna lmap; returnprzez set x. Oto, co mogę powiedzieć na pierwszy rzut oka.
sergiol
1

Scala, 158 bajtów

(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

Nie golfowany:

(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

Rozwiązuje ten problem jako fałd z wynikiem, a schowek jako akumulator. Niestety, scala nie ma trójskładnikowego operatora warunkowego, ale zamiast tego używa go if elsejako wyrażenia.

corvus_192
źródło
1

PHP 7.1, 95 92 bajtów

Uwaga: wymaga PHP 7.1 do kompensacji ciągów ujemnych.

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;

Bez ujemnych przesunięć łańcucha (101 bajtów):

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

Uruchom tak:

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!

Wyjaśnienie

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.

Poprawki

  • Zaoszczędzono 3 bajty, łącząc obsługę danych wyjściowych z obsługą poleceń
aross
źródło
Miło jest zobaczyć szczegółowo wyjaśniony wpis PHP :)
Emigna 10.10.16