당신의 임무는 사용자가 입력하는 몇 가지 키 입력을 시뮬레이션하는 것입니다.
입력
하나 이상의 ‘키 스트로크’를 포함하는 원하는 구분 기호가있는 문자열 배열 또는 문자열 (범위 32-126 제외).
이 배열에는 수동 키 입력 (단일 문자)과 명령 (대괄호 안의 문자)이라는 두 가지 유형의 문자열 만 포함됩니다 [ ]
.
- 패시브 키 스트로크
- ASCII 문자 코드
[32-126]
- ASCII 문자 코드
- 명령 :
[B]
: 백 스페이스 (마지막으로 추가 된 문자 제거)[C]
: 이미 작성된 모든 내용을 복사[D]
: 작성된 내용을 모두 삭제[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!'
이것은 code-golf 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!
답변
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
방법?
Ṿ”;;µṭ“Ṗ“ø©“ḣ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
테스트 스 니펫
답변
펄, 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 바이트로 탈출했습니다 …