Mô phỏng tổ hợp phím


33

Công việc của bạn là mô phỏng một vài tổ hợp phím mà người dùng gõ vào.

Đầu vào

Một mảng chuỗi hoặc chuỗi có dấu phân cách bạn chọn (nằm ngoài phạm vi 32-126) có chứa ít nhất một 'tổ hợp phím'.

Mảng này sẽ chỉ chứa hai loại chuỗi: tổ hợp phím thụ động (ký tự đơn) và lệnh (ký tự trong ngoặc [ ]).

  • Tổ hợp phím thụ động
    1. Mã ký tự ASCII [32-126]
  • Các lệnh:
    1. [B] : backspace (xóa ký tự cuối cùng được thêm nếu có)
    2. [C] : sao chép tất cả những gì đã được viết
    3. [D] : xóa tất cả những gì đã được viết
    4. [P] : dán những gì đã được sao chép

Đầu ra

Chuỗi được tạo ra bởi tổ hợp phím.

Ví dụ

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


FYI Tôi đã tìm thấy một lỗi trong mã của mình, tôi có thể đề xuất một trường hợp thử nghiệm với số vốn B cho ong không :)
Jonathan Allan

Cũng cần có một ví dụ với việc [D]nó không phải là cái duy nhất được sử dụng, vì vậy mã sẽ không phải là split('[D]')[1]thứ gì đó.
mbomb007

