Simuler mon clavier

15

J'ai un problème avec mon clavier (plus probablement un problème avec mon navigateur). Parfois, lorsque je clique sur un nouveau champ de texte et commence à taper tout mon texte sort à l'envers. Après un très court laps de temps (aux fins du défi, nous dirons qu'il s'agit de 10 millisecondes), il recommence à taper vers l'avant. Il semble qu'au début mon curseur ne bouge pas quand je commence à taper donc toutes les lettres sont insérées au début du champ de texte.

Par exemple, si je tapais pythonet que je tapais pytdans les 10 premières millisecondes, le résultat serait

hontyp

Tâche

Votre travail consiste à simuler ce comportement dans le moins d'octets possible.

Contribution

Vous pouvez prendre connaissance de toute méthode raisonnable. Cependant, vous ne pouvez pas considérer l'entrée comme deux champs distincts. Le délai de 10 millisecondes doit commencer lorsque le programme commence à autoriser l'entrée. C'est-à-dire que vous pouvez avoir un prétraitement à faire avant que l'entrée ne soit autorisée, qui ne doit pas être comptée dans les 10 millisecondes.

Une certaine clémence est autorisée dans le temps tant qu'elle est en moyenne de 10 millisecondes et est désactivée de plus de 1 millisecondes pas plus de 1% du temps sur un ordinateur raisonnablement spécifié.

Production

Vous pouvez sortir la chaîne selon la méthode que vous jugez appropriée. Vous pouvez soit mettre à jour en direct au fur et à mesure que l'utilisateur tape ou afficher le résultat après avoir terminé la saisie (soit par une nouvelle ligne ou à la fin du fichier ^D).

Cas de test

Certains d'entre eux ont été générés par ce CMC dans 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
la source
3
@ Luc 1) Oui. 2) Si c'est le seul moyen pour eux de participer, ils ne peuvent pas rivaliser.
Post Rock Garf Hunter
3
^ Cela exclut probablement beaucoup de langues
Luis Mendo
2
Il est regrettable. Je ne veux pas que ce défi règle nos langages, mais je ne veux vraiment pas qu'il devienne un défi trivial de manipulation de chaînes.
Post Rock Garf Hunter
2
10 millisecondes est un temps très court. Vouliez-vous vraiment dire cela?
Neil
1
@Neil Vous avez probablement raison, mais c'est ce que c'est, je ne suis pas en mesure de le changer à ce stade.
Post Rock Garf Hunter

Réponses:

7

VimScript, 48 47 octets

Vim a de belles fonctionnalités pour cela. Nécessite Vim 8.

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

Attend du texte entré en mode insertion, une entrée très raisonnable pour VimScript. Explication:

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

Mon approche initiale,, se ri|sl10m|se ri&ne fonctionne pas parce que le texte est mis en mémoire tampon après la commande sleep, et je n'ai pas pu trouver un moyen de contourner cela.

Brian McCutchon
la source
5

HTML (JS), 96 octets

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

Commence le chronométrage pendant 1 seconde à partir de la première pression sur une touche pour vous donner une chance de le voir en action.

Neil
la source
4

JavaScript (ES6), 88 octets

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

Démo

Le mode de fonctionnement de l'extrait de code, vous devrez cliquer à l'intérieur de son cadre afin qu'il se concentre après avoir cliqué sur le bouton Exécuter et avant de commencer à taper.

Il n'y a aucun moyen de le faire en moins de 10 ms. J'ai donc réglé le délai à 1 seconde dans cette démo - et même ainsi, vous feriez mieux de vous dépêcher.

Arnauld
la source
3

Traitement, 167 165 146 octets

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

Prend les entrées sous forme de touches et les sorties vers la console. Il met à jour chaque image.

Explication

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
la source
1
@WheatWizard Supposons que l'entrée était asdf+ ghjk. Si tout était dans une variable, alors après les 10 millisecondes, nous aurions fdsadans cette seule chaîne. Après cela, lorsque gest tapé, la chaîne ajoutera le get deviendra gfdsa. Ensuite, lorsque le hest tapé, je ne peux pas ajouter hde préfixe à la variable (car alors l'entrée est toujours inversée), je devrai utiliser substrings et devra calculer le lengthde cette variable de chaîne. Cela coûtera beaucoup d'octets.
Kritixi Lithos
utiliser ternaire pour réduire les octets
M. Alien
@ Mr.Alien Pour utiliser un ternaire, il faudrait que je traite la même variable, mais ici, j'utilise deux variables différentes (à savoir aet b). Même si j'affecte le résultat à une variable temporaire, le nombre d'octets résultant est toujours plus grand.
Kritixi Lithos
Mon mauvais, je pensais que c'était une réponse JavaScript x) .. réalisé quand j'ai vu le casting de type dans votre réponse ...
M. Alien
1

C - 169 octets

Eh bien, C n'est pas le meilleur pour cela car il n'a pas de moyen indépendant de la plate-forme de le faire. Fonctionne sous 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]));}

Peu d'une approche hacky, si vous pouvez taper plus de 9 caractères en 10 ms, cela plantera. Mises à jour après un caractère de nouvelle ligne.

Peter Lenkefi
la source
1
Je ne sais pas si je peux écraser 9 caractères aléatoires en 10 ms ...
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

Si vous voulez que la sortie soit à fleur, sans inondation de lignes, utilisez print'\r'+a+b,plutôt

Vous devrez tuer le processus pour l'arrêter

Felipe Nardi Batista
la source