Simula i tasti


33

Il tuo compito è simulare un paio di sequenze di tasti che un utente digita.

Ingresso

Un array di stringhe o una stringa con un delimitatore a scelta (al di fuori dell'intervallo 32-126) contenente almeno una 'sequenza di tasti'.

Questa matrice conterrà solo due tipi di stringa: sequenze di tasti passivi (caratteri singoli) e comandi (caratteri tra parentesi [ ]).

  • Tasti passivi
    1. Codici di caratteri ASCII [32-126]
  • comandi:
    1. [B] : backspace (rimuove l'ultimo carattere aggiunto se ce n'è uno)
    2. [C] : copia tutto ciò che è già stato scritto
    3. [D] : elimina tutto ciò che è stato scritto
    4. [P] : incolla ciò che è stato copiato

Produzione

La stringa prodotta dalle sequenze di tasti.

Esempi

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

Questo è , quindi vince il codice più breve in byte!


Cordiali saluti Ho trovato un bug nel mio codice, posso suggerire un caso di prova con una B maiuscola per le api :)
Jonathan Allan,

Dovrebbe esserci anche un esempio in [D]cui non è l'unico utilizzato, quindi il codice non sarà solo split('[D]')[1]o qualcosa del genere.
mbomb007,

@ mbomb007, ho aggiunto casi di test (# 8, # 9)
Daniel,

E penso che mbomb007 stava chiedendo un caso di test con eliminazioni multiple.
Martin Ender,

@MartinEnder, oh, pensavo che ne volesse uno in cui ci fossero comandi diversi da[D]
Daniel,

Risposte:


7

05AB1E , 34 33 31 27 byte

Utilizza la codifica CP-1252 .

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

Provalo online!

Spiegazione

õ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

Le coppie di funzioni valutate nel codice sopra sono:

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 

Hai salvato 4 byte usando il mod 5trucco della risposta CJam di Lynn


34

Tasti Vim, 76, 64, 62 , 58

Grazie a Loovjo per aver salvato 7 sequenze di tasti


Qualcuno ha detto di simulare sequenze di tasti? Ebbene, è una buona cosa che la mia lingua preferita a golf in è tutto su sequenze di tasti che simulano!

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

L'input è disponibile in questo formato:

h
e
l
l
o

[C]
[P]

Questa è una risposta piuttosto semplice. Traduce semplicemente ogni "comando" nell'equivalente del tasto vim di quel comando. Prendiamolo riga per riga.

:no s :%s/\M[

Ciò consente di risparmiare tonnellate di byte. Vim ha una "riga di comando" incorporata in cui puoi creare mappature, modificare impostazioni, salvare file, ecc. Qui stiamo creando una mappatura.:noè l'abbreviazione :nnoremapche significa "Quando siamo in modalità normale, sostituisci questo lato sinistro con questo lato destro". Dato che stiamo chiamando :%s/ cinque volte diverse , questo fa risparmiare molto. Il \Mè un bel trucco. Significa che la seguente ricerca sarà "Very No Magic", il che significa che la regex [B]corrisponderà al testo letterale [B]piuttosto che a un intervallo contenente solo una B in esso. Poiché la maggior parte dei comandi sostitutivi contiene parentesi quadre, compiliamo il primo.

Quindi, chiamiamo cinque comandi sostitutivi. Vale la pena notare perché ho chiamato<C-v> così tante volte. Personaggi come <esc>, <C-v>, <C-r>, ecc, sono caratteri non stampabili, e devono essere digitate nella linea di comando con una <C-v>.

  • [B]: backspace. Questo è abbastanza semplice. Sostituisci semplicemente ciascuno [B]con Ctrl-h, che equivale a backspace in vim.

  • [C]: copia tutto ciò che è già stato scritto. Questo è tradotto in <esc>0y$A. Questo significa:

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

    Potremmo quasi semplicemente fare Yal posto del 0y$che significa "strappare tutta la linea", ma questo afferra anche una nuova linea che non vogliamo.

  • [D]: elimina tutto ciò che è stato scritto. Questo è <esc>"_S. Come prima,<esc> esce dalla modalità di inserimento in modo da poter eseguire i comandi. Ci sono alcune cose che sono più convenienti qui. Quindi lo facciamo

      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]: incolla ciò che è stato copiato. Anche questo è molto semplice. È solo ciò <C-r>"che significaInsert the contents of register '"' . "sembra essere il registro principale a cui "y" fa uno strattone.

Ora che abbiamo tradotto tutti i comandi, dobbiamo unire tutte le linee rimuovendo tutti i caratteri di nuova riga. Grazie alla nostra mappatura, questo è giusto

s<bs>\n

Il <bs> è un backspace, (ASCII 0x08) e ne abbiamo bisogno a causa del [abbiamo compilato.

Ormai, abbiamo tradotto l'input in codice vim e dobbiamo solo eseguirlo. Quindi noi:

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

Dov'è l'effetto della modalità Inserisci di <C-r>documentato?
Neil,

1
@Neil In generale, è possibile trovare una chiave per una modalità specifica in :h mode_keystroke. In questo caso, sarebbe:h i_ctrl-r
DJMcMayhem

@Loovjo Oh scusa, ho dimenticato di menzionare. L'input dovrebbe essere su più righe, quindi non devo preoccuparmi delle virgole o della /gbandiera. Aggiungerò questi dettagli.
DJMcMayhem

2
Inoltre, cosa fa 0ii<esc>D@"?
Loovjo,

1
Mappature, eh? :) grazie per la spiegazione dettagliata, imparo sempre qualcosa di nuovo!
Christian Rondeau,

9

CJam , 33 byte

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

Provalo online!

Spiegazione

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.

Le 1>3bmappe della "funzione hash"

  • stringhe a carattere singolo su 0 (= 0 mod 5),
  • [B]al 291 (= 1 mod 5),
  • [D]a 297 (= 2 mod 5),
  • [P]a 333 (= 3 mod 5),
  • [C]a 294 (= 4 mod 5).

Questo valore (mod 5) viene utilizzato come indice in un elenco di frammenti di codice CJam:

  • Per le stringhe a carattere singolo, ad esempio h, "h"viene restituito lo snippet , che inserisce una stringa a carattere singolo nello stack.
  • Per [B], lo snippet; viene restituito , che apre un elemento.
  • Per [D], lo snippet]; viene restituito , che cancella lo stack.
  • Per [P], L~viene restituito lo snippet , che aggiunge una variabileL allo stack.
  • Per [C], ]:L~viene restituito lo snippet , che memorizza lo stack corrente nella variabile L.

