Моделюйте мою клавіатуру


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
@Luke 1) Так. 2) Якщо це єдиний спосіб, коли вони можуть брати участь, вони не можуть змагатися.
Post Rock Garf Hunter

3
^ Це, мабуть, виключає багато мов
Луїс Мендо

2
Це прикро. Я не хочу, щоб цей виклик управляв нашими мовами, проте я дійсно не хочу, щоб він став тривіальним викликом маніпуляції з рядками.
Post Rock Garf Hunter

2
10 мілісекунд - це дуже короткий час. Ви справді це мали на увазі?
Ніл

1
@Neil Ви, мабуть, праві, але це те, що це є, я не в змозі змінити це на даний момент.
Post Rock Garf Hunter

Відповіді:


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 секунду в цій демонстрації - і навіть так, вам краще поспішити.


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
}

1
@WheatWizard Скажіть, що вхід був asdf+ ghjk. Якби все було в одній змінній, то через 10 мілісекунд ми мали б fdsaу цій одній рядку. Після цього, коли gбуде введено, рядок буде додано gта стане gfdsa. Тоді, коли hвводиться символ, я не можу додати hдо змінної (тому що тоді вхід все одно повернений), мені потрібно буде використовувати substrings і доведеться обчислити цю lengthзмінну String. Це коштуватиме багато байтів.
Kritixi Lithos

використовуйте термінал для зменшення байтів
містер Чужий

@ Mr.Alien Для того, щоб використовувати трійку, мені потрібно мати справу з тією ж змінною, але тут я використовую дві різні змінні (а саме aі b). Навіть якщо я призначу результат тимчасовій змінній, одержуваний рахунок буде ще більшим.
Kritixi Lithos

Моє погано, я подумав, що це відповідь на 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
Я не впевнений, чи зможу я
збити

1

Пітон 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, натомість

Вам потрібно буде вбити процес, щоб зупинити його

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.