키 스트로크 시뮬레이션


33

당신의 임무는 사용자가 입력하는 몇 가지 키 입력을 시뮬레이션하는 것입니다.

입력

하나 이상의 '키 스트로크'를 포함하는 원하는 구분 기호가있는 문자열 배열 또는 문자열 (범위 32-126 제외).

이 배열에는 수동 키 입력 (단일 문자)과 명령 (대괄호 안의 문자)이라는 두 가지 유형의 문자열 만 포함됩니다 [ ].

  • 패시브 키 스트로크
    1. ASCII 문자 코드 [32-126]
  • 명령 :
    1. [B] : 백 스페이스 (마지막으로 추가 된 문자 제거)
    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!'

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


참고로 코드에서 버그를 발견했습니다. 꿀벌에 대해 대문자 B를 사용하여 테스트 사례를 제안해도 좋습니다. :
Jonathan Allan

또한 [D]유일하게 사용되지 않은 예제가 있어야 하므로 코드는 그저 그런 것이 아닙니다 split('[D]')[1].
mbomb007

@ mbomb007, 테스트 사례 추가 (# 8, # 9)
Daniel

그리고 mbomb007은 여러 번 삭제 된 테스트 케이스를 요구하고 있다고 생각합니다.
Martin Ender

@MartinEnder, 오, 나는 그가 다른 명령이있는 것을 원한다고 생각했습니다.[D]
Daniel

답변:


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 

Lynn의 CJam 답변의mod 5 트릭을 사용하여 4 바이트를 절약했습니다.


34

Vim, 76, 64, 62 , 58 키 스트로크

7 개의 키 입력을 저장 한 Loovjo에게 감사합니다


누군가 키 입력을 시뮬레이트 했다고 말했습니까 ? 그렇다면 골프에서 가장 좋아하는 언어는 키 스트로크 시뮬레이션 에 관한 것입니다 !

: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 키 입력으로 변환합니다. 한 줄씩 살펴 보겠습니다.

:no s :%s/\M[

이것은 저장 바이트를. Vim에는 매핑을 만들고 설정을 변경하고 파일을 저장할 수있는 "명령 줄"이 내장되어 있습니다. 여기에서 매핑을 만듭니다. :no약자이며 :nnoremap하는 수단 "우리는 정상 모드에있을 때,이 우측이 좌측 대체." 우리는 :%s/ 다섯 번의 서로 다른 시간을 부르고 있기 때문에 많은 시간을 절약 할 수 있습니다. 는 \M멋진 트릭입니다. 이는 다음 검색이 "Very No Magic"이라는 것을 의미합니다. 즉, 정규식 [B][B]B에 포함 된 범위가 아닌 리터럴 텍스트와 일치 함을 의미 합니다. 대체 명령의 대부분에는 대괄호가 있으므로 첫 번째 명령을 채 웁니다.

그런 다음 5 개의 대체 명령을 호출합니다. 내가 왜 <C-v>그렇게 여러 번 전화했는지 주목할 가치가 있습니다. 문자 좋아 <esc>, <C-v>, <C-r>, 등을 인쇄 할 수없는 문자입니다 및 명령 행에 입력해야합니다 <C-v>.

  • [B] : 백 스페이스. 이것은 매우 쉽습니다. vim의 백 스페이스에 해당하는 각각 [B]을 간단히으로 대체하십시오 Ctrl-h.

  • [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>"의미 Insert the contents of register '"'합니다. "'y'가 사라지는 주 레지스터입니다.

모든 명령을 번역 했으므로 모든 줄 바꾸기 문자를 모두 제거하여 모든 줄을 결합해야합니다. 우리의 매핑 덕분에 이것은 단지

s<bs>\n

<bs>백 스페이스 (ASCII을 0x08)이며, 때문에 우리의 필요 [우리가 가득 찼다.

지금까지 입력을 vim 코드로 변환했으며 실행해야합니다. 그래서 우리는 :

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 모드 5)
  • [C]~ 294 (= 4 mod 5).

이 값 (mod 5)은 CJam 코드 스 니펫 목록의 색인으로 사용됩니다.

  • 단일 문자 문자열의 경우, 예 h를 들어 스 니펫 "h"이 반환되어 단일 문자 문자열을 스택으로 푸시합니다.
  • 의 경우 [B]스 니펫 ;이 반환되어 요소를 표시합니다.
  • 의 경우 [D]스 니펫 ];이 반환되어 스택이 지워집니다.
  • 의 경우 [P]스 니펫 L~이 반환되어 변수 L가 스택에 추가 됩니다.
  • 의 경우 [C]스 니펫 ]:L~이 반환되어 현재 스택을 변수에 저장합니다 L.

이 스 니펫은 연결되어 실행됩니다. 최종 스택은 CJam에 의해 암시 적으로 인쇄됩니다. L처음에는 빈 목록이므로 복사 버퍼는 처음에 "비어 있습니다".


8

파이썬 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

OK 나는 그것을 고쳤으며 실제로 바이트도 절약합니다!
Jonathan Allan

7

자바 스크립트 (ES6), 84 80 77 76 바이트

@Neil 덕분에 3 바이트 절약, @ edc65 덕분에 1 개 더 절약

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

.map 2 바이트 더 깁니다 :

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

테스트 스 니펫


차이점은를 reduce사용하여 버전 에서 3 바이트를 절약 할 수 있다는 것 (s,[c,z])입니다.
Neil

@ 닐 니스! 그것은 .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가 참이면 붙여 넣기를하고 그렇지 않으면 출력에 char를 추가하십시오.
Grax32

붙여 넣을 때 @Grax는 현재 출력에 추가해야하므로 z?s+t:s+c1 바이트 이상s+=z?t:c
edc65

5

펄, 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

파이썬 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

이데온

s키 입력 목록 인 입력이 포함 된 재귀 함수입니다 .

각 재귀 호출 은 비어 있을 때까지 반환 텍스트 r[C]클립 보드 의 경우 클립 보드를 업데이트합니다 .cs

의 새로운 가치 r와는 c, 사전에 색인에 의해 발견 {...}, 포장을 풀고 함께 전달 *. 수동 키 입력의 s[0][1:2]경우 빈 문자열을 반환하고 ''대신 키 가 사용됩니다.


람다 lambda s,r='',c=''대신 람다를 정의하는 이유를 물 을 수 lambda s,r,c=''있습니까?
L. Steer

사양은 문자 배열 (여기 s)을 입력 하므로 함수는 다른 입력없이 작동해야합니다.
Jonathan Allan

나의 사과, 독해 실패.
L. Steer

4

하스켈, 136133130127 바이트

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등등. 3 바이트를 저장해 준 @nimi 에게 감사 합니다.


빈 목록 인 init b경우 @nimi 에서 예외 b가 발생 합니다.
Laikoni

@nimi 영리합니다, 감사합니다! 익명 함수에 관해서는 익명 함수가 유일한 명령문 일 때만 허용되며 다른 도우미 함수가 없을 때만 허용됩니다. 그러나 메타를 검색하는 것은 그다지 아무것도 나타나지 않았으므로 괜찮습니다.
Laikoni

2
여기 있습니다 . 함수로 평가되는 표현식에 대한 도우미 함수를 선언 할 수 있습니다.
nimi

3

Mathematica, 100 바이트

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

익명의 기능. 문자열 목록을 입력으로 받아서 문자열을 출력으로 반환합니다. 생성 된 메시지를 무시하십시오.


2

자바 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 할 것입니다 . 로 교체 되었지만 여전히 골프를 칠 수 있습니다 ..

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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 바이트

@IsmaelMiguel 삼항 연산자로 17 바이트 절약

<?$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()체인을 10 조의 체인으로 대체).
Ismael Miguel

