模拟我的键盘


15

我的键盘出现了问题(更有可能是浏览器出现了问题)。有时,当我单击一个新的文本字段并开始输入时,我所有的文本都会向后显示。经过很短的时间(出于挑战的目的,我们会说是10毫秒),它将恢复再次向前键入。似乎一开始我开始输入时光标没有移动,所以所有字母都插入了文本字段的开头。

例如,如果我输入的python内容pyt是在最初的10毫秒内输入的,则结果为

hontyp

任务

您的工作是在尽可能少的字节中模拟此行为。

输入值

您可以采用任何合理的方法进行输入。但是,您可能不能将输入作为两个单独的字段。当程序开始允许输入时,应开始10毫秒的延迟。也就是说,在允许输入之前,您可能需要进行预处理,这不应算作10毫秒。

在时间上允许一定的宽恕,只要它在合理配置的计算机上平均为10毫秒且偏离时间不超过1毫秒(不超过1%)即可。

输出量

您可以按照自己认为合适的任何方法输出字符串。您可以在用户输入时实时更新,也可以在完成输入后(通过换行符或文件结尾^D)输出结果。

测试用例

其中一些是由此CMC在第十九字节中生成的

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)如果这是他们获取意见的唯一途径,那么他们将无法竞争。
发布Rock Garf Hunter

3
^这可能会排除很多语言
路易斯·门多

2
这是不幸的。我不想让这个挑战统治我们的语言,但是我真的不想让它成为一个琐碎的字符串操作挑战。
发布Rock Garf Hunter

2
10 毫秒短的时间。你真的是那个意思吗
尼尔,

1
@Neil您可能是对的,但事实就是如此,我现在无法更改它。
发布岩石Garf Hunter,

Answers:


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

JavaScript(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键入时,字符串将位于前面g并变为gfdsa。然后,在h键入时,我不能h在变量前添加前缀(因为输入仍然是反向的),我将需要使用substrings并必须计算该lengthString变量的。这将花费很多字节。
Kritixi Lithos

使用三元数减少字节
Alien先生

@ Mr.Alien为了使用三元组,我需要处理相同的变量,但是在这里,我使用了两个不同的变量(即ab)。即使我将结果分配给temp变量,结果字节数仍然更大。
Kritixi Lithos'4

我不好,我认为这是JavaScript答案x)..当我在您的答案中看到类型转换时才意识到...
Alien先生

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

如果您可以在10毫秒内键入9个以上的字符,则会崩溃。在换行符之后更新。


1
我不确定是否可以在10毫秒内混搭9个随机字符...
bentl

1

Python 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,改用

您需要终止该进程才能停止它

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.