@ mbomb007, tôi đã thêm các trường hợp thử nghiệm (# 8, # 9)
Daniel

Và tôi nghĩ rằng mbomb007 đã yêu cầu một trường hợp thử nghiệm với nhiều lần xóa.
Martin Ender

@MartinEnder, oh tôi nghĩ rằng anh ấy muốn một nơi có các lệnh khác hơn[D]
Daniel

Câu trả lời:


7

05AB1E , 34 33 31 27 byte

Sử dụng mã hóa CP-1252 .

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

Hãy thử trực tuyến!

Giải trình

õ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

Các cặp hàm được đánh giá trong đoạn mã trên là:

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 

Đã lưu 4 byte bằng mod 5thủ thuật từ câu trả lời CJam của Lynn


34

Vim, 76, 64, 62 , 58 tổ hợp phím

Cảm ơn Loovjo vì đã lưu 7 tổ hợp phím


Có ai đó nói mô phỏng tổ hợp phím? Vậy thì, đó là một điều tốt mà ngôn ngữ yêu thích của tôi khi chơi golf là tất cả về mô phỏng tổ hợp phím!

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

Đầu vào có định dạng này:

h
e
l
l
o

[C]
[P]

Đây là một câu trả lời khá đơn giản. Nó chỉ dịch mỗi "lệnh" thành tổ hợp phím vim tương đương với lệnh đó. Hãy đi từng dòng một.

:no s :%s/\M[

Điều này tiết kiệm được một tấn byte. Vim có một "dòng lệnh" dựng sẵn, nơi bạn có thể tạo ánh xạ, thay đổi cài đặt, lưu tệp, v.v ... Ở đây chúng tôi đang tạo ánh xạ. :nolà viết tắt của từ :nnoremapnày có nghĩa là "Khi chúng ta ở chế độ bình thường, hãy thay thế bên tay trái này cho phía bên tay phải này." Vì chúng tôi đang gọi :%s/ năm lần khác nhau , điều này tiết kiệm rất nhiều. Đây \Mlà một mẹo hay. Điều đó có nghĩa là tìm kiếm sau đây sẽ là "Very No Magic", điều đó có nghĩa là regex [B]sẽ khớp với văn bản theo nghĩa đen [B]chứ không phải là một phạm vi chỉ chứa B trong đó. Vì phần lớn các lệnh thay thế có dấu ngoặc trong chúng, chúng tôi điền vào lệnh đầu tiên.

Sau đó, chúng tôi gọi năm lệnh thay thế. Thật đáng chú ý tại sao tôi gọi <C-v>rất nhiều lần. Nhân vật thích <esc>, <C-v>, <C-r>, vv là nhân vật chưa in ra, và phải được gõ vào dòng lệnh với một <C-v>.

  • [B]: không gian lùi. Điều này là khá dễ dàng. Đơn giản chỉ cần thay mỗi [B]với Ctrl-h, tương đương với phím lùi trong vim.

  • [C]: sao chép tất cả những gì đã được viết. Điều này được dịch sang <esc>0y$A. Điều này có nghĩa là:

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

    Chúng ta gần như có thể làm đơn giản Ythay cho 0y$điều đó có nghĩa là "kéo dài toàn bộ dòng", nhưng điều này cũng lấy một dòng mới mà chúng ta không muốn.

  • [D]: xóa tất cả những gì đã được viết. Đây là <esc>"_S. Như trước đây, <esc>thoát khỏi chế độ chèn để chúng ta có thể chạy các lệnh. Có một số điều thuận tiện hơn ở đây. Vì vậy chúng tôi làm

      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]: dán những gì đã được sao chép. Điều này cũng rất đơn giản. Nó chỉ <C-r>"là phương tiện Insert the contents of register '"'. "tình cờ là đăng ký chính mà 'y' yanks đến.

Bây giờ chúng tôi đã dịch tất cả các lệnh, chúng tôi phải nối tất cả các dòng lại với nhau bằng cách xóa tất cả các ký tự dòng mới. Nhờ bản đồ của chúng tôi, đây chỉ là

s<bs>\n

Đây <bs>là một backspace, (ASCII 0x08) và chúng tôi cần nó vì [chúng tôi đã điền vào.

Đến bây giờ, chúng tôi đã dịch đầu vào thành mã vim và chúng tôi chỉ cần chạy nó. Vì vậy, chúng tôi:

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

Hiệu ứng chế độ Chèn của <C-r>tài liệu ở đâu?
Neil

1
@Neil Nói chung, bạn có thể tìm thấy một khóa cho một chế độ cụ thể tại :h mode_keystroke. Trong trường hợp này, nó sẽ là:h i_ctrl-r
DJMcMayhem

@Loovjo Xin lỗi, tôi quên đề cập đến. Đầu vào dự kiến ​​sẽ nằm trên nhiều dòng để tôi không phải lo lắng về dấu phẩy hoặc /gcờ. Tôi sẽ thêm các chi tiết đó vào.
DJMcMayhem

2
Ngoài ra, 0ii<esc>D@"làm gì?
Loovjo

1
Ánh xạ, hả? :) cảm ơn đã giải thích chi tiết, tôi luôn học được điều gì đó mới!
Christian Rondeau

9

CJam , 33 byte

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

Hãy thử trực tuyến!

Giải trình

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.

Các hàm băm của 1>3bbản đồ

  • chuỗi ký tự đơn thành 0 (= 0 mod 5),
  • [B]đến 291 (= 1 mod 5),
  • [D]đến 297 (= 2 mod 5),
  • [P]đến 333 (= 3 mod 5),
  • [C]đến 294 (= 4 mod 5).

Giá trị này (mod 5) được sử dụng làm chỉ mục trong danh sách các đoạn mã của CJam:

  • Đối với các chuỗi ký tự đơn, giả sử h, đoạn mã "h"được trả về, sẽ đẩy một chuỗi ký tự đơn vào ngăn xếp.
  • Đối với [B], đoạn mã ;được trả về, hiện ra một phần tử.
  • Đối với [D], đoạn mã ];được trả lại, sẽ xóa ngăn xếp.
  • Đối với [P], đoạn mã L~được trả về, sẽ thêm biến Lvào ngăn xếp.
  • Đối với [C], đoạn mã ]:L~được trả về, lưu trữ ngăn xếp hiện tại trong biến L.

Các đoạn này được nối và thực hiện; ngăn xếp cuối cùng được in ngầm bởi CJam. Lban đầu là danh sách trống, do đó, bộ đệm sao chép ban đầu là trống rỗng.


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

Bạn có thể di chuyển or"E"đến định nghĩa xđể tiết kiệm một không gian?
xnor

@xnor Mình tin vậy.
orlp

1
Trên thực tế, có vẻ như định nghĩa xkhông có giá trị nó. Chỉ x=="C"có thể là o=="[C]".
xnor

7

Thạch , 50 51 48 byte

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

