키 스트로크 시뮬레이션 ‘ ‘, ‘[C]’,

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

입력

하나 이상의 ‘키 스트로크’를 포함하는 원하는 구분 기호가있는 문자열 배열 또는 문자열 (범위 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!'

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



답변

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 바이트를 절약했습니다.


답변

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

답변

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처음에는 빈 목록이므로 복사 버퍼는 처음에 “비어 있습니다”.


답변

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

답변

젤리 , 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!"


답변

자바 스크립트 (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

테스트 스 니펫

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

console.log(f(['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!']))
<button onclick="console.log(f(I.value.split('\n')))">Run</button>
<br><textarea id=I rows=10>H
e
l
l
o

[C]
[P]</textarea><br>

답변

펄, 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 바이트로 탈출했습니다 …