Symuluj moją klawiaturę

15

Mam problem z klawiaturą (bardziej prawdopodobny problem z przeglądarką). Czasami, gdy klikam nowe pole tekstowe i zaczynam pisać, cały mój tekst wychodzi do tyłu. Po bardzo krótkim czasie (na potrzeby wyzwania powiemy, że jest to 10 milisekund), wznawia pisanie do przodu. Wydaje się, że początkowo mój kursor nie porusza się, kiedy zaczynam pisać, więc wszystkie litery są wstawiane na początku pola tekstowego.

Na przykład, jeśli piszę pythoni wpisuję pytpierwsze 10 milisekund, wynikiem będzie

hontyp

Zadanie

Twoim zadaniem jest symulacja tego zachowania w jak najmniejszej liczbie bajtów.

Wejście

Możesz wziąć wkład dowolną rozsądną metodą. Nie możesz jednak traktować danych wejściowych jako dwóch oddzielnych pól. 10 milisekundowe opóźnienie powinno rozpocząć się, gdy program zacznie zezwalać na wprowadzanie danych. Oznacza to, że możesz wykonać wstępne przetwarzanie przed zezwoleniem na wprowadzanie danych, czego nie należy liczyć do 10 milisekund.

Pewna łagodność jest dozwolona w taktowaniu tak długo, jak wynosi średnio 10 milisekund i jest wyłączana o więcej niż 1 milisekundę przez nie więcej niż 1% czasu na rozsądnie określonym komputerze.

Wynik

Możesz wyprowadzać ciąg znaków dowolną metodą, która uzna za stosowną. Możesz albo aktualizować na żywo, gdy użytkownik pisze lub wypisać wynik po zakończeniu wprowadzania danych (albo przez nową linię, albo na końcu pliku ^D).

Przypadki testowe

Niektóre z nich zostały wygenerowane przez CMC w Dziewiętnastym bajcie

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
źródło
3
@Luke 1) Tak. 2) Jeśli jest to jedyny sposób, w który mogą brać udział, nie mogą konkurować.
Post Rock Garf Hunter
3
^ To prawdopodobnie wyklucza wiele języków
Luis Mendo
2
To jest niefortunne. Nie chcę, aby to wyzwanie rządziło naszymi językami, ale tak naprawdę nie chcę, aby stało się trywialnym wyzwaniem do manipulacji ciągami.
Post Rock Garf Hunter
2
10 milisekund to bardzo krótki czas. Czy naprawdę to miałeś na myśli?
Neil
1
@ Neil Prawdopodobnie masz rację, ale tak właśnie jest, nie jestem w stanie tego zmienić.
Post Rock Garf Hunter

Odpowiedzi:

7

VimScript, 48 47 bajtów

Vim ma do tego kilka fajnych wbudowań. Wymaga Vima 8.

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

Oczekuje tekstu wprowadzonego w trybie wstawiania, co jest bardzo rozsądnym wprowadzeniem dla VimScript. Wyjaśnienie:

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

Moje początkowe podejście, se ri|sl10m|se ri&nie działa, ponieważ tekst jest buforowany do czasu po komendzie uśpienia i nie mogłem znaleźć sposobu na obejście tego.

Brian McCutchon
źródło
5

HTML (JS), 96 bajtów

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

Zaczyna mierzyć czas od 1s od pierwszego naciśnięcia klawisza, aby dać Ci szansę zobaczenia go w akcji.

Neil
źródło
4

JavaScript (ES6), 88 bajtów

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

Próbny

Sposób, w jaki działa fragment kodu, musisz kliknąć wewnątrz jego ramki, aby uzyskać ostrość po kliknięciu przycisku Uruchom i przed zaczniesz pisać.

Nie da się tego zrobić w mniej niż 10ms. Więc ustawiłem opóźnienie na 1 sekundę w tym demo - i mimo to lepiej się pospiesz.

Arnauld
źródło
3

Przetwarzanie, 167 165 146 bajtów

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

Pobiera dane jako naciśnięcia klawiszy i dane wyjściowe do konsoli. Aktualizuje każdą klatkę.

Wyjaśnienie

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
źródło
1
@WheatWizard Powiedz, że wejście było asdf+ ghjk. Gdyby wszystko było w jednej zmiennej, to po 10 milisekundach mielibyśmy fdsaten jeden ciąg. Następnie, po gwpisaniu, łańcuch będzie poprzedzał gi stał się gfdsa. Następnie, gdy hzostanie wpisany, nie mogę wstawić hdo zmiennej (ponieważ wtedy dane wejściowe są nadal odwrócone), będę musiał użyć substrings i obliczyć lengthzmienną String. Będzie to kosztować dużo bajtów.
Kritixi Lithos
użyj trójskładnikowej, aby zmniejszyć bajty
Pan Alien
@ Mr.Alien Aby użyć trójki, musiałbym poradzić sobie z tą samą zmienną, ale tutaj używam dwóch różnych zmiennych (mianowicie ai b). Nawet jeśli przypiszę wynik do zmiennej temp, wynikowa liczba bajtów jest jeszcze większa.
Kritixi Lithos
Mój zły, myślałem, że to odpowiedź JavaScript x) .. uświadomiłem sobie, kiedy zobaczyłem casting tekstu w twojej odpowiedzi ...
Pan Alien
1

C - 169 bajtów

Cóż nie jest do tego najlepszy, ponieważ nie ma na to sposobu niezależnego od platformy. Działa pod 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]));}

Trochę hacky podejście, jeśli możesz wpisać więcej niż 9 znaków w 10 ms, to się zawiesi. Aktualizacje po znaku nowej linii.

Peter Lenkefi
źródło
1
Nie jestem pewien, czy uda mi się
zmiksować
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

Jeśli chcesz, aby wyjście było wyrównane, bez zalewania liniami, użyj print'\r'+a+b, zamiast tego

Musisz go zabić, aby go zatrzymać

Felipe Nardi Batista
źródło