TryItOnline
Hoặc tất cả các trường hợp thử nghiệm

Làm sao?

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

Ví dụ

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

- với số vốn 'B'là trường hợp thử nghiệm, vì trước khi tôi sửa một lỗi, nó sẽ quay trở lại"I likeees!"


1
Tôi không chắc đó là trường hợp kiểm tra hợp lệ, nhưng tôi đã thử với một chuỗi quá phức tạp và điều này dường như không thành công : ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!'].
Dom Hastings

À - vâng tôi đã bỏ lỡ trường hợp cạnh này, có một bản sao trước khi xóa toàn bộ chuỗi và mã tôi đã viết bỏ qua nó. Tôi sẽ xem xét nó một lát sau, cảm ơn vì đã thông báo cho tôi.
Jonathan Allan

OK tôi đã sửa nó lên và nó thực sự cũng tiết kiệm byte!
Jonathan Allan

7

JavaScript (ES6), 84 80 77 76 byte

Đã lưu 3 byte nhờ @Neil, thêm 1 byte nhờ @ 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 dài hơn hai 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

Kiểm tra đoạn


Sự khác biệt là bạn có thể lưu 3 byte trên reducephiên bản bằng cách sử dụng (s,[c,z]).
Neil

@Neil Đẹp! Điều đó cũng tiết kiệm một byte trên .mapphiên bản.
Sản phẩm ETH

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')Ít hơn 1 byte. Tò mò không xác định <bất kỳ char nào là sai
edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")tiết kiệm thêm một nhân vật. Nếu z là trung thực, dán, khác thêm char vào đầu ra.
Grax32

@Grax khi dán bạn phải thêm vào đầu ra hiện tại, như vậy z?s+t:s+cnhiều hơn 1 byte so vớis+=z?t:c
edc65

5

Perl, 53 50 byte

Bao gồm +1 cho -p

Cung cấp đầu vào trên STDIN bị chấm dứt bởi các dòng mới (dòng mới cuối cùng có thể bị bỏ qua, do đó, nó được tính là một chuỗi được phân tách bởi các dòng mới):

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

cho

aHez

keystrokes.pl:

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

Gần như đã bắt được câu trả lời của Jelly nhưng kẻ thù đã trốn thoát tới 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

Ý tưởng

Một hàm đệ quy với đầu vào s, một danh sách các nét chính.

Mỗi cuộc gọi đệ quy cập nhật văn bản trả về rvà, trong trường hợp a [C], bảng tạm, ccho đến khi strống.

Các giá trị mới của rcđược tìm thấy bằng cách lập chỉ mục vào một từ điển {...}và được giải nén *. Đối với tổ hợp phím bị động s[0][1:2]sẽ trả về một chuỗi trống và khóa ''sẽ được sử dụng thay thế.


Tôi có thể hỏi tại sao bạn định nghĩa lambda lambda s,r='',c=''thay vì lambda s,r,c=''?
L. Chỉ đạo

Đặc điểm kỹ thuật là chúng ta lấy một mảng các ký tự đầu vào (ở đây s) để hàm cần hoạt động mà không có đầu vào nào khác.
Jonathan Allan

Tôi xin lỗi, đọc hiểu thất bại.
L. Chỉ đạo

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

Hãy thử nó trên Ideone.

Giải thích: k thực hiện đệ quy đuôi trên danh sách các lệnh. blà bộ đệm trong đó chuỗi được xây dựng, clưu phần sao chép.

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

Chỉnh sửa: Để lưu một số byte, các lệnh [B][C][D][P]không còn khớp chính xác nhưng được so sánh: ít hơn 'C'? -> Bvân vân. Cảm ơn @nimi đã lưu 3 byte.


@nimi init bném một ngoại lệ nếu blà danh sách trống.
Laikoni

@nimi Thật thông minh, cảm ơn! Đối với hàm ẩn danh, bằng cách nào đó tôi đã nghĩ rằng các hàm ẩn danh chỉ được chấp nhận khi chúng là câu lệnh duy nhất và không có hàm trợ giúp nào khác. Tuy nhiên, việc tìm kiếm Meta không có kết quả như vậy, vì vậy tôi đoán nó ổn.
Laikoni

