Simulieren Sie meine Tastatur

15

Ich habe ein Problem mit meiner Tastatur (wahrscheinlicher ein Problem mit meinem Browser). Manchmal, wenn ich auf ein neues Textfeld klicke und mit der Eingabe beginne, wird mein gesamter Text rückwärts ausgegeben. Nach einer sehr kurzen Zeitspanne (für den Zweck der Herausforderung werden wir sagen, dass es 10 Millisekunden sind) wird die Eingabe vorwärts wieder aufgenommen. Es scheint, als würde sich mein Cursor zu Beginn der Eingabe nicht bewegen, sodass alle Buchstaben am Anfang des Textfelds eingefügt werden.

Wenn ich zum Beispiel tippe pythonund pytin den ersten 10 Millisekunden tippe, ist das Ergebnis

hontyp

Aufgabe

Ihre Aufgabe ist es, dieses Verhalten in möglichst wenigen Bytes zu simulieren.

Eingang

Sie können Eingaben auf jede vernünftige Weise vornehmen. Sie können die Eingabe jedoch nicht als zwei separate Felder annehmen. Die Verzögerung von 10 Millisekunden sollte beginnen, wenn das Programm beginnt, Eingaben zuzulassen. Das heißt, Sie müssen möglicherweise eine Vorverarbeitung durchführen, bevor die Eingabe zulässig ist. Dies sollte nicht für die 10 Millisekunden gezählt werden.

Eine gewisse Nachsicht ist während des Timings zulässig, solange es durchschnittlich 10 Millisekunden dauert und auf einem vernünftig spezifizierten Computer in höchstens 1% der Fälle um mehr als 1 Millisekunde nachlässt.

Ausgabe

Sie können die Zeichenfolge in einer beliebigen Methode ausgeben, die Sie für richtig halten. Sie können entweder live aktualisieren, während der Benutzer tippt, oder das Ergebnis ausgeben, nachdem Sie die Eingabe abgeschlossen haben (entweder durch eine neue Zeile oder durch ein Dateiende ^D).

Testfälle

Einige davon wurden von dieser CMC im neunzehnten Byte generiert

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
Weizen-Assistent
quelle
3
@ Luke 1) Ja. 2) Wenn dies der einzige Weg ist, auf dem sie Beiträge entgegennehmen können, können sie nicht mithalten.
Weizen-Assistent
3
^ Das schließt wahrscheinlich viele Sprachen aus
Luis Mendo
2
Es ist bedauerlich. Ich möchte nicht, dass diese Herausforderung unsere Sprachen beherrscht, aber ich möchte wirklich nicht, dass sie zu einer trivialen Herausforderung bei der Manipulation von Zeichenfolgen wird.
Weizen-Assistent
2
10 Millisekunden sind eine sehr kurze Zeit. Meinten Sie das wirklich?
Neil
1
@Neil Du hast wahrscheinlich recht, aber es ist, was es ist, ich bin nicht in der Lage, es an dieser Stelle zu ändern.
Weizen-Assistent

Antworten:

7

VimScript, 48 47 Bytes

Vim hat dafür einige nette Builtins. Benötigt Vim 8.

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

Erwartet im Einfügemodus eingegebenen Text, eine sehr sinnvolle Eingabe für VimScript. Erläuterung:

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

Meine anfängliche Vorgehensweise se ri|sl10m|se ri&funktioniert nicht, da der Text erst nach dem Befehl sleep zwischengespeichert wird und ich keinen Weg gefunden habe, dies zu umgehen.

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

Startet das Timing für 1s ab dem ersten Tastendruck, damit Sie es in Aktion sehen können.

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

Demo

Wie das Snippet funktioniert, müssen Sie tun Sie in den Rahmen klicken, damit es den Fokus erhält, nachdem Sie auf die Schaltfläche Ausführen geklickt haben und bevor Sie mit der Eingabe beginnen können.

Es gibt keine Möglichkeit, dies in weniger als 10 ms zu tun. Also habe ich die Verzögerung in dieser Demo auf 1 Sekunde eingestellt - und trotzdem sollten Sie sich beeilen.

Arnauld
quelle
3

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

Übernimmt Eingaben als Tastenanschläge und gibt sie an die Konsole aus. Es aktualisiert jeden Frame.

Erläuterung

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
quelle
1
@ WheatWizard Angenommen, die Eingabe war asdf+ ghjk. Wenn alles in einer Variablen wäre, dann hätten wir nach den 10 Millisekunden fdsain dieser einen Zeichenfolge. Danach, wenn geingegeben, wird die Zeichenfolge vor gund werden gfdsa. Wenn dann der heingegeben wird, kann ich hder Variablen kein Präfix voranstellen (da die Eingabe dann immer noch umgekehrt ist), ich muss substrings verwenden und die lengthVariable dieser Zeichenfolge berechnen. Dies kostet eine Menge Bytes.
Kritixi Lithos
Verwenden Sie Ternary, um Bytes zu reduzieren
Mr. Alien
@ Mr.Alien Um ein Ternär zu verwenden, müsste ich mich mit der gleichen Variablen befassen, aber hier verwende ich zwei verschiedene Variablen (nämlich aund b). Auch wenn ich das Ergebnis einer temporären Variablen zuordnete, ist der resultierende bytecount immer noch größer.
Kritixi Lithos
Meine schlechte, ich dachte, es ist eine JavaScript-Antwort x) .. realisiert, als ich Typ Casting in Ihrer Antwort sah ...
Mr. Alien
1

C - 169 Bytes

Nun, C ist dafür nicht das Beste, da es dafür keine plattformunabhängige Methode gibt. Funktioniert unter 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]));}

Wenn Sie mehr als 9 Zeichen in 10 ms eingeben können, stürzt dies ab. Updates nach einem Newline-Zeichen.

Peter Lenkefi
quelle
1
Ich bin mir nicht sicher, ob ich 9 zufällige Zeichen in 10
ms
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

Wenn die Ausgabe bündig sein soll, ohne mit Linien zu fluten, verwenden Sie print'\r'+a+b,stattdessen

Sie müssen den Prozess beenden, um ihn zu stoppen

Felipe Nardi Batista
quelle