Имитация моей клавиатуры

15

У меня проблема с клавиатурой (более вероятная проблема с моим браузером). Иногда, когда я нажимаю на новое текстовое поле и начинаю печатать, весь мой текст выходит назад. Через очень короткий промежуток времени (для целей задачи мы скажем, что это 10 миллисекунд) он снова начинает печатать вперед. Кажется, что сначала мой курсор не двигается, когда я начинаю печатать, поэтому все буквы вставляются в начало текстового поля.

Например, если бы я печатал pythonи набирал pytпервые 10 миллисекунд, результат был бы

hontyp

задача

Ваша задача состоит в том, чтобы смоделировать это поведение как можно меньше байтов.

вход

Вы можете принять участие любым разумным способом. Однако вы не можете принимать входные данные как два отдельных поля. Задержка в 10 миллисекунд должна начинаться, когда программа начинает разрешать ввод. То есть вам может потребоваться предварительная обработка перед разрешением ввода, которая не должна учитываться до 10 миллисекунд.

Некоторая снисходительность допускается во времени, пока она в среднем составляет 10 миллисекунд и отключается более чем на 1 миллисекунду не более чем на 1% времени на компьютере с разумной скоростью.

Выход

Вы можете вывести строку любым удобным для вас способом. Вы можете либо обновлять в режиме реального времени, когда пользователь печатает, либо выводить результат после того, как вы закончили ввод данных (либо переводом строки, либо концом файла ^D).

Контрольные примеры

Некоторые из них были сгенерированы этим CMC в Девятнадцатом Байте.

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
@ Луки 1) Да. 2) Если это единственный способ, которым они могут принять участие, то они не могут конкурировать.
Пост Рок Гарф Хантер
3
^ Это, вероятно, исключает много языков
Луис Мендо
2
Это неудачно. Я не хочу, чтобы этот вызов управлял нашими языками, однако я действительно не хочу, чтобы он стал тривиальной задачей манипулирования строками.
Пост Рок Гарф Хантер
2
10 миллисекунд это очень короткое время. Вы действительно имели в виду это?
Нил
1
@Neil Вы, вероятно, правы, но это то, что есть, я не могу изменить это на данный момент.
Пост Рок Гарф Хантер

Ответы:

7

VimScript, 48 47 байт

У Vim есть несколько хороших встроенных функций для этого. Требуется Vim 8.

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

Ожидается, что текст будет введен в режиме вставки, очень разумный ввод для VimScript. Объяснение:

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

Мой первоначальный подход se ri|sl10m|se ri&не работает, потому что текст буферизуется до окончания команды сна, и я не мог найти способ обойти это.

Брайан Маккатон
источник
5

HTML (JS), 96 байт

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

Начинает отсчет времени в течение 1 с с первого нажатия клавиши, чтобы дать вам возможность увидеть его в действии.

Нил
источник
4

JavaScript (ES6), 88 байт

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

демонстрация

Как работает фрагмент кода, вам нужно щелкнуть внутри его фрейма, чтобы он получил фокус после нажатия кнопки « Выполнить» и до того, вы сможете начать печатать.

Нет способа сделать это менее чем за 10 мс. Итак, я установил задержку на 1 секунду в этой демонстрации - и даже в этом случае, вам лучше поторопиться.

Arnauld
источник
3

Обработка, 167 165 146 байт

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

Принимает ввод как нажатия клавиш и выводит на консоль. Он обновляет каждый кадр.

объяснение

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
источник
1
@WheatWizard Скажи, что вход был asdf+ ghjk. Если бы все было в одной переменной, то через 10 миллисекунд у нас была бы fdsaэта строка. После этого, когда gнабрано, строка будет предшествовать gи становится gfdsa. Затем, когда hнапечатано, я не могу hприсоединиться к переменной (потому что тогда ввод по-прежнему обратный), мне нужно будет использовать substrings и вычислить значение lengthэтой строковой переменной. Это будет стоить много байтов.
Критиси Литос
использовать троичный, чтобы уменьшить байты
Mr. Alien
@ Mr.Alien Чтобы использовать троичную систему, мне нужно иметь дело с одной и той же переменной, но здесь я использую две разные переменные (а именно, aи b). Даже если я присваиваю результат переменной temp, итоговый счет будет все же больше.
Критиси Литос
Плохо, я подумал, что это ответ JavaScript x) .. понял, когда увидел в вашем ответе приведение типов ...
Мистер Чужой
1

C - 169 байт

Ну, C не лучший для этого, так как у него нет независимого от платформы способа сделать это. Работает под 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]));}

Немного хакерский подход, если вы можете набрать более 9 символов за 10 мс, это приведет к сбою. Обновления после символа новой строки.

Петр Ленкефи
источник
1
Я не уверен, смогу ли я смешать 9 случайных символов за 10 мс ...
Бендл
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

Если вы хотите, чтобы вывод был сброшенным, без затопления со строками, используйте print'\r'+a+b,вместо

Вам нужно будет убить процесс, чтобы остановить его

Фелипе Нарди Батиста
источник