Mô phỏng bàn phím của tôi


15

Tôi gặp sự cố với bàn phím của mình (nhiều khả năng là sự cố với trình duyệt của tôi). Đôi khi tôi nhấp vào một trường văn bản mới và bắt đầu nhập tất cả văn bản của tôi đi ra phía sau. Sau một khoảng thời gian rất ngắn (với mục đích của thử thách, chúng tôi sẽ nói là 10 mili giây), nó lại tiếp tục gõ tiếp. Có vẻ như lúc đầu, con trỏ của tôi không di chuyển khi tôi bắt đầu nhập để tất cả các chữ cái được chèn vào đầu trường văn bản.

Ví dụ nếu tôi gõ pythonvà tôi gõ pyttrong 10 mili giây đầu tiên kết quả sẽ là

hontyp

Bài tập

Công việc của bạn là mô phỏng hành vi này trong càng ít byte càng tốt.

Đầu vào

Bạn có thể lấy đầu vào trong bất kỳ phương pháp hợp lý. Tuy nhiên, bạn không thể lấy đầu vào là hai trường riêng biệt. Độ trễ 10 mili giây sẽ bắt đầu khi chương trình bắt đầu cho phép nhập liệu. Đó là bạn có thể phải xử lý trước khi cho phép nhập liệu, điều này không được tính vào 10 mili giây.

Một số khoan hồng được cho phép trong thời gian miễn là trung bình 10 mili giây và tắt hơn 1 mili giây không quá 1% thời gian trên một máy tính được chỉ định hợp lý.

Đầu ra

Bạn có thể xuất chuỗi theo bất kỳ phương thức nào bạn thấy phù hợp. Bạn có thể cập nhật trực tiếp khi người dùng đang nhập hoặc xuất kết quả sau khi bạn kết thúc việc nhập dữ liệu (theo dòng mới hoặc cuối tệp ^D).

Các trường hợp thử nghiệm

Một số trong số này đã được CMC này tạo ra trong 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

3
@Luke 1) Có. 2) Nếu đó là cách duy nhất họ có thể nhận đầu vào thì họ không thể cạnh tranh.
Đăng Rock Garf Hunter

3
^ Điều đó có thể loại trừ rất nhiều ngôn ngữ
Luis Mendo

2
Thật đáng tiếc. Tôi không muốn thử thách này thống trị ngôn ngữ của chúng tôi, tuy nhiên tôi thực sự không muốn nó trở thành một thử thách thao túng chuỗi tầm thường.
Đăng Rock Garf Hunter

2
10 mili giây là một thời gian rất ngắn. Bạn đã thực sự có ý đó?
Neil

1
@Neil Bạn có thể đúng, nhưng đó là những gì nó có, tôi không ở vị trí để thay đổi nó vào thời điểm này.
Đăng Rock Garf Hunter

Câu trả lời:


7

VimScript, 48 47 byte

Vim có một số nội dung đẹp cho việc này. Yêu cầu Vim 8.

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

Yêu cầu văn bản được nhập trong chế độ chèn, một đầu vào rất hợp lý cho VimScript. Giải trình:

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

Cách tiếp cận ban đầu của tôi, se ri|sl10m|se ri&, không hoạt động vì văn bản được đệm cho đến sau khi lệnh giấc ngủ, và tôi không thể tìm thấy một khoảng cách này.


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)>

Bắt đầu thời gian trong 1 giây từ lần nhấn phím đầu tiên để cho bạn cơ hội thấy nó hoạt động.


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)

Bản giới thiệu

Cách đoạn trích hoạt động, bạn sẽ cần nhấp vào bên trong khung của nó để nó được lấy nét sau khi nhấp vào nút Runtrước khi bạn có thể bắt đầu nhập.

Không có cách nào để làm điều đó trong ít hơn 10ms. Vì vậy, tôi đã đặt độ trễ thành 1 giây trong bản demo này - và thậm chí như vậy, bạn nên nhanh chân hơn.


3

Đang xử lý, 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;}

Đưa đầu vào dưới dạng tổ hợp phím và đầu ra cho bàn điều khiển. Nó cập nhật mọi khung hình.

Giải trình

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 Nói đầu vào là asdf+ ghjk. Nếu mọi thứ nằm trong một biến, thì sau 10 mili giây, chúng ta sẽ có fdsatrong một chuỗi đó. Sau đó, khi gđược gõ, chuỗi sẽ thêm vào gvà trở thành gfdsa. Sau đó, khi hđược gõ, tôi không thể thêm vào hbiến (vì khi đó đầu vào vẫn bị đảo ngược), tôi sẽ cần sử dụng substrings và phải tính toán lengthbiến Chuỗi đó. Điều này sẽ tốn rất nhiều byte.
Kritixi Lithos

sử dụng ternary để giảm byte
Ông Alien

@ Mr.Alien Để sử dụng một ternary, tôi sẽ cần phải xử lý cùng một biến, nhưng ở đây, tôi sử dụng hai biến khác nhau (cụ thể là ab). Ngay cả khi tôi gán kết quả cho biến tạm thời, kết quả bytecount vẫn lớn hơn.
Kritixi Lithos

Thật tệ, tôi nghĩ đó là một câu trả lời JavaScript x) .. nhận ra khi tôi thấy kiểu truyền trong câu trả lời của bạn ...
Ông Alien

1

C - 169 byte

Vâng C không phải là tốt nhất cho việc này vì nó không có cách nào độc lập với nền tảng này. Hoạt động theo 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]));}

Một cách tiếp cận khó khăn, nếu bạn có thể nhập nhiều hơn 9 ký tự trong 10 ms, điều này sẽ sụp đổ. Cập nhật sau một ký tự dòng mới.


1
Tôi không chắc mình có thể nghiền 9 ký tự ngẫu nhiên trong 10ms không ...
uốn cong

1

Con trăn 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

Nếu bạn muốn đầu ra được tuôn ra, không bị ngập dòng, hãy sử dụng print'\r'+a+b, thay vào đó hãy

Bạn sẽ cần phải giết quá trình để ngăn chặn nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.