จำลองคีย์บอร์ดของฉัน


15

ฉันมีปัญหากับแป้นพิมพ์ (น่าจะมีปัญหากับเบราว์เซอร์ของฉัน) บางครั้งเมื่อฉันคลิกที่ช่องข้อความใหม่และเริ่มพิมพ์ข้อความทั้งหมดของฉันจะออกมาด้านหลัง หลังจากเวลาสั้น ๆ (สำหรับจุดประสงค์ของการท้าทายเราจะบอกว่ามันคือ 10 มิลลิวินาที) มันจะทำการพิมพ์ต่อไปอีกครั้ง ดูเหมือนว่าในตอนแรกเคอร์เซอร์ของฉันจะไม่เคลื่อนไหวเมื่อฉันเริ่มพิมพ์ดังนั้นตัวอักษรทั้งหมดจะถูกแทรกที่จุดเริ่มต้นของฟิลด์ข้อความ

ตัวอย่างเช่นถ้าฉันพิมพ์pythonและฉันพิมพ์pytใน 10 มิลลิวินาทีแรกผลลัพธ์จะเป็น

hontyp

งาน

งานของคุณคือการจำลองพฤติกรรมนี้ในไม่กี่ไบต์เท่าที่จะทำได้

อินพุต

คุณสามารถป้อนข้อมูลด้วยวิธีการที่สมเหตุสมผล อย่างไรก็ตามคุณไม่สามารถป้อนข้อมูลเป็นสองฟิลด์แยกกันได้ ความล่าช้า 10 มิลลิวินาทีควรเริ่มเมื่อโปรแกรมเริ่มให้ป้อนข้อมูล คุณอาจทำการประมวลผลล่วงหน้าก่อนที่จะอนุญาตให้ป้อนข้อมูลซึ่งไม่ควรนับเป็น 10 มิลลิวินาที

ผ่อนปรนบางอย่างได้รับอนุญาตในเวลาตราบเท่าที่มันเฉลี่ย 10 มิลลิวินาทีและถูกปิดโดยมากกว่า 1 มิลลิวินาทีไม่เกิน 1% ของเวลาในคอมพิวเตอร์ที่ระบุอย่างสมเหตุสมผล

เอาท์พุต

คุณสามารถส่งออกสตริงในวิธีใดก็ตามที่คุณเห็นว่าเหมาะสม คุณสามารถอัปเดตแบบสดๆเมื่อผู้ใช้พิมพ์หรือเอาท์พุทผลลัพธ์หลังจากที่คุณป้อนข้อมูลเสร็จแล้ว (ไม่ว่าจะขึ้นบรรทัดใหม่หรือสิ้นสุดไฟล์^D)

กรณีทดสอบ

บางส่วนของสิ่งเหล่านี้ถูกสร้างโดยCMC นี้ใน The Nine Nine 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
@ ลุค 1) ใช่ 2) ถ้านั่นเป็นวิธีเดียวที่พวกเขาสามารถรับข้อมูลจากนั้นพวกเขาไม่สามารถแข่งขัน
โพสต์ Rock Garf Hunter

3
^ นั่นอาจเป็นภาษาที่ออกกฎมากมาย
Luis Mendo

2
มันเป็นโชคร้าย ฉันไม่ต้องการให้ความท้าทายนี้ควบคุมภาษาของเรา แต่ฉันไม่ต้องการให้มันกลายเป็นความท้าทายการจัดการสตริงที่น่ารำคาญ
โพสต์ร็อค Garf Hunter

2
10 มิลลิวินาทีเป็นอย่างมากในช่วงเวลาสั้น คุณหมายถึงอย่างนั้นจริงเหรอ?
Neil

1
@ Neil คุณอาจจะถูก แต่มันคือสิ่งที่ฉันไม่สามารถเปลี่ยนได้ในจุดนี้
โพสต์ Rock Garf Hunter

คำตอบ:


7

VimScript 48 48ไบต์

เป็นกลุ่มมี builtins ที่ดีสำหรับเรื่องนี้ ต้องการ 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&ไม่ทำงานเนื่องจากข้อความถูกบัฟเฟอร์จนกระทั่งหลังจากคำสั่ง sleep และฉันไม่สามารถหาวิธีแก้ไขได้


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)

การสาธิต

วิธีการทำงานของตัวอย่างคุณจะต้องคลิกภายในเฟรมเพื่อให้โฟกัสหลังจากคลิกที่ปุ่มRunและก่อนที่คุณจะเริ่มพิมพ์

ไม่มีวิธีการทำเช่นนั้นในเวลาน้อยกว่า 10ms ดังนั้นฉันจึงตั้งค่าการหน่วงเวลาเป็น 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 Say การป้อนข้อมูลที่เป็น+asdf ghjkหากทุกอย่างอยู่ในตัวแปรเดียวจากนั้นหลังจาก 10 มิลลิวินาทีเราจะมีfdsaหนึ่งสตริงนั้น หลังจากนั้นเมื่อgถูกพิมพ์สตริงจะย่อหน้าและกลายเป็นg gfdsaจากนั้นเมื่อhพิมพ์แล้วฉันไม่สามารถhเพิ่มตัวแปร (เพราะจากนั้นอินพุตยังกลับด้าน) ฉันจะต้องใช้substrings และต้องคำนวณlengthตัวแปรของสตริงนั้น นี้จะมีค่าใช้จ่ายจำนวนมากไบต์
Kritixi Lithos

ใช้ ternary เพื่อลดจำนวนไบต์
Mr. Alien

@ 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
ฉันไม่แน่ใจว่าฉันสามารถบดตัวอักษรแบบสุ่ม 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,แทน

คุณจะต้องฆ่ากระบวนการเพื่อหยุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.