감사합니다. 나는 연산자를 사용하고 싶지 않았다
Jörg Hülsermann

이유를 알 수 있습니다. 너무 못 생겼고 ... 눈을 아프게하는 것입니다.
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]"

편집 :? : s의 순서를 조정하고 너무 많은 괄호를 사용하지 않도록 음수로 만들어 8 바이트를 절약했습니다.


$s=$argv[++$i]null!==$s=$argv[++$i]PHP> 7을 사용하는 대신 $s=$argv[++$i]??0통지를 건너 뛰도록 작성할 수 있습니다.
Jörg Hü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@"

온라인으로 사용해보십시오!

여기에는 인쇄 할 수없는 문자가 포함되어 있으므로 다음은 16 진수 덤프입니다.

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

이것은 젤리와 경쟁 할 수 있도록 vim 답변을 직접 번역 한 것입니다 . 불행히도, 나는 여전히 1 바이트 이상이지만 여전히 마지막 바이트에서 일하고 있습니다. :)

어쨌든 그 대답에 대해 더 자랑 스러우므로 매우 자세한 설명을 원하면 그 설명을 읽으십시오.


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

자바, 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;
}

try catch를 if(s.length()>1){...}else
–13 :

그리고 변경 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 에서이 작업을 수행 할 수 있음을 증명하고 싶었습니다.


바이트를 절약 할 수 있습니다 : replace foreachby 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

언 골프 드 :

(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 항목을 자세히 설명해
주셔서 감사합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.