키보드 시뮬레이션


15

키보드에 문제가 있습니다 (브라우저에 문제가있을 수 있음). 새로운 텍스트 필드를 클릭하고 모든 텍스트를 입력하기 시작할 때가 있습니다. 매우 짧은 시간이 지나면 (도전을 위해 10 밀리 초라고 함) 다시 앞으로 입력을 재개합니다. 입력을 시작할 때 처음에는 커서가 움직이지 않아 모든 문자가 텍스트 필드의 시작 부분에 삽입됩니다.

예를 들어, 입력 python하고 pyt처음 10 밀리 초를 입력 하면 결과는

hontyp

직무

당신의 임무는 가능한 적은 바이트로이 동작을 시뮬레이션하는 것입니다.

입력

합리적인 방법으로 입력 할 수 있습니다. 그러나 입력을 두 개의 별도 필드로 사용할 수는 없습니다. 프로그램이 입력을 허용하기 시작할 때 10 밀리 초 지연이 시작되어야합니다. 즉, 입력이 허용되기 전에 수행해야 할 전처리가있을 수 있으며 10 밀리 초로 계산해서는 안됩니다.

평균적으로 10 밀리 초이고 합리적으로 지정된 컴퓨터에서 시간의 1 %를 넘지 않는 1 밀리 초 이상 꺼져있는 경우 일부 leniency가 타이밍에 허용됩니다.

산출

적합한 방법으로 문자열을 출력 할 수 있습니다. 사용자가 입력하는 동안 실시간으로 업데이트하거나 입력을 마친 후 (개행 또는 파일 끝으로 ^D) 결과를 출력 할 수 있습니다 .

테스트 사례

이 중 일부는 이 CMC 에 의해 19 번째 바이트에서 생성되었습니다.

First 10  | after   | result
bra         in-flak   in-flakarb
ap          ple       plepa
code-       golf      golf-edoc
no          ne        neon
we          st        stew
ai          med       media
draw        back      backward

3
@ 루크 1) 예. 2) 만약 이것이 그들이 의견을 얻을 수있는 유일한 방법이라면 그들은 경쟁 할 수 없습니다.
Post Rock Garf Hunter

3
^ 아마 그것은 많은 언어를 배제 할 것이다
Luis Mendo

2
불행하다. 나는이 도전이 우리의 언어를 지배하기를 원하지 않지만, 사소한 문자열 조작 도전이되기를 정말로 원하지 않습니다.
Post Rock Garf Hunter

2
10 밀리 초매우 짧은 시간입니다. 정말 그 말을 했습니까?
Neil

1
@Neil 당신은 아마 옳을 지 모르지만, 그것이 지금이 시점에서 그것을 바꿀 수있는 위치에 있지 않습니다.
Post Rock Garf Hunter

답변:


7

VimScript, 48 47 바이트

Vim에는 이것에 대한 멋진 내장 기능이 있습니다. Vim 8이 필요합니다.

se ri|cal timer_start(10,{->execute("se ri&")})

VimScript에 매우 적합한 입력 인 삽입 모드로 입력 된 텍스트를 예상합니다. 설명:

se ri " short for 'set revins', or 'reverse insert'
cal timer_start(10, " Start a timer that fires after 10ms
                 {->execute("se ri&")}) " Give it a lambda that unsets ri

se ri|sl10m|se ri&sleep 명령이 끝날 때까지 텍스트가 버퍼링되어이 방법을 찾을 수 없기 때문에 초기 접근 방식 이 작동하지 않습니다.


5

HTML (JS), 96 바이트

<input id=i oninput=i.d=i.d||Date.now()+1e3;Date.now()<i.d&&(i.selectionEnd=i.selectionStart=0)>

첫 번째 키 누르기부터 1 초의 타이밍을 시작하여 실제 동작을 볼 수있는 기회를 제공합니다.


4

자바 스크립트 (ES6), 88 바이트

p=s='',t=+new Date,document.onkeyup=k=>console.log(+new Date-t>9?(s+=k.key)+p:p=k.key+p)

데모

스 니펫이 작동하는 방식으로 프레임 내부클릭 하여 실행 버튼 클릭 한 후 입력을 시작 하기 전에 포커스 얻도록해야합니다 .

10ms 미만에서는 그렇게 할 수 없습니다. 이 데모에서는 지연 시간을 1 초로 설정했습니다. 그럼에도 불구하고 서두르는 것이 좋습니다.


3

처리 167 165 146 바이트

String a="",b="";long m=0;void setup(){size(9,9);}void draw(){m=m<1?millis():m;println(b+a);}void keyTyped(){if(millis()-m>9)b+=key;else a=key+a;}

키 입력으로 입력을 받아 콘솔로 출력합니다. 모든 프레임을 업데이트합니다.

설명

String a="",b="";                // a contains the reversed (in the 10 milliseconds) string, b contains the text that is typed after the 10 milliseconds.
long m=0;                        // Store the start milliseconds in variable m
void setup() {
  size(9,9);                     // set the dimensions of the window
}

void draw() {                    // loop forever
  m=m<1?millis():m;              // update m
  println(b+a);                  // print the string b+a
}

void keyTyped() {                // this function gets called whenever a key is typed
  if(millis() - m) >9)           // if over 9 milliseconds have elapsed then
    b+=key;                      //   add the key to the end of b
  else                           // else (if less than 10 milliseconds have elapsed)
    a=key+a;                     //   prepend the key to a
}

1
@WheatWizard 입력이 asdf+ 라고 가정하십시오 ghjk. 모든 것이 하나의 변수에 있다면 10 밀리 초 후에 우리는 fdsa그 하나의 문자열에 있을 것 입니다. 그 후 g입력되면 문자열 앞에 gand가 붙습니다 gfdsa. 그런 다음 h입력 할 때 h변수 앞에 추가 할 수 없습니다 (입력이 여전히 역전되기 때문에) substrings 를 사용해야 length하며 해당 String 변수의 계산해야 합니다. 이 작업에는 많은 바이트가 필요합니다.
Kritixi Lithos

삼항을 사용하여 바이트를 줄이십시오
Mr. Alien

@ Mr.Alien 삼항을 사용하려면 동일한 변수를 처리해야하지만 여기서는 두 개의 다른 변수 (즉 ab)를 사용하고 있습니다. 결과를 임시 변수에 할당하더라도 결과 바이트 수는 여전히 더 큽니다.
Kritixi Lithos

나는 당신의 대답에 타입 캐스팅을보고 내 나쁜, 나는 ... ..)이 자바 스크립트 응답 X의 실현 생각
씨 외국인

1

C-169 바이트

C는 플랫폼에 독립적 인 방법이 없기 때문에 최선의 방법은 아닙니다. MSVC에서 작동합니다.

#include<time.h>
#include<conio.h>
l,k,b[9];main(a){for(a=clock();clock()-a<100;(k=_getch())?b[l++]=k:0);for(;(k=_getch())-13;k?putchar(k):0);for(;l;putchar(b[--l]));}

해키 접근 방식의 비트, 10ms에 9자를 초과하여 입력 할 수 있으면 충돌이 발생합니다. 개행 문자 다음에 업데이트합니다.


1
10ms에서 9 개의 임의의 문자를 으 can 할 수 있는지 잘 모르겠습니다.
bendl

1

파이썬 (2) , 112 (106)

import msvcrt as m,time
a=b=''
T=time.time
t=T()
while 1:c=m.getch();exec'ba=+c=+cb'[T()-t>1::2];print a+b

라인으로 넘치지 않고 출력을 플러시하려면 print'\r'+a+b,대신

프로세스를 중지해야 프로세스를 중지 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.