Simule meu teclado


15

Estou com um problema no teclado (provavelmente no meu navegador). Algumas vezes, quando clico em um novo campo de texto e começo a digitar todo o meu texto sai para trás. Após um período muito curto (para o objetivo do desafio, diremos que são 10 milissegundos), ele retoma a digitação novamente. Parece que, a princípio, meu cursor não se move quando começo a digitar, para que todas as letras sejam inseridas no início do campo de texto.

Por exemplo, se eu estivesse digitando pythone digitando pytnos primeiros 10 milissegundos, o resultado seria

hontyp

Tarefa

Seu trabalho é simular esse comportamento no menor número de bytes possível.

Entrada

Você pode receber sugestões de qualquer método razoável. No entanto, você não pode aceitar a entrada como dois campos separados. O atraso de 10 milissegundos deve começar quando o programa começar a permitir entrada. Ou seja, você pode ter que fazer um pré-processamento antes da entrada ser permitida, o que não deve ser contabilizado nos 10 milissegundos.

É permitida alguma clemência no tempo, desde que em média 10 milissegundos e desligada em mais de 1 milissegundo, não mais que 1% do tempo em um computador com especificações razoáveis.

Resultado

Você pode imprimir a string de acordo com o método que achar melhor. Você pode atualizar ao vivo enquanto o usuário digita ou gerar o resultado após concluir a entrada (por uma nova linha ou pelo final do arquivo ^D).

Casos de teste

Alguns destes foram gerados por este CMC no The XIX XIX Byte

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
@ Lucas 1) Sim. 2) Se essa é a única maneira pela qual eles podem receber informações, eles não podem competir.
Post Rock Garf Hunter

3
^ Isso provavelmente exclui um monte de línguas
Luis Mendo

2
É lamentável. Não quero que esse desafio domine nossas línguas, no entanto, realmente não quero que se torne um desafio trivial à manipulação de strings.
Post Rock Garf Hunter

2
10 milissegundos é um período muito curto. Você realmente quis dizer isso?
194 Neil

1
@ Neil Você provavelmente está certo, mas é o que é, não estou em posição de mudar isso neste momento.
Post Rock Garf Hunter

Respostas:


7

VimScript, 48 47 bytes

O Vim tem alguns bons recursos para isso. Requer o Vim 8.

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

Espera o texto digitado no modo de inserção, uma entrada bastante razoável para o VimScript. Explicação:

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

Minha abordagem inicial,, se ri|sl10m|se ri&não funciona, porque o texto é armazenado em buffer até depois do comando sleep, e não consegui encontrar uma maneira de contornar isso.


5

HTML (JS), 96 bytes

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

Inicia o tempo para 1s desde o primeiro pressionamento de tecla, para que você possa vê-lo em ação.


4

JavaScript (ES6), 88 bytes

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

Demo

Da maneira como o snippet está funcionando, você precisará clicar dentro do quadro para que ele seja focado depois de clicar no botão Executar e antes de começar a digitar.

Não há como fazer isso em menos de 10 ms. Então, eu configurei o atraso para 1 segundo nesta demonstração - e mesmo assim, é melhor se apressar.


3

Processando, 167 165 146 bytes

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

Leva as entradas como teclas e as saídas para o console. Ele atualiza todos os quadros.

Explicação

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 Digamos que a entrada foi asdf+ ghjk. Se tudo estivesse em uma variável, depois dos 10 milissegundos, teríamos fdsanessa única sequência. Depois disso, quando gfor digitada, a sequência será anexada ge tornada gfdsa. Então, quando hdigitado, não posso acrescentar hà variável (porque a entrada ainda está invertida), precisarei usar se substringtiver que calcular a lengthvariável String. Isso custará muitos bytes.
precisa saber é o seguinte

usar ternário para reduzir bytes
Sr. Estrangeiro

@ Mr.Alien Para usar um ternário, eu precisaria lidar com a mesma variável, mas aqui, eu uso duas variáveis ​​diferentes (a saber ae b). Mesmo se eu atribuir o resultado a uma variável temp, o número de bytes resultante ainda será maior.
precisa saber é o seguinte

Meu mau, eu pensei que é um JavaScript resposta x) .. percebi quando vi tipo de qualidade em sua resposta ...
Sr. Estrangeiro

1

C - 169 bytes

Bem, C não é o melhor para isso, pois não possui uma maneira independente de plataforma de fazer isso. Funciona sob 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]));}

Uma abordagem pouco invasiva, se você pode digitar mais de 9 caracteres em 10 ms, isso irá travar. Atualiza após um caractere de nova linha.


1
Eu não tenho certeza se eu posso misturar 9 caracteres aleatórios em 10ms ...
BENDL

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

Se você quiser que a saída seja flush, sem inundar com linhas, utilize print'\r'+a+b,vez

Você precisará matar o processo para pará-lo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.