Simulasikan keyboard saya

15

Saya memiliki masalah dengan keyboard saya (kemungkinan besar masalah dengan browser saya). Beberapa kali ketika saya mengklik bidang teks baru dan mulai mengetik semua teks saya keluar ke belakang. Setelah waktu yang sangat singkat (untuk tujuan tantangan, kami akan mengatakan itu 10 milidetik) dilanjutkan mengetik lagi. Tampaknya pada awalnya kursor saya tidak bergerak ketika saya mulai mengetik sehingga semua huruf bisa dimasukkan di awal bidang teks.

Misalnya jika saya mengetik pythondan saya mengetik pytdalam 10 milidetik pertama hasilnya akan

hontyp

Tugas

Tugas Anda adalah mensimulasikan perilaku ini dalam sesedikit mungkin byte.

Memasukkan

Anda dapat mengambil input dengan metode apa pun yang masuk akal. Namun Anda tidak dapat mengambil input sebagai dua bidang terpisah. Penundaan 10 milidetik harus dimulai ketika program mulai mengizinkan input. Artinya Anda mungkin harus melakukan praproses sebelum input diizinkan, yang tidak boleh dihitung dalam 10 milidetik.

Beberapa keringanan diizinkan dalam waktu selama rata-rata 10 milidetik dan dimatikan lebih dari 1 milidetik tidak lebih dari 1% dari waktu pada komputer yang ditentukan secara wajar.

Keluaran

Anda dapat menampilkan string dengan metode apa pun yang Anda inginkan. Anda dapat memperbarui langsung saat pengguna mengetik atau output hasilnya setelah Anda selesai mengambil input (baik dengan baris baru atau akhir file^D ).

Uji kasus

Beberapa di antaranya dihasilkan oleh CMC ini dalam 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
Posting Rock Garf Hunter
sumber
3
@ Lukas 1) Ya. 2) Jika itu satu-satunya cara mereka dapat mengambil input maka mereka tidak dapat bersaing.
Posting Rock Garf Hunter
3
^ Itu mungkin mengesampingkan banyak bahasa
Luis Mendo
2
Sangat disayangkan. Saya tidak ingin tantangan ini menguasai bahasa kita, namun saya benar-benar tidak ingin itu menjadi tantangan manipulasi string yang sepele.
Post Rock Garf Hunter
2
10 milidetik adalah waktu yang sangat singkat. Apakah Anda benar-benar bersungguh-sungguh?
Neil
1
@Neil Anda mungkin benar, tapi memang begitu, saya tidak dalam posisi untuk mengubahnya pada saat ini.
Post Rock Garf Hunter

Jawaban:

7

VimScript, 48 47 byte

Vim memiliki beberapa bawaan bagus untuk ini. Membutuhkan Vim 8.

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

Mengharapkan teks dimasukkan dalam mode penyisipan, input yang sangat masuk akal untuk VimScript. Penjelasan:

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

Pendekatan awal saya se ri|sl10m|se ri&,, tidak berfungsi karena teks di-buffer sampai setelah perintah sleep, dan saya tidak bisa menemukan jalan keluarnya.

Brian McCutchon
sumber
5

HTML (JS), 96 byte

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

Mulai timing untuk 1s dari penekanan tombol pertama untuk memberi Anda kesempatan untuk melihatnya beraksi.

Neil
sumber
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

Cara snippet bekerja, Anda harus mengklik di dalam bingkainya sehingga fokus setelah mengklik tombol Run dan sebelum Anda bisa mulai mengetik.

Tidak ada cara untuk melakukannya dalam waktu kurang dari 10 ms. Jadi, saya telah mengatur penundaan ke 1 detik dalam demo ini - dan meskipun demikian, Anda sebaiknya bergegas.

Arnauld
sumber
3

Memproses, 167 165 146 byte

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

Mengambil input sebagai penekanan tombol dan output ke konsol. Ini memperbarui setiap frame.

Penjelasan

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
sumber
1
@WheatWizard Katakan inputnya asdf+ ghjk. Jika semuanya dalam satu variabel, maka setelah 10 milidetik, kita akan memiliki fdsadalam satu string. Setelah itu, saat gdiketikkan, string akan menambah gdan menjadi gfdsa. Kemudian ketika hdiketik, saya tidak dapat menambahkan hke variabel (karena inputnya masih terbalik), saya harus menggunakan substrings dan harus menghitung lengthvariabel String itu. Ini akan menghabiskan banyak byte.
Kritixi Lithos
gunakan ternary untuk mengurangi byte
Tn. Alien
@ Mr.Alien Untuk menggunakan ternary, saya perlu berurusan dengan variabel yang sama, tetapi di sini, saya menggunakan dua variabel yang berbeda (yaitu adan b). Bahkan jika saya menetapkan hasilnya ke variabel temp, bytecount yang dihasilkan masih lebih besar.
Kritixi Lithos
Buruk saya, saya pikir itu adalah jawaban JavaScript x) .. menyadari ketika saya melihat mengetikkan jawaban Anda ...
Tn. Alien
1

C - 169 byte

Yah C bukan yang terbaik untuk ini karena tidak memiliki cara platform-independen untuk melakukan ini. Bekerja di bawah 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]));}

Sedikit pendekatan hacky, jika Anda dapat mengetik lebih dari 9 karakter dalam 10 ms, ini akan macet. Pembaruan setelah karakter baris baru.

Peter Lenkefi
sumber
1
Saya tidak yakin apakah saya dapat menumbuk 9 karakter acak dalam 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

Jika Anda ingin output menjadi rata, tanpa membanjiri garis, gunakan print'\r'+a+b,saja

Anda harus mematikan proses untuk menghentikannya

Felipe Nardi Batista
sumber