จำลองการกดแป้น


33

งานของคุณคือการจำลองการกดแป้นที่ผู้ใช้พิมพ์

อินพุต

อาเรย์สตริงหรือสตริงที่มีตัวคั่นที่คุณเลือก (นอกช่วง 32-126) ที่มี 'การกดแป้นพิมพ์' อย่างน้อยหนึ่งรายการ

อาร์เรย์นี้จะมีสตริงสองประเภทเท่านั้น: การกดแป้นพิมพ์แบบพาสซีฟ (ตัวอักษรเดียว) และคำสั่ง (ตัวอักษรภายในเครื่องหมายวงเล็บ[ ])

  • การกดแป้นเรื่อย ๆ
    1. รหัสอักขระ ASCII [32-126]
  • คำสั่ง:
    1. [B] : backspace (ลบอักขระตัวสุดท้ายที่เพิ่มหากมี)
    2. [C] : คัดลอกทุกสิ่งที่เขียนไปแล้ว
    3. [D] : ลบสิ่งที่เขียนทั้งหมด
    4. [P] : วางสิ่งที่คัดลอกมา

เอาท์พุต

สตริงที่ผลิตโดยการกดแป้น

ตัวอย่าง

['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


FYI ผมพบข้อผิดพลาดในรหัสของฉันฉันอาจแนะนำกรณีทดสอบที่มี B ทุนสำหรับผึ้ง :)
โจนาธานอัลลัน

ควรมีตัวอย่าง[D]ที่ไม่ได้ใช้เพียงอย่างเดียวดังนั้นรหัสจะไม่ได้เป็นเพียงsplit('[D]')[1]บางอย่าง
mbomb007

@ mbomb007 ฉันเพิ่มกรณีทดสอบ (# 8, # 9)
Daniel

และฉันคิดว่า mbomb007 กำลังร้องขอกรณีทดสอบที่มีการลบหลายรายการ
Martin Ender

@ มาร์ตินเอนเดอร์ฉันคิดว่าเขาต้องการที่ที่มีคำสั่งอื่นนอกเหนือจาก[D]
แดเนียล

คำตอบ:


7

05AB1E , 34 33 31 27 ไบต์

ใช้การเข้ารหัสCP-1252

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

ลองออนไลน์!

คำอธิบาย

õU                                  # initialize X as the empty string
v                                   # for each y in input
 ygiyJ                              # if len(y) == 1 join y with stack
      ë                             # else
       "XJ¨DU\"                     # push this string
               4ä                   # split into 4 parts (of size [2,1,2,1])
                 yá                 # push only letters of y
                   Ç5%              # mod its ascii code by 5
                      è             # index into the string above with this
                       .V           # evaluate as 05AB1E code

คู่ของฟังก์ชั่นการประเมินในรหัสข้างต้นคือ:

DU    # [C] -> duplicate and store in X
XJ    # [P] -> push X and join with stack
¨     # [B] -> remove last char of string
\     # [D] -> remove top of stack 

บันทึก 4 ไบต์โดยใช้mod 5เคล็ดลับจากคำตอบ CJam ของ Lynn


34

เป็นกลุ่ม, 76, 64, 62 , 58 การกดแป้น

ขอบคุณ Loovjo สำหรับการบันทึกการกดแป้น 7 ครั้ง


มีคนบอกว่าจำลองการกดแป้นพิมพ์หรือไม่? ถ้าอย่างนั้นมันเป็นสิ่งที่ดีภาษาที่ชื่นชอบการเล่นกอล์ฟในคือทั้งหมดที่เกี่ยวกับการกดแป้นพิมพ์จำลอง!

:no s :%s/\M[
sB]/<C-v><C-h>
sC]/<C-v><esc>0y$A
sD]/<C-v><esc>"_S
sP]/<C-v><C-r>"
s<bs>\n
S<C-r>"

อินพุตมาในรูปแบบนี้:

h
e
l
l
o

[C]
[P]

