Simulasikan penekanan tombol


33

Tugas Anda adalah mensimulasikan beberapa penekanan tombol yang diketik pengguna.

Memasukkan

Array string atau string dengan pembatas pilihan Anda (di luar rentang 32-126) yang mengandung setidaknya satu 'keystroke'.

Array ini hanya akan berisi dua jenis string: penekanan tombol pasif (karakter tunggal) dan perintah (karakter dalam tanda kurung [ ]).

  • Penekanan tombol pasif
    1. Kode karakter ASCII [32-126]
  • Perintah:
    1. [B] : backspace (hapus karakter terakhir yang ditambahkan jika ada)
    2. [C] : salin semua yang sudah ditulis
    3. [D] : hapus semua yang telah ditulis
    4. [P] : rekatkan apa yang telah disalin

Keluaran

Tali yang dihasilkan oleh penekanan tombol.

Contohnya

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

Ini adalah , jadi kode terpendek dalam byte menang!


FYI Saya menemukan bug dalam kode saya, mungkin saya menyarankan test case dengan huruf B untuk lebah :)
Jonathan Allan

Seharusnya ada juga contoh di [D]mana itu bukan satu-satunya yang digunakan, sehingga kode tidak akan hanya menjadi split('[D]')[1]atau sesuatu.
mbomb007

@ mbomb007, saya menambahkan test case (# 8, # 9)
Daniel

Dan saya pikir mbomb007 meminta test case dengan banyak penghapusan.
Martin Ender

@ MartinEnder, oh saya pikir dia ingin satu di mana ada perintah selain[D]
Daniel

Jawaban:


7

05AB1E , 34 33 31 27 byte

Menggunakan pengodean CP-1252 .

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

Cobalah online!

Penjelasan

õ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

Pasangan fungsi yang dievaluasi dalam kode di atas adalah:

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 

Disimpan 4 byte menggunakan mod 5trik dari jawaban Lynn CJam


34

Vim, 76, 64, 62 , 58 penekanan tombol

Terima kasih kepada Loovjo karena telah menyimpan 7 penekanan tombol


Apakah ada yang mengatakan mensimulasikan penekanan tombol? Baiklah, itu hal yang baik bahasa favorit saya untuk bermain golf adalah tentang mensimulasikan penekanan tombol!

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

Masukan datang dalam format ini:

h
e
l
l
o

[C]
[P]

Ini adalah jawaban yang cukup mudah. Itu hanya menerjemahkan setiap "perintah" ke setara vim keystroke dari perintah itu. Mari kita bawa baris demi baris.

:no s :%s/\M[

Ini menghemat satu ton byte. Vim memiliki "command line" bawaan di mana Anda dapat membuat pemetaan, mengubah pengaturan, menyimpan file, dll. Di sini kita membuat pemetaan. :nokependekan :nnoremapyang artinya "Ketika kita berada dalam mode normal, gantikan sisi kiri ini dengan sisi kanan ini." Karena kita menelepon :%s/ lima kali berbeda , ini menghemat banyak. Ini \Madalah trik yang bagus. Ini berarti bahwa pencarian berikut akan menjadi "Very No Magic", yang berarti bahwa regex [B]akan cocok dengan teks literal [B]daripada rentang yang hanya berisi B di dalamnya. Karena sebagian besar perintah pengganti memiliki tanda kurung di dalamnya, kami mengisi yang pertama.

Kemudian, kami memanggil lima perintah pengganti. Perlu dicatat mengapa saya menelepon <C-v>berkali-kali. Karakter seperti <esc>, <C-v>, <C-r>, dll adalah karakter tak patut ditulis, dan harus diketik ke dalam baris perintah dengan <C-v>.

  • [B]: backspace. Yang ini cukup mudah. Cukup gantikan masing [B]- masing dengan Ctrl-h, yang setara dengan backspace dalam vim.

  • [C]: salin semua yang sudah ditulis. Ini diterjemahkan ke <esc>0y$A. Ini berarti:

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

    Kita hampir bisa melakukannya Ydi tempat 0y$yang berarti "menarik seluruh baris", tetapi ini juga mengambil baris baru yang tidak kita inginkan.

  • [D]: hapus semua yang sudah ditulis. Ini <esc>"_S. Seperti sebelumnya, <esc>keluar dari mode penyisipan sehingga kita dapat menjalankan perintah. Ada beberapa hal yang lebih nyaman di sini. Jadi kita lakukan

      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]: rekatkan apa yang sudah disalin. Yang ini juga sangat mudah. Itu hanya <C-r>"berarti Insert the contents of register '"'. "kebetulan menjadi register utama yang 'y' nyampai untuk.

Sekarang kita telah menerjemahkan semua perintah, kita harus menggabungkan semua baris bersama dengan menghapus semua karakter baris baru. Berkat pemetaan kami, ini adil

s<bs>\n

Ini <bs>adalah backspace, (ASCII 0x08) dan kami membutuhkannya karena [kami telah mengisinya.

Sekarang, kami telah menerjemahkan input ke dalam kode vim, dan kami hanya perlu menjalankannya. Jadi kami:

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

Di mana efek mode Sisipkan <C-r>didokumentasikan?
Neil

1
@Neil Secara umum, Anda dapat menemukan kunci untuk mode tertentu di :h mode_keystroke. Dalam hal ini, itu akan menjadi:h i_ctrl-r
DJMcMayhem

@ Loojo Oh maaf, saya lupa menyebutkan. Input diharapkan berada pada beberapa baris sehingga saya tidak perlu khawatir tentang koma, atau /gbendera. Saya akan menambahkan detailnya.
DJMcMayhem

2
Juga, apa fungsinya 0ii<esc>D@"?
Loovjo

1
Pemetaan, eh? :) terima kasih untuk penjelasan terperinci, saya selalu belajar sesuatu yang baru!
Christian Rondeau

9

CJam , 33 byte

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

Cobalah online!

Penjelasan

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.

Peta "fungsi hash" 1>3bmemetakan

  • string satu karakter ke 0 (= 0 mod 5),
  • [B]ke 291 (= 1 mod 5),
  • [D]ke 297 (= 2 mod 5),
  • [P]ke 333 (= 3 mod 5),
  • [C]ke 294 (= 4 mod 5).

Nilai ini (mod 5) digunakan sebagai indeks ke dalam daftar cuplikan kode CJam:

  • Untuk string karakter tunggal, katakanlah h, cuplikan "h"dikembalikan, yang mendorong string karakter tunggal ke tumpukan.
  • Karena [B], cuplikan ;dikembalikan, yang memunculkan elemen.
  • Sebab [D], potongan ];dikembalikan, yang membersihkan tumpukan.
  • Sebab [P], potongan L~dikembalikan, yang menambahkan variabel Lke tumpukan.
  • Sebab [C], potongan ]:L~dikembalikan, yang menyimpan tumpukan saat ini dalam variabel L.