Questi frammenti sono concatenati ed eseguiti; lo stack finale viene stampato implicitamente da CJam. Lè inizialmente l'elenco vuoto, quindi il buffer di copia è inizialmente "vuoto".


8

Python 2, 96 95 93 byte

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

Puoi spostare la or"E"definizione di xper salvare uno spazio?
xnor

@xnor Credo di si.
orlp,

1
In realtà, sembra che la definizione xnon valga la pena. La x=="C"può essere solo o=="[C]".
xnor

7

Gelatina , 50 51 48 byte

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

TryItOnline
O tutti i casi di test

Come?

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

Per esempio

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

- con un capitale 'B'come test case, poiché prima di aver corretto un bug sarebbe tornato"I likeees!"


1
Io non sono sicuro che è un banco di prova valida, ma ho provato con una stringa eccessivamente complessa e questo sembra non riuscire: ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings,

Ah - sì, ho perso questo caso limite, ce n'è una copia prima di eliminare l'intera stringa e il codice che ho scritto lo ignora. Lo guarderò un po 'più tardi, grazie per avermelo avvisato.
Jonathan Allan,

OK, l'ho risolto e in realtà salva anche i byte!
Jonathan Allan,

7

JavaScript (ES6), 84 80 77 76 byte

Salvato 3 byte grazie a @Neil, 1 in più grazie a @ 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 è più lungo di due byte:

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

Test snippet


La differenza è che puoi salvare 3 byte sulla reduceversione usando (s,[c,z]).
Neil,

@Neil Nice! Ciò consente di risparmiare un byte anche sulla .mapversione.
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 byte in meno. Curiosamente indefinito <ogni carattere è falso
edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")salva un altro personaggio. Se z è vero, incolla, altrimenti aggiungi il carattere all'output.
Grax32

@Grax quando si incolla è necessario aggiungere all'output corrente, quindi z?s+t:s+c è 1 byte in più rispetto as+=z?t:c
edc65

5

Perl, 53 50 byte

Include +1 per -p