นี่เป็นคำตอบที่ตรงไปตรงมา มันแค่แปล "คำสั่ง" แต่ละคำเป็นคำสั่ง vim keystroke ที่เทียบเท่ากับคำสั่งนั้น ลองดูทีละบรรทัด

:no s :%s/\M[

นี้จะช่วยประหยัดตันของไบต์ Vim มี "command line" ในตัวที่คุณสามารถสร้างการแมปเปลี่ยนการตั้งค่าบันทึกไฟล์ ฯลฯ ที่นี่เรากำลังสร้างการแมป :noสั้น:nnoremapซึ่งหมายความว่า "เมื่อเราอยู่ในโหมดปกติให้แทนที่ด้านซ้ายมือนี้สำหรับด้านขวามือนี้" เนื่องจากเรากำลังเรียก:%s/ ห้าครั้งที่แตกต่างกันสิ่งนี้ช่วยประหยัดได้มาก นี่\Mเป็นกลลวงที่ดี หมายความว่าการค้นหาต่อไปนี้จะเป็น "Very No Magic" ซึ่งหมายความว่า regex [B]จะตรงกับข้อความตามตัวอักษร[B]มากกว่าช่วงที่มีเพียง B ในนั้น เนื่องจากคำสั่งส่วนใหญ่มีวงเล็บอยู่ในคำสั่งเราจึงกรอกคำสั่งแรก

จากนั้นเราเรียกคำสั่งทดแทนห้าคำสั่ง มันเป็นเรื่องน่าสังเกตว่าทำไมฉันถึงเรียก<C-v>หลายครั้ง ตัวอักษรเช่น<esc>, <C-v>, <C-r>ฯลฯ เป็นตัวละคร unprintable <C-v>และต้องพิมพ์ลงในบรรทัดคำสั่งด้วย

  • [B]: backspace อันนี้ค่อนข้างง่าย เพียงแค่แทนที่[B]ด้วยCtrl-hซึ่งเทียบเท่ากับ backspace ในกลุ่ม

  • [C]: คัดลอกทุกสิ่งที่เขียนไปแล้ว <esc>0y$Aนี้จะแปลให้ หมายความว่า:

    <esc>      " Escape to normal mode
         0     " Move to the beginning of this line
          y$   " Yank to the end of the line
            A  " Re enter insert mode at the end of this line.
    

    เราเกือบจะทำYใน0y$สิ่งที่หมายถึง "งัดทั้งบรรทัด" แต่นี่ก็ยังขึ้นบรรทัดใหม่ที่เราไม่ต้องการ

  • [D]: ลบสิ่งที่เขียนทั้งหมด <esc>"_Sนี่คือ ก่อนหน้านี้<esc>ออกจากโหมดแทรกเพื่อให้เราสามารถเรียกใช้คำสั่ง มีบางสิ่งที่สะดวกกว่าที่นี่ ดังนั้นเราทำ

      S         " Delete this whole line and enter insert mode again
    "_          " Send it to 'the black hole register'. This is just so that we don't overwrite the main register.
    
  • [P]: วางสิ่งที่คัดลอกแล้ว อันนี้ตรงไปตรงมามาก มันเป็นเพียงซึ่งหมายความว่า<C-r>" เกิดขึ้นเป็นทะเบียนหลักที่ 'y' yanks ไปInsert the contents of register '"'"

ตอนนี้เราได้แปลคำสั่งทั้งหมดแล้วเราจะต้องรวมบรรทัดทั้งหมดเข้าด้วยกันโดยการลบอักขระบรรทัดใหม่ทั้งหมด ขอบคุณการทำแผนที่ของเรานี่เป็นเพียง

s<bs>\n

นี่<bs>คือ backspace (ASCII 0x08) และเราต้องการมันเพราะ[เราเติมเต็ม

ถึงตอนนี้เราได้แปลอินพุทเป็นวีไอเอ็มโค้ดแล้วและเราก็ต้องรันมัน ดังนั้นเรา:

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

เอฟเฟกต์โหมดแทรกของ<C-r>เอกสารอยู่ที่ไหน
Neil

1
@Neil :h mode_keystrokeโดยทั่วไปแล้วคุณจะพบที่สำคัญสำหรับโหมดเฉพาะที่ ในกรณีนี้มันจะเป็น:h i_ctrl-r
DJMcMayhem

@ Loovjo โอ้ขอโทษฉันลืมพูดถึง การป้อนข้อมูลคาดว่าจะมีหลายบรรทัดดังนั้นฉันจึงไม่ต้องกังวลกับเครื่องหมายจุลภาคหรือการ/gตั้งค่าสถานะ ฉันจะเพิ่มรายละเอียดเหล่านั้นใน
DJMcMayhem

2
นอกจากนี้จะ0ii<esc>D@"ทำอย่างไร?
Loovjo

1
แมปใช่มั้ย :) ขอบคุณสำหรับคำอธิบายอย่างละเอียดฉันมักจะเรียนรู้สิ่งใหม่!
Christian Rondeau

9

CJam , 33 ไบต์

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

ลองออนไลน์!

คำอธิบาย

q~                                  Read an evaluate input list.
  {                          }%     Map over each string in it:
   _                                 Duplicate the string, say S.
    [`';"];""L~""]:L~"]              Replace it the following list:
                                      [repr(S) '; "];" "L~" "]:L~"]
                       \             Bring S on top of the stack.
                        1>           Chop off the first char.
                          3b         Base-3 conversion.
                            =        Modular index into the list.
                               s~   Concatenate and run as CJam code.

1>3bแมป“ ฟังก์ชันแฮช”

  • สตริงอักขระเดี่ยวเป็น0 (= 0 mod 5)
  • [B]ถึง291 (= 1 mod 5)
  • [D]ถึง297 (= 2 mod 5)
  • [P]ถึง333 (= 3 mod 5)
  • [C]ถึง294 (= 4 mod 5)

ค่านี้ (mod 5) ใช้เป็นดัชนีในรายการโค้ดตัวอย่างของ CJam:

  • สำหรับสตริงตัวอักขระเดี่ยวhตัวอย่างข้อมูล"h"จะถูกส่งคืนซึ่งจะส่งสตริงอักขระเดี่ยวไปยังสแต็ก
  • สำหรับ[B]ตัวอย่าง;จะถูกส่งกลับซึ่งปรากฏองค์ประกอบ
  • สำหรับ[D]ตัวอย่าง];จะถูกส่งกลับซึ่งล้างสแต็ก
  • สำหรับ[P]ตัวอย่างL~จะถูกส่งกลับซึ่งผนวกตัวแปรLลงในสแต็ก
  • สำหรับ[C]ข้อมูลโค้ดจะถูกส่งกลับที่เก็บกองในปัจจุบันในตัวแปร]:L~L

ตัวอย่างเหล่านี้ถูกต่อกันและดำเนินการ สแตกสุดท้ายถูกพิมพ์โดย CJam Lเป็นรายการที่ว่างเปล่าเริ่มแรกดังนั้นบัฟเฟอร์การคัดลอกเริ่มแรกเป็น "ว่าง"


8

Python 2, 96 95 93 ไบต์

r=c=""
for o in input():c=[c,r][x=="[C]"];r=[r+c,r[:-1],r,"",r+o][ord(o[1:2]or"E")%5]
print r

คุณสามารถย้ายor"E"ไปที่คำจำกัดความของxเพื่อประหยัดพื้นที่ได้หรือไม่?
xnor

@ xnor ฉันเชื่ออย่างนั้น
orlp

1
ที่จริงแล้วดูเหมือนว่าการกำหนดxไม่คุ้มค่า เพียงสามารถx=="C" o=="[C]"
xnor

7

เจลลี่ , 50 51 48 ไบต์

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

TryItOnline
หรือกรณีทดสอบทั้งหมด

อย่างไร?

Ṿ”;;µṭ“Ṗ“ø©“ḣ0“;®” - Link 1, CreateCodeLookupValueList: keystroke
      “Ṗ“ø©“ḣ0“;®” - list of strings, ["Ṗ","ø©","ḣ0"";®"] - these are Jelly code for:
                         Ṗ  : pop (i.e. delete last entry)
                         ø© : niladic separation and copy to register (i.e. copy)
                         ḣ0 : head to 0 (i.e. delete all entries)
                         ;® : concatenate with value of register (i.e. paste)
    µ              - monadic chain separation
Ṿ                  - uneval - make a Jelly code version of the keystroke
                                               e.g. "I" -> "“I”"
 ”;                - string literal ";"                      |
   ;               - concatenate e.g. ";I"                   v
     ṭ             - tack, to make the list ["Ṗ","ø©",";®","“I”"] 
                             a keystroke - a command will evaluate to a string like
                             "“[C]”" but wont be accessed)

L>1a2ị$i@“BCDP0”ịÇ - Link 2, ConvertAKeystokeToJellyCodeString: keystroke
L>1                - length greater than 1? (i.e. isCommand?)
      $            - last two links as a monad
   a               - and
    2ị             - index 2 of the keystroke (0 due to and for a passive keystroke)
         “BCDP0”   - Literal string "BCP0"
       i@          - find first matching index of, with reversed arguments
                ị  - index into
                 Ç - call last link (1) as a monad (get code to replace this keystroke)

Ç€“⁶Ṗ©”;FV - Main link: list of keystrokes
Ç€         - call last link (2) as a monad (convert to Jelly code)
  “⁶Ṗ©”    - literal string "⁶Ṗ©" - setup the register with an empty string:
                 ⁶ :literal " ";
                 Ṗ : pop the space to give an empty string;
                 © : places it into the register
       ;   - concatenate (put that at the front)
        F  - flatten list (lists and strings are equivalent in Jelly)
         V - evaluate the string

ตัวอย่างเช่น

The input:
    ['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'B', '[P]', '[P]', 's', '!']
Becomes the Jelly code:
    "⁶Ṗ©;“e”ø©Ṗ;“I”;“ ”;“l”;“i”;“k”;®;“ ”;“B”;®;®;“s”;“!”"
Which then evaluates to
    "I like Bees!"

- ด้วยทุน'B'เป็นกรณีทดสอบตั้งแต่ก่อนที่ฉันจะแก้ไขข้อผิดพลาดมันจะกลับมา"I likeees!"


1
ผมไม่แน่ใจว่ามันเป็นกรณีทดสอบที่ถูกต้อง ['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']แต่ฉันพยายามกับสตริงที่ซับซ้อนมากเกินไปและนี้ดูเหมือนจะล้มเหลว
Dom Hastings

อ่า - ใช่ฉันพลาดกรณีขอบนี้มีสำเนาก่อนที่จะลบทั้งสายและรหัสที่ฉันเขียนไม่สนใจมัน ฉันจะดูทีหลังเล็กน้อยขอบคุณที่แจ้งให้ฉันทราบ
Jonathan Allan

ตกลงฉันแก้ไขมันแล้วและมันก็ช่วยประหยัดไบต์ด้วยเช่นกัน!
Jonathan Allan

7

JavaScript (ES6), 84 80 77 76 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @Neil และอีก 1 ขอบคุณ @ @ edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,t="")

.map มีความยาวสองไบต์:

x=>x.map(([c,z])=>s=z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":s+=z?t:c,s=t="")&&s

ตัวอย่างการทดสอบ


ความแตกต่างคือที่คุณสามารถบันทึก 3 ไบต์ในรุ่นโดยใช้reduce (s,[c,z])
Neil

@ นีล Nice! นั่นช่วยประหยัดไบต์บน.mapเวอร์ชันด้วย
ETHproductions

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')น้อยกว่า 1 ไบต์ ไม่ได้กำหนดอย่างแน่นอนอยากรู้อยากเห็น <ถ่านใด ๆ ที่เป็นเท็จ
edc65

x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")บันทึกอีกหนึ่งตัวอักษร หาก z เป็นความจริงให้วางและเพิ่มอักขระอื่นลงในเอาต์พุต
Grax32

@Grax เมื่อวางคุณต้องเพิ่มไปยังเอาต์พุตปัจจุบันดังนั้นz?s+t:s+cนั่นคือ 1 ไบต์มากกว่าs+=z?t:c
edc65

5

Perl, 53 50 ไบต์

รวม +1 สำหรับ -p

ให้อินพุตกับ STDIN ที่ถูกยกเลิกโดยการขึ้นบรรทัดใหม่ (อาจขึ้นบรรทัดใหม่ล่าสุดได้ดังนั้นจึงนับเป็นสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่):

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

จะช่วยให้

aHez

keystrokes.pl:

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

เกือบถูกจับได้คำตอบของเจลลี่ แต่อสูรหนีไป 48 ไบต์ ...


4

Python 120 119 116 ไบต์

f=lambda s,r='',c='':f(s[1:],*{'B':(r[:-1],c),'C':(r,r),'D':('',c),'P':(r+c,c),'':(r+s[0],c)}[s[0][1:2]])if s else r

Ideone

ฟังก์ชั่นวนซ้ำพร้อมอินพุต, sรายการของการกดคีย์

การเรียกซ้ำแบบเรียกซ้ำแต่ละครั้งจะอัปเดตข้อความที่ส่งคืนrและในกรณีของ a [C]คลิปบอร์ดcจนกว่าsจะว่างเปล่า

ค่าใหม่rและcจะพบได้โดยการจัดทำดัชนีลงในพจนานุกรมและผ่านที่มีการเปิดออก{...} *สำหรับการกดแป้นพาสซีฟs[0][1:2]จะส่งคืนสตริงว่างและ''จะใช้คีย์แทน


ฉันอาจถามว่าทำไมคุณถึงนิยามแลมบ์ดาlambda s,r='',c=''แทนlambda s,r,c=''?
L. Steer

ข้อมูลจำเพาะคือเราใช้อาร์เรย์ของอักขระ (ที่นี่s) ดังนั้นฟังก์ชันต้องทำงานโดยไม่มีอินพุตอื่น
Jonathan Allan

ขอโทษที่อ่านล้มเหลวเข้าใจ
L. Steer

4

Haskell, 136 133 130 127 ไบต์

k c b(('[':m:_):i)|m<'C'=k c[q|b>"",q<-init b]i|m<'D'=k b b i|m<'P'=k c""i|1<3=k c(b++c)i
k c b(s:i)=k c(b++s)i
k c b[]=b
k""""

ลองใช้กับ Ideone

คำอธิบาย: kทำการเรียกซ้ำหางเหนือรายการคำสั่ง bเป็นบัฟเฟอร์ที่สตริงถูกสร้างขึ้นcบันทึกส่วนที่คัดลอก

k c b ("[B]":i) = k c (take(length b - 1)b) i -- remove last element of buffer
k c b ("[C]":i) = k b b i                     -- set copy to buffer
k c b ("[D]":i) = k c "" i                    -- clear the buffer
k c b ("[P]":i) = k c (b++c) i                -- append content of copy to the buffer
k c b (s:i)     = k c (b++s) i                -- append char to the buffer
k c b []        = b                           -- command list is empty, return buffer
f = k "" ""                                   -- initialise copy and buffer with empty strings

แก้ไข:เพื่อบันทึกไบต์บางคำสั่ง[B][C][D][P]จะไม่ตรงกัน แต่เปรียบเทียบ: น้อยกว่า'C'? -> Bและอื่น ๆ ขอบคุณ@nimiสำหรับการบันทึก 3 ไบต์


@nimi init bมีข้อผิดพลาดถ้าbเป็นรายการที่ว่างเปล่า
Laikoni

@nimi นั่นเป็นคนฉลาดขอบคุณ! สำหรับฟังก์ชั่นที่ไม่ระบุชื่อฉันคิดว่าฟังก์ชั่นที่ไม่ระบุชื่อนั้นเป็นที่ยอมรับได้ก็ต่อเมื่อมันเป็นคำสั่งเดียวและไม่มีฟังก์ชั่นช่วยเหลืออื่น ๆ อย่างไรก็ตามการค้นหา Meta ไม่ได้เป็นอย่างนั้นดังนั้นฉันคิดว่ามันใช้ได้
Laikoni

2
นี่มันเป็น อนุญาตให้ประกาศฟังก์ชันตัวช่วยสำหรับนิพจน์ที่ประเมินค่าฟังก์ชัน
nimi

3

Mathematica ขนาด 100 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อ รับรายการสตริงเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต ละเว้นข้อความใด ๆ ที่สร้างขึ้น


2

Java 7, 207 203 ไบต์

String c(String[]a){String r="",c=r;for(String s:a){int k=s.length(),l=r.length(),z;if(k>1){z=s.charAt(1);r=z<67?l>0?r.substring(0,l-1):"":z<68?r:z<69?"":z<81?r+c:r+s;c=z==67?r:c;}r+=k<2?s:"";}return r;}

นี่สามารถตีกอล์ฟได้มากกว่านี้ แต่นี่เป็นคำตอบแรกของฉัน จะแก้ไขหลังจากที่ฉันพบสิ่งที่จะลบequals-checks เหล่านั้น..แทนที่ด้วยcharAtแต่อาจจะยังคง golfed ..

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static String c(final String[] a) {
    String r = "",
           c = r;
    for(String s : a){
      int k = s.length(),
          l = r.length(),
          z;
      if(k > 1){
        z = s.charAt(1);
        r = z < 67
             ? l > 0
                ? r.substring(0, l-1)
                : ""
             : z < 68
                ? r
                : z < 69
                   ? ""
                   : z < 81
                      ? r + c
                      : r + s;
        c = z == 67
             ? r
             : c;
      }
      r += k < 2
            ? s
            : "";
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o" }));
    System.out.println(c(new String[]{ "H", "e", "l", "l", "o", " ", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "[D]", "D", "[B]" }));
    System.out.println(c(new String[]{ "H", "[C]", "i", "[P]", "[C]", "[P]" }));
    System.out.println(c(new String[]{ "e", "[C]", "[B]", "I", " ", "l", "i", "k", "[P]", " ", "b", "[P]", "[P]", "s", "!" }));
    System.out.println(c(new String[]{ "N", "[P]" }));
    System.out.println(c(new String[]{ "#", "5", "0", "K", "0", "0", "1", "[D]", "#", "n", "o", "t" }));
    System.out.println(c(new String[]{ "H", "o", "w", " ", "[D]", "H", "e", "y" }));
    System.out.println(c(new String[]{ "s", "u", "d", "[B]", "p", "[C]", "[D]", "I", " ", "h", "a", "v", "e", " ", "[P]", "p", "e", "r", "!" }));
  }
}

เอาท์พุท:

Hello
Hello Hello 

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

2

PHP, 131 ไบต์

17 ไบต์บันทึกโดยตัวดำเนินการแบบเต็มของ @IsmaelMiguel

<?$c=[];foreach($_GET[a]as$v)($t=$v[1])!=P?$t!=C?$t!=B?$t!=D?$o[]=$v:$o=[]:array_pop($o):$c=$o:$o=array_merge($o,$c);echo join($o);

1
147 <?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);ไบต์: (แทนที่if()ห่วงโซ่ทั้งหมดของคุณด้วยโซ่ปฏิบัติการ trenary)
Ismael Miguel

@IsmaelMiguel ขอบคุณ ฉันไม่ต้องการใช้โอ
เปอร์

ฉันสามารถดูว่าทำไม มันดูน่าเกลียดมากและ ... มันเป็นสิ่งที่ทำร้ายดวงตาจริงๆ
Ismael Miguel

1

PHP, 108 ไบต์

for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;

ใช้วิธีการแบบสตริงแทนที่จะเป็นแบบอาร์เรย์

ใช้เช่น:

php -r "for(;null!==$s=$argv[++$i];)($g=$s[1])!=B?$g!=C?$g!=D?$o.=$g!=P?$s:$c:$o='':$c=$o:$o=substr($o,0,-1);echo$o;" a b "[C]" "[B]" "[P]" "[C]" "[D]" j "[P]"

แก้ไข: บันทึกแล้ว 8 ไบต์โดยการเล่นคำสั่งของ?: s และทำให้เป็นลบเพื่อหลีกเลี่ยงการใช้วงเล็บจำนวนมาก


$s=$argv[++$i]แทนที่จะเป็นnull!==$s=$argv[++$i]ถ้าคุณใช้ PHP> 7 คุณสามารถเขียน$s=$argv[++$i]??0เพื่อข้ามประกาศ
JörgHülsermann

1
มันไม่ได้อยู่ที่นั่นเพื่อข้ามการแจ้งเตือน แต่เพื่อให้คุณเข้ามา'0'ดูว่า'0'มันเป็นอย่างไร มีประกาศอื่น ๆ อีกมากมายที่ข้ามไปโดยเฉพาะอย่างยิ่งดูเหมือนว่าเป็นการเสียเวลา
user59178

1

SpecBAS - 216 ไบต์

1 s$,t$="": INPUT a$: DIM b$(SPLIT a$,NOT ",")
2 FOR EACH l$ IN b$()
3 CASE l$
4 WHEN "[B]": s$=s$( TO LEN s$-1)
5 WHEN "[C]": t$=s$
6 WHEN "[D]": s$=""
7 WHEN "[P]": s$=s$+t$
8 OTHERWISE : s$=s$+l$
9 END CASE
10 NEXT l$: ?s$

อินพุตถูกกำหนดเป็นสตริงที่มีเครื่องหมายจุลภาคซึ่งจะเปลี่ยนเป็นอาร์เรย์

ป้อนคำอธิบายรูปภาพที่นี่


1

V , 49 ไบต์

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

ลองออนไลน์!

เนื่องจากสิ่งนี้มีอักขระที่ไม่สามารถพิมพ์ได้นี่คือ 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

นี่เป็นเพียงการแปลโดยตรงของคำตอบกลุ่มของฉันเพื่อที่ฉันจะได้แข่งขันกับเยลลี่ น่าเสียดายที่ฉันยังคงมีหนึ่งไบต์ แต่ฉันยังคงทำงานในอันสุดท้าย :)

ฉันภูมิใจในคำตอบนั้นมากขึ้นดังนั้นหากคุณต้องการคำอธิบายโดยละเอียดให้อ่านคำตอบนั้นแทน


1

ที่จริงแล้ว 56 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

''j"'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ''+ƒkΣR
''j                                                       insert an apostrophe between every pair of commands
   "'[B]"'XaÆ"'[C]""k;╗i"aÆ"'[P]""╜i"aÆ"'[D]"'éaÆ         replace:
   "'[B]"'XaÆ                                               "'[B]" with "X"
             "'[C]""k;╗i"aÆ                                 "'[C]" with "k;╗i"
                           "'[P]""╜i"aÆ                     "'[P]" with "╜i"
                                       "'[D]"'éaÆ           "'[D]" with "é"
                                                 ''+      prepend an apostrophe
                                                          now the input has been converted to the equivalent Actually program ("'<character>" pushes the character, "X" removes the last character, "k;╗i" saves the current stack state to a register, and "╜i" pushes the saved stack state)
                                                    ƒ     execute the code
                                                     kΣ   concatenate the characters
                                                       R  reverse the string

1

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

รุ่นที่อ่านเพิ่มเติมได้:

String v(String[]a){
    String r="",c=r;
    for(String s:a){
        try{
            int p=s.charAt(1)%5;
            r= p<1
                 ? r+c
                 : p>2
                    ? ""
                    :p==1
                        ? r.length()<2
                                     ?""
                                     :r.split(".$")[0]
                        :r;
            c=p==2?r:c;
        }catch(Exception e){
            r+=s;
        }
    }return r;
}

คุณสามารถบันทึกไบต์ (1 หรือ 2) โดยเปลี่ยนลองเป็นif(s.length()>1){...}else
AxelH

และเปลี่ยนp==1เป็นp<2
AxelH

1

MATL , 46 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

v                % Push empty array
XK               % Copy to clipboard K. This initiallizes it as empty
x                % Delete
"                % Implicitly input cell array. For each
  @g             % Push current cell's contents
  t              % Duplicate elements
  n              % Number of elements
  q?             % If more then 1
    2)           % Get second char. Copy to clipboard J
    66=?         % If it ss 'B'
      3L)        % Remove last element from string built up to now
    }            % Else
      J67=?      % If it was a 'C'
        XK       % Copy string built up to now into clipboard K
      }          % Else
        J68=?    % If was a 'D'
          vx     % Delete stack. This deletes string built up to now, if any
        }        % Else: it was a 'P'
          K      % Paste from clipboard K
        ]        % End if
      ]          % End if
    ]            % End if
  ]              % End if
  &h             % Horizontally concatenate stack
                 % Implicitly end for
                 % Implicitly display

1

TCL, 186 ไบต์

proc t w {foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;foreach g $w {eval "set c \$[string index ${g}N 1]";eval "set r \"$c\""};return $r}

รูปแบบที่ดี:

proc t w {
    foreach "B C P N D r Q" [list {[string range $r 0 end-1]} {[set Q $r]} {$r$Q} {$r$g}] break;
    foreach g $w {
        eval "set c \$[string index ${g}N 1]"
        eval "set r \"$c\""
    }
    return $r
}

ฉันแค่ต้องการพิสูจน์ว่าฉันสามารถทำได้ใน TCL


คุณสามารถบันทึกไบต์: แทนที่foreachด้วยlmap; โดยreturn set xนี่คือสิ่งที่ฉันสามารถพูดได้อย่างรวดเร็ว
sergiol

1

สกาลา, 158 ไบต์

(i:Seq[String])=>(("","")/:i){case((a,c),k)=>if(k.size<2)(a+k,c)else
if(k=="[B]")(a dropRight 1,c)else
if(k=="[C]")(a,a)else
if(k=="[D]")("",c)else(a+c,c)}._1

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

แก้ไขปัญหานี้เป็นการพับด้วยผลลัพธ์และคลิปบอร์ดเป็นตัวสะสม น่าเศร้าที่สกาล่าไม่มีโอเปอเรเตอร์ที่มีเงื่อนไขประกอบ แต่ใช้if elseเป็นนิพจน์แทน


1

PHP 7.1, 95 92 ไบต์

หมายเหตุ: ต้องการ PHP 7.1 สำหรับการชดเชยสตริงเชิงลบ

for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;

ไม่มีออฟเซ็ตสตริงเชิงลบ (101 ไบต์):

php -r 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o=substr($o,0,-1):$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s ! 2>/dev/null;echo

ทำงานแบบนี้:

php -nr 'for(;n|$i=$argv[++$x];)($l=$i[1])?$l^r?$l^s?$l^t?$o.=$c:$o="":$c=$o:$o[-1]="":$o.=$i;echo$o;' e [C] [B] I ' ' l i k [P] ' ' b [P] [P] s !;echo
> I like bees!

คำอธิบาย

for(
  ;
  n|$i=$argv[++$x];   # Iterates over the input until null.
)
  ($l=$i[1])?         # Check if this item is a command, if so set to $l
    $l^r?             # If the command is not B
      $l^s?           # If the command is not C
        $l^t?         # If the command is not D
          $o.=$c      # Then it's P, so paste the clipboard ($c)
        :$o=""        #      It's D, so delete output
      :$c=$o          #      It's C, so copy output to clipboard
    :$o[-1]=""        #      It's B, so remove the last output char
  :$o.=$i;            # No command, add the current item to the output.

echo$o;               # Print the output.

การปรับแต่ง

  • บันทึก 3 ไบต์โดยรวมการจัดการเอาต์พุตกับการจัดการคำสั่ง

ดีที่จะเห็นรายการ PHP อธิบายในรายละเอียด :)
Emigna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.