Cuplikan ini disatukan dan dieksekusi; tumpukan terakhir dicetak secara implisit oleh CJam. Lawalnya daftar kosong, jadi buffer salinan awalnya "kosong".


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

Bisakah Anda memindahkan or"E"ke definisi xuntuk menghemat ruang?
xnor

@ xnor saya percaya begitu.
orlp

1
Sebenarnya, sepertinya mendefinisikan xitu tidak sepadan. The x=="C"saja bisa o=="[C]".
xnor

7

Jelly , 50 51 48 byte

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

TryItOnline
Atau semua test case

Bagaimana?

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

Sebagai contoh

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

- dengan modal 'B'sebagai test case, karena sebelum saya memperbaiki bug itu akan kembali"I likeees!"


1
Saya tidak yakin ini kasus tes yang valid, tapi saya mencoba dengan string terlalu rumit dan ini tampaknya gagal: ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings

Ah - ya saya ketinggalan case tepi ini, ada salinan sebelum menghapus seluruh string dan kode yang saya tulis mengabaikannya. Saya akan melihatnya sedikit nanti, terima kasih telah memberi tahu saya.
Jonathan Allan

OK saya memperbaikinya dan itu benar-benar menghemat byte juga!
Jonathan Allan

7

JavaScript (ES6), 84 80 77 76 byte

Disimpan 3 byte berkat @Neil, 1 lagi berkat @ 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 lebih panjang dua 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

Cuplikan tes


Perbedaannya adalah bahwa Anda dapat menyimpan 3 byte pada reduceversi dengan menggunakan (s,[c,z]).
Neil

@Neil Bagus! Itu menghemat satu byte pada .mapversi juga.
ETHproduk

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 lebih sedikit. Anehnya undefined <char apa pun salah
edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")menyimpan satu karakter lagi. Jika z benar, tempel, tambahkan char untuk output.
Grax32

@ Galx ketika menempelkan Anda harus menambahkan ke output saat ini, sehingga z?s+t:s+c1 byte lebih daris+=z?t:c
edc65

5

Perl, 53 50 byte

Termasuk +1 untuk -p

Berikan masukan pada STDIN yang diakhiri oleh baris baru (baris baru terakhir mungkin ditinggalkan, sehingga dianggap sebagai string yang dipisahkan oleh baris baru):

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

memberi

aHez

keystrokes.pl:

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

Hampir menangkap jawaban Jelly tetapi iblis lolos ke 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

Fungsi rekursif dengan input, s daftar tombol-stroke.

Setiap panggilan rekursif memperbarui teks kembali, rdan, dalam kasus a [C], clipboard,c hinggas kosong.

Nilai baru rdan cditemukan dengan mengindeks ke dalam kamus {...},, dan diteruskan dengan membongkar *,. Untuk penekanan tombol pasif s[0][1:2]akan mengembalikan string kosong dan kunci ''akan digunakan sebagai gantinya.


Bolehkah saya bertanya mengapa Anda mendefinisikan lambda sebagai lambda s,r='',c=''ganti lambda s,r,c=''?
L. Steer