Fornisci input su STDIN terminato da newline (l'ultima newline può essere esclusa, quindi conta come una stringa separata da newline):

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

Quasi catturato la risposta di Jelly, ma il diavolo è scappato a 48 byte ...


4

Python 120 119 116 byte

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

Una funzione ricorsiva con input, s un elenco dei tasti premuti.

Ogni chiamata ricorsiva aggiorna il testo di ritorno re, nel caso di a [C], gli appunti,c fino a quando non sè vuota.

I nuovi valori di re csi trovano indicizzando in un dizionario {...}e passati con decompressione,* . Per i tasti passivi s[0][1:2]verrà restituita una stringa vuota e ''verrà utilizzata la chiave .


Potrei chiederti perché definisci la lambda come lambda s,r='',c=''invece di lambda s,r,c=''?
L. Steer,

La specifica è che prendiamo un array di caratteri di input (qui s), quindi la funzione deve funzionare senza altri input.
Jonathan Allan,

Mi scuso, ho letto il fallimento della comprensione.
L. Steer,

4

Haskell, 136 133 130 127 byte

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

Provalo su Ideone.

Spiegazione: k esegue una ricorsione della coda su un elenco di comandi. bè il buffer in cui è costruita la stringa, csalva la parte copiata.

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

Modifica: per salvare alcuni byte i comandi[B][C][D][P] non vengono più abbinati esattamente ma confrontati: meno di 'C'? -> Be così via. Grazie a @nimi per aver salvato 3 byte.


@nimi init bgenera un'eccezione se bè l'elenco vuoto.
Laikoni,

@nimi È intelligente, grazie! Per quanto riguarda la funzione anonima, in qualche modo avevo in mente che le funzioni anonime sono accettabili solo quando sono l'unica affermazione e non ci sono altre funzioni di supporto. Tuttavia, la ricerca di Meta non ha prodotto nulla del genere, quindi immagino sia ok.
Laikoni,

2
Eccolo . È consentito dichiarare funzioni di supporto per espressioni che valutano funzioni.
nimi,

3

Mathematica, 100 byte

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

Funzione anonima. Prende un elenco di stringhe come input e restituisce una stringa come output. Ignora tutti i messaggi generati.


2

Java 7, 207 203 byte

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

Questo può sicuramente essere giocato ancora un po ', ma questa è la mia risposta iniziale. equalsModificherò dopo che ho trovato qualcosa per rimuovere quei controlli .. sostituiti con charAt, ma probabilmente possono ancora essere giocati a golf ..

Codice non testato e test:

Provalo qui.

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

Produzione:

Hello
Hello Hello 

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

2

PHP, 131 byte

17 byte salvati dall'operatore ternario @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 byte: <?$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);. (ha sostituito l'intera if()catena con una catena di operazioni trenarie).
Ismael Miguel,

@IsmaelMiguel Grazie. Non desideravo usare l'operatore
Jörg Hülsermann,

Capisco perché. Sembra così brutto e ... è davvero qualcosa che fa male all'occhio.
Ismael Miguel,

1

PHP, 108 byte

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;

Utilizza un approccio basato su stringhe anziché uno basato su array.

Usa come:

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

modifica: salvato 8 byte manipolando l'ordine dei?: se rendendoli negativi per evitare di usare così tante parentesi;


$s=$argv[++$i]invece di null!==$s=$argv[++$i]usare PHP> 7 potresti scrivere $s=$argv[++$i]??0per saltare l'avviso
Jörg Hülsermann

1
Non è lì per saltare l'avviso ma per permetterti di entrare '0'visto che '0'è falso. Ci sono così tante altre comunicazioni che saltare quella in particolare sembra una perdita di tempo.
user59178

1

SpecBAS - 216 byte

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$

L'input viene dato come una stringa con virgole, che viene quindi trasformato in array.

enter image description here


1

V , 49 byte

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

Provalo online!

Poiché questo contiene caratteri non stampabili, ecco un dump esadecimale:

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

Questa è solo una traduzione diretta della mia risposta di Vim in modo da poter competere con Jelly. Sfortunatamente, sono ancora a un byte, ma sto ancora lavorando sull'ultimo. :)

Sono comunque più orgoglioso di questa risposta, quindi se vuoi una spiegazione molto dettagliata, leggi quella.


1

In realtà, 56 byte

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

Provalo online!

Spiegazione:

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

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

Versione più leggibile:

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

È possibile salvare alcuni byte (1 o 2) modificando il catch di prova in unif(s.length()>1){...}else
AxelH

e cambia p==1inp<2
AxelH l'

1

MATL , 46 byte

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

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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 byte

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}

Ben formattato:

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
}

Volevo solo dimostrare di poterlo fare in TCL


È possibile salvare byte: sostituire foreachcon lmap; returndi set x. Questo è quello che posso dire a colpo d'occhio.
sergiol,

1

Scala, 158 byte

(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

Risolve questo problema come una piega con il risultato e gli appunti come accumulatore. Purtroppo, Scala non ha un operatore condizionale ternario, ma invece usa if elsecome espressione.


1

PHP 7.1, 95 92 byte

Nota: richiede PHP 7.1 per gli offset di stringa negativi.

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;

Senza offset di stringa negativi (101 byte):

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

Esegui in questo modo:

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!

Spiegazione

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.

Ritocchi

  • Salvato 3 byte combinando la gestione dell'output con la gestione dei comandi

Bello vedere una voce di PHP spiegata in dettaglio :)
Emigna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.