Simula mi teclado

15

Tengo un problema con mi teclado (lo más probable es que sea un problema con mi navegador). Algunas veces, cuando hago clic en un nuevo campo de texto y empiezo a escribir, todo mi texto sale al revés. Después de un período de tiempo muy corto (para el desafío, diremos que son 10 milisegundos), se reanuda la escritura hacia adelante nuevamente. Parece que al principio mi cursor no se mueve cuando empiezo a escribir, por lo que todas las letras se insertan al comienzo del campo de texto.

Por ejemplo, si estaba escribiendo pythony escribí pyten los primeros 10 milisegundos, el resultado sería

hontyp

Tarea

Su trabajo es simular este comportamiento en la menor cantidad de bytes posible.

Entrada

Puede tomar aportes en cualquier método razonable. Sin embargo, no puede tomar la entrada como dos campos separados. El retraso de 10 milisegundos debe comenzar cuando el programa comienza a permitir la entrada. Es posible que tenga que realizar un preprocesamiento antes de permitir la entrada, que no debe contarse hacia los 10 milisegundos.

Se permite cierta clemencia en el tiempo siempre que promedie 10 milisegundos y esté desactivado por más de 1 milisegundo, no más del 1% del tiempo en una computadora con un ritmo razonable.

Salida

Puede generar la cadena en cualquier método que considere adecuado. Puede actualizar en vivo mientras el usuario está escribiendo o generar el resultado una vez que haya terminado de tomar la entrada (ya sea por una nueva línea o al final del archivo ^D).

Casos de prueba

Algunos de estos fueron generados por este CMC en The Nineteenth 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
fuente
3
@Luke 1) Sí. 2) Si esa es la única forma en que pueden recibir aportes, entonces no pueden competir.
Post Rock Garf Hunter
3
^ Eso probablemente descarta muchos idiomas
Luis Mendo
2
Es desafortunado. No quiero que este desafío gobierne nuestros idiomas, sin embargo, realmente no quiero que se convierta en un desafío trivial de manipulación de cadenas.
Post Rock Garf Hunter
2
10 milisegundos es muy poco tiempo. ¿Realmente quisiste decir eso?
Neil
1
@Neil Probablemente tengas razón, pero es lo que es, no estoy en condiciones de cambiarlo en este momento.
Post Rock Garf Hunter

Respuestas:

7

VimScript, 48 47 bytes

Vim tiene algunas buenas incorporaciones para esto. Requiere Vim 8.

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

Espera texto ingresado en modo de inserción, una entrada muy razonable para VimScript. Explicación:

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

Mi enfoque inicial se ri|sl10m|se ri&no funciona porque el texto se almacena hasta después del comando de suspensión y no pude encontrar una forma de evitarlo.

Brian McCutchon
fuente
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)>

Comienza a cronometrar por 1s desde la primera pulsación de tecla para darle la oportunidad de verlo en acción.

Neil
fuente
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)

Manifestación

La forma en que funciona el fragmento, deberá hacer clic dentro de su marco para que se enfoque después de hacer clic en el botón Ejecutar y antes que pueda comenzar a escribir.

No hay forma de hacerlo en menos de 10 ms. Entonces, configuré el retraso en 1 segundo en esta demostración, y aun así, será mejor que te apures.

Arnauld
fuente
3

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

Toma entradas como pulsaciones de teclas y salidas a la consola. Actualiza cada cuadro.

Explicación

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
fuente
1
@WheatWizard Digamos que la entrada fue asdf+ ghjk. Si todo estuviera en una variable, luego de los 10 milisegundos, tendríamos fdsaesa cadena. Después de eso, cuando gse escribe, la cadena antepondrá gy se convertirá gfdsa. Luego, cuando hse escribe, no puedo anteponer ha la variable (porque la entrada todavía está invertida), necesitaré usar substrings y calcular la lengthvariable de esa cadena. Esto costará muchos bytes.
Kritixi Lithos
use ternary para reducir bytes
Sr. Alien
@ Mr.Alien Para usar un ternario, tendría que tratar con la misma variable, pero aquí, uso dos variables diferentes (a saber, ay b). Incluso si asigno el resultado a una variable temporal, el bytecount resultante es aún mayor.
Kritixi Lithos
Mi mal, pensé que es una respuesta JavaScript x) .. se dio cuenta cuando vi la conversión de tipos en su respuesta ...
El señor extranjero
1

C - 169 bytes

Bueno, C no es lo mejor para esto, ya que no tiene una forma independiente de plataforma para hacerlo. Trabaja bajo 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]));}

Un enfoque poco hacky, si puede escribir más de 9 caracteres en 10 ms, se bloqueará. Actualizaciones después de un personaje de nueva línea.

Peter Lenkefi
fuente
1
No estoy seguro de si puedo mezclar 9 caracteres aleatorios en 10 ms ...
Bendl 05 de
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

Si desea que la salida esté al ras, sin inundarse con líneas, use print'\r'+a+b,en su lugar

Tendrás que matar el proceso para detenerlo.

Felipe Nardi Batista
fuente