Simula la mia tastiera


15

Ho un problema con la mia tastiera (più probabilmente un problema con il mio browser). Alcune volte quando faccio clic su un nuovo campo di testo e inizio a digitare tutto il mio testo viene visualizzato al contrario. Dopo un breve lasso di tempo (ai fini della sfida diremo che sono 10 millisecondi) riprende a digitare in avanti. Sembra che all'inizio il mio cursore non si sposti quando inizio a digitare, quindi tutte le lettere vengono inserite all'inizio del campo di testo.

Ad esempio, se stavo digitando pythone ho digitato pytnei primi 10 millisecondi, il risultato sarebbe

hontyp

Compito

Il tuo compito è simulare questo comportamento nel minor numero di byte possibile.

Ingresso

È possibile accettare input in qualsiasi metodo ragionevole. Tuttavia, non è possibile accettare l'input come due campi separati. Il ritardo di 10 millisecondi dovrebbe iniziare quando il programma inizia a consentire l'immissione. È possibile che sia necessario eseguire la preelaborazione prima che sia consentito l'input, che non deve essere conteggiato per i 10 millisecondi.

Un po 'di clemenza è consentita nei tempi purché abbia una media di 10 millisecondi e sia disattivata di oltre 1 millisecondo non più dell'1% delle volte su un computer ragionevolmente specificato.

Produzione

Puoi generare la stringa in qualunque metodo tu ritenga opportuno. È possibile aggiornare dal vivo mentre l'utente sta digitando o produrre il risultato dopo aver finito di inserire l'input (tramite una nuova riga o la fine del file ^D).

Casi test

Alcuni di questi sono stati generati da questa CMC in 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

3
@Luke 1) Sì. 2) Se questo è l'unico modo in cui possono ricevere input, non possono competere.
Post Rock Garf Hunter,

3
^ Ciò probabilmente esclude molte lingue
Luis Mendo,

2
È sfortunato. Non voglio che questa sfida regoli sulle nostre lingue, tuttavia non voglio davvero che diventi una banale sfida di manipolazione delle stringhe.
Post Rock Garf Hunter,

2
10 millisecondi è un tempo molto breve. Lo intendevi davvero?
Neil,

1
@Neil Probabilmente hai ragione, ma è quello che è, non sono in grado di cambiarlo a questo punto.
Post Rock Garf Hunter,

Risposte:


7

VimScript, 48 47 byte

Vim ha dei bei builtin per questo. Richiede Vim 8.

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

Si aspetta che il testo sia inserito in modalità inserimento, un input molto ragionevole per VimScript. Spiegazione:

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

Il mio approccio iniziale se ri|sl10m|se ri&non funziona perché il testo è memorizzato nel buffer fino a dopo il comando sleep e non sono riuscito a trovare un modo per aggirare il problema.


5

HTML (JS), 96 byte

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

Inizia il cronometraggio per 1 secondo dal primo tasto per darti la possibilità di vederlo in azione.


4

JavaScript (ES6), 88 byte

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

dimostrazione

Per come funziona lo snippet, dovrai fare clic all'interno del riquadro in modo che si attivi dopo aver fatto clic sul pulsante Esegui e prima di poter iniziare a digitare.

Non c'è modo di farlo in meno di 10ms. Quindi, ho impostato il ritardo su 1 secondo in questa demo - e anche così, faresti meglio a sbrigarti.


3

Elaborazione, 167 165 146 byte

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

Accetta input come sequenze di tasti e output sulla console. Aggiorna ogni frame.

Spiegazione

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 Dire che l'input era asdf+ ghjk. Se tutto fosse in una variabile, dopo i 10 millisecondi, avremmo fdsain quella stringa. Dopodiché, quando gviene digitato, la stringa antepone ge diventa gfdsa. Quindi, quando hviene digitato, non posso anteporre halla variabile (perché quindi l'input è ancora invertito), dovrò usare se dovrò substringcalcolare la lengthvariabile String. Questo costerà molti byte.
Kritixi Lithos,

usa il ternario per ridurre i byte
Mr. Alien

@ Mr.Alien Per usare un ternario, dovrei avere a che fare con la stessa variabile, ma qui uso due variabili diverse (vale a dire ae b). Anche se assegno il risultato a una variabile temporanea, il conteggio dei risultati risultante è ancora maggiore.
Kritixi Lithos,

Mio male, ho pensato che fosse una risposta JavaScript x) .. realizzato quando ho visto scrivere il tipo nella tua risposta ...
Mr. Alien

1

C - 169 byte

Beh, C non è il migliore per questo in quanto non ha un modo indipendente dalla piattaforma per farlo. Funziona con 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 approccio un po 'confuso, se riesci a digitare più di 9 caratteri in 10 ms, questo si bloccherà. Aggiornamenti dopo un carattere di nuova riga.


1
Non sono sicuro di poter schiacciare 9 personaggi casuali in 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 si desidera che l'output sia a livello, senza inondazioni di linee, utilizzare print'\r'+a+b, invece

Dovrai interrompere il processo per interromperlo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.