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
Post Rock Garf Hunter
fonte
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.

Brian McCutchon
fonte
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.

Neil
fonte
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.

Arnauld
fonte
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
}
Kritixi Lithos
fonte
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.

Peter Lenkefi
fonte
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

Felipe Nardi Batista
fonte