2
Ở đây nó là . Nó được phép khai báo các hàm trợ giúp cho các biểu thức đánh giá các hàm.
nimi

3

Toán học, 100 byte

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

Chức năng ẩn danh. Lấy danh sách các chuỗi làm đầu vào và trả về một chuỗi làm đầu ra. Bỏ qua bất kỳ tin nhắn được tạo ra.


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

Điều này chắc chắn có thể được chơi golf nhiều hơn, nhưng đây là câu trả lời ban đầu của tôi. Sẽ chỉnh sửa sau khi tôi tìm thấy nội dung nào đó để xóa những equalskiểm tra đó .. thay thế bằngcharAt , nhưng có lẽ vẫn có thể bị đánh gôn ..

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

Hello
Hello Hello 

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

2

PHP, 131 byte

17 byte tiết kiệm bởi toán tử 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);. (thay thế toàn bộ if()chuỗi của bạn bằng một chuỗi các hoạt động ba lần).
Ismael Miguel

@IsmaelMiguel Cảm ơn bạn. Tôi không muốn sử dụng toán tử
Jörg Hülsermann

Tôi có thể thấy tại sao. Trông nó thật xấu xí và ... nó thực sự là một thứ gây đau mắt.
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;

Sử dụng một cách tiếp cận dựa trên chuỗi chứ không phải là một mảng dựa trên.

Sử dụng như:

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

chỉnh sửa: đã lưu 8 byte bằng cách thay đổi thứ tự của ?: s và làm cho chúng âm để tránh phải sử dụng quá nhiều dấu ngoặc;


$s=$argv[++$i]thay vì null!==$s=$argv[++$i]nếu bạn sử dụng PHP> 7, bạn có thể viết $s=$argv[++$i]??0để bỏ qua thông báo
Jörg Hülsermann

1
Nó không ở đó để bỏ qua thông báo mà cho phép bạn nhập '0'xem như thế nào '0'là sai. Có rất nhiều thông báo khác mà bỏ qua mà đặc biệt có vẻ như là một sự lãng phí thời gian.
dùng59178

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$

Đầu vào được đưa ra dưới dạng một chuỗi với dấu phẩy, sau đó được chuyển thành mảng.

nhập mô tả hình ảnh ở đây


1

V , 49 byte

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

Hãy thử trực tuyến!

Vì phần này chứa các ký tự không thể in được, đây là một 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

Đây chỉ là một bản dịch trực tiếp của câu trả lời vim của tôi để tôi có thể cạnh tranh với Jelly. Thật không may, tôi vẫn còn một byte, nhưng tôi vẫn đang làm việc trên cái cuối cùng. :)

Dù sao tôi cũng tự hào hơn về câu trả lời đó, vì vậy nếu bạn muốn một lời giải thích rất chi tiết, thay vào đó hãy đọc câu trả lời đó.


1

Trên thực tế, 56 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Phiên bản dễ đọc hơn:

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

Bạn có thể lưu một số byte (1 hoặc 2) bằng cách thay đổi lần thử của bạn thành mộtif(s.length()>1){...}else
AxelH

và đổi p==1thànhp<2
AxelH

1

MATL , 46 byte

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

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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}

Định dạng độc đáo:

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
}

Tôi chỉ muốn chứng minh rằng tôi có thể làm điều này trong TCL


Bạn có thể lưu byte: thay thế foreachbằng lmap; returnbởi set x. Đây là những gì tôi có thể nói trong nháy mắt nhanh chóng.
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

Ung dung:

(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

Giải quyết vấn đề này như một nếp gấp với kết quả và bảng tạm dưới dạng tích lũy. Đáng buồn thay, scala không có toán tử điều kiện ternary, mà thay vào đó sử dụng if elsenhư một biểu thức.


1

PHP 7.1, 95 92 byte

Lưu ý: yêu cầu PHP 7.1 cho các chuỗi bù âm.

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;

Không có offset chuỗi âm (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

Chạy như thế này:

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!

Giải trình

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.

Tinh chỉnh

  • Đã lưu 3 byte bằng cách kết hợp xử lý đầu ra với xử lý lệnh

Rất vui khi thấy một mục PHP được giải thích chi tiết :)
Emigna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.