Spesifikasinya adalah kita mengambil larik input karakter (di sini s) sehingga fungsinya perlu bekerja tanpa input lain.
Jonathan Allan

Permintaan maaf saya, kegagalan membaca pemahaman.
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""""

Cobalah di Ideone.

Penjelasan: k melakukan rekursi ekor atas daftar perintah. badalah buffer di mana string dibangun, cmenyimpan bagian yang disalin.

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

Sunting: Untuk menyimpan beberapa byte perintah [B][C][D][P]tidak lagi sama persis tetapi dibandingkan: kurang dari 'C'? -> Bdan seterusnya. Terima kasih kepada @nimi karena telah menghemat 3 byte.


@nimi init bmelempar pengecualian jika bdaftar kosong.
Laikoni

@nimi Itu pintar, terima kasih! Adapun fungsi anonim entah bagaimana ada dalam pikiran saya bahwa fungsi anonim hanya dapat diterima ketika mereka adalah satu-satunya pernyataan dan tidak ada fungsi pembantu lainnya. Namun pencarian Meta ternyata tidak seperti itu, jadi kurasa tidak apa-apa.
Laikoni

2
Ini dia . Diijinkan untuk mendeklarasikan fungsi pembantu untuk ekspresi yang mengevaluasi fungsi.
nimi

3

Mathematica, 100 byte

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

Fungsi anonim. Mengambil daftar string sebagai input dan mengembalikan string sebagai output. Abaikan semua pesan yang dihasilkan.


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

Ini bisa dipastikan golf lagi, tapi ini adalah jawaban awal saya. Akan mengedit setelah saya menemukan sesuatu untuk menghapus equals-checks .. diganti dengan charAt, tetapi mungkin masih bisa golf ..

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

Hello
Hello Hello 

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

2

PHP, 131 Bytes

17 Bytes disimpan oleh operator ternary @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);. (Ganti seluruh if()rantai Anda dengan rantai operasi trenary).
Ismael Miguel

@IsmaelMiguel Terima kasih. Saya tidak punya keinginan untuk menggunakan operator
Jörg Hülsermann

Saya bisa melihat alasannya. Terlihat sangat jelek dan ... itu benar-benar sesuatu yang menyakitkan mata.
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;

Menggunakan pendekatan berbasis string daripada pendekatan berbasis array.

Gunakan seperti:

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

sunting: disimpan 8 byte dengan mengotak-atik urutan?: s dan membuatnya negatif untuk menghindari keharusan menggunakan begitu banyak tanda kurung;


$s=$argv[++$i]alih-alih null!==$s=$argv[++$i]jika Anda menggunakan PHP> 7, Anda dapat menulis $s=$argv[++$i]??0untuk melewati pemberitahuan
Jörg Hülsermann

1
Itu tidak ada di sana untuk melewatkan pemberitahuan tetapi untuk memungkinkan Anda masuk '0'melihat bagaimana '0'palsu. Ada begitu banyak pemberitahuan lain yang terlewati sehingga orang tertentu tampak seperti buang-buang waktu.
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$

Input diberikan sebagai string dengan koma, yang kemudian diubah menjadi array.

masukkan deskripsi gambar di sini


1

V , 49 byte

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

Cobalah online!

Karena ini berisi karakter yang tidak patut dicetak, berikut adalah 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

Ini hanya terjemahan langsung dari jawaban vim saya sehingga saya bisa bersaing dengan Jelly. Sayangnya, saya masih satu byte lebih, tetapi saya masih mengerjakan yang terakhir. :)

Saya lebih bangga dengan jawaban itu, jadi jika Anda ingin penjelasan yang sangat rinci, bacalah yang itu.


1

Sebenarnya, 56 byte

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

Cobalah online!

Penjelasan:

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

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

Versi yang lebih mudah dibaca:

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

Anda dapat menyimpan beberapa byte (1 atau 2) dengan mengubah try catch Anda menjadiif(s.length()>1){...}else
AxelH

dan ubah p==1menjadip<2
AxelH

1

MATL , 46 byte

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

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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}

Diformat dengan baik:

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
}

Saya hanya ingin membuktikan bahwa saya bisa melakukan ini di TCL


Anda dapat menyimpan byte: ganti foreachdengan lmap; returnoleh set x. Inilah yang bisa saya katakan dengan cepat.
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

Tidak Disatukan:

(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

Memecahkan masalah ini sebagai lipatan dengan hasilnya dan clipboard sebagai akumulator. Sayangnya, scala tidak memiliki operator kondisional ternary, melainkan digunakan if elsesebagai ekspresi.


1

PHP 7.1, 95 92 byte

Catatan: membutuhkan PHP 7.1 untuk offset string negatif.

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;

Tanpa offset string negatif (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

Jalankan seperti ini:

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!

Penjelasan

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

  • Disimpan 3 byte dengan menggabungkan penanganan keluaran dengan penanganan perintah

Senang melihat entri PHP dijelaskan secara terperinci :)
Emigna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.