ตรวจสอบปุ่มทั้งหมดของแป้นพิมพ์


14

เขียนโปรแกรมที่สั้นที่สุดที่รอสำหรับทุกคีย์ของคีย์มาตรฐาน 101 US *เพื่อกดและออกจากการเขียน OK!

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

การกดปุ่มเดิมสองครั้งขึ้นไปไม่ควรทำให้รหัสหยุดชะงักหรือเปลี่ยนหมายเลขที่แสดงของปุ่มที่ยังไม่ได้กดที่เหลือ

คีย์ทั้งหมด ( Left Shift, Right Shift, Right Control, Esc, Enterฯลฯ ) ควรจะรวม

ปุ่มแป้นพิมพ์ที่เกิดขึ้นจริงมีความสำคัญในความท้าทายนี้ดังนั้นจากมุมมองของโปรแกรม ( Aและaเป็นเดียวกันและเพื่อให้มี6และ^)

คีย์ผสมจะไม่ได้รับการลงทะเบียนเป็นคำสั่งแบบรวมและจะมีการลงทะเบียนเฉพาะคีย์แต่ละรายการหากกดCtrl+ Alt+ Delซึ่งจะนับสำหรับแต่ละคีย์ทั้งหมดในชุดค่าผสมที่ถูกกด ดังนั้นไม่จำเป็นต้องกดตัวพิมพ์ใหญ่หากคุณกดตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แล้ว

แผงปุ่มกดตัวเลขบนแป้นพิมพ์ตัวเลขมีความแตกต่างจากมุมมองของโปรแกรมเพื่อให้พวกเขายังคงมีความจำเป็นที่จะต้องกดสำหรับโปรแกรมที่จะเสร็จสิ้นถ้าคุณมีแล็ปท็อปหรือแป้นพิมพ์อื่น ๆ ที่ไม่ได้มีมาตรฐาน 101 ดอลลาร์สหรัฐแป้นพิมพ์แบบคุณ ไม่สามารถทำสิ่งที่ท้าทายได้หากคุณไม่ได้ติดตั้งแป้นพิมพ์ที่เข้ากันได้

* คีย์บอร์ดที่มีคีย์ Fn และคีย์แล็ปท็อปจะไม่ได้รับการสนับสนุนเพื่อให้ความท้าทายนี้เป็นไปได้

นี่คือรายการของแป้นสำหรับรูปแบบแป้นพิมพ์ 101 มาตรฐานของสหรัฐอเมริกา:

backspace
tab
enter
right shift
right ctrl
right alt
left shift
left ctrl
left alt
print screen
pause/break
caps lock
escape
page up
page down
end
home
left arrow
up arrow
right arrow
down arrow
insert
delete
0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
numpad 0
numpad 1
numpad 2
numpad 3
numpad 4
numpad 5
numpad 6
numpad 7
numpad 8
numpad 9
multiply
add
subtract
decimal point
numpad enter
divide
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
num lock
scroll lock
semi-colon
equal sign
comma
dash
period
forward slash
grave accent
open bracket
back slash
close braket
single quote
space

1
การกดปุ่ม Enter / Return นั้นถูกต้องหลังจากกดปุ่มทุกครั้งหรือไม่ หากไม่เป็นเช่นนี้เป็นไปไม่ได้ในหลายภาษา
Doorknob

5
รายการคีย์โปรด!
feersum

2
นอกจากนี้โปรแกรมจำเป็นต้องสนับสนุน ASCII ที่ไม่สามารถพิมพ์ได้หรือไม่ (เช่น Escape, Tab, Ctrl, Shift, Alt, แทรก, ปุ่มลูกศร, Caps Lock, Home, End, เลื่อนหน้าขึ้น / ลง, Backspace, Del, ปุ่ม F, ฯลฯ )? ต้องกดทั้งตัวละครและเวอร์ชั่นที่เปลี่ยนแล้วหรือไม่? สิ่งที่เกี่ยวกับ Ctrl + ตัวอักษร? ปุ่มตัวเลขจะนับแตกต่างจากปุ่มปกติหรือไม่?
Doorknob

1
@Doorknob คุณไม่สามารถทำสิ่งที่ท้าทายได้โดยใช้แป้นพิมพ์ของแล็ปท็อปเว้นแต่ว่าจะมีทั้งหมด 101 คีย์ที่จำเป็นสำหรับเค้าโครงมาตรฐาน US 101 คีย์
Eduard Florinescu

1
@ beta-decay คนส่วนใหญ่ที่ปิดคำถามนี้ไม่เคยถามสิ่งที่พวกเขาไม่เข้าใจดังนั้นฉันจึงเดาได้ยาก
Eduard Florinescu

คำตอบ:


6

Javascript, 524 ไบต์

สวัสดีนี่เป็นครั้งแรกที่ฉันโพสต์ที่นี่ดังนั้นขอโทษถ้าฉันยังไม่รู้ในบางสิ่งฉันคิดว่าฉันอยู่ในกฎ

k=[8,9,"130","133","161","162","171","172","181","182",19,20,27,44,45,46,48,49,50,51,52,53,54,55,56,57,144,145,186,187,188,189,190,191,192,219,220,221,222];for(i=32;i<124;i+=1){i<41?k.push(i):i>64?i<91?k.push(i):i>95?i!=108?k.push(i):0:0:0}d=[13,16,17,18];m=document.addEventListener;c=console.log;m("keydown",e=>{e.preventDefault()});m("keyup",e=>{c(e.code);if(d.includes(e.which)){l=e.which+""+e.location;if(k.includes(l)){k.splice(k.indexOf(l),1)}}else if(k.includes(e.which)){k.splice(k.indexOf(e.which),1)}c(k.length)})

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

ภาพรวม

โปรแกรมสร้างอาเรย์ของรหัส "101" ทั้งหมด บางส่วนถูกเขียนอย่างชัดเจนบางลำดับจะถูกเพิ่มด้วยห่วงสำหรับและบางส่วนจะถูกเก็บไว้เป็นสตริง ฉันมีอาร์เรย์แยกต่างหากสำหรับรหัส "สอง" เนื่องจากการควบคุมซ้ายและขวาเช่นให้รหัสเดียวกัน พวกเขายังให้ตำแหน่งอย่างไรก็ตามฉันรวมคีย์โค้ดกับที่ตั้งเป็นสตริงในอาร์เรย์ จากนั้นเป็นเพียง eventlistener ที่ป้องกันการทำงานของ keydown เริ่มต้น (ไม่ต้องการรีเฟรชด้วย F5 ในกรณีนี้) และผู้แยก eventlistener สำหรับ keyup เพราะทุก ๆ key สามารถตรวจพบได้ใน keydown ยกเว้น PRINTSCREEN

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

ข้อ จำกัด

  • ดูเหมือนว่าจะทำงานได้ดีใน Chrome เท่านั้น

ฉันหวังว่าคำตอบนี้จะได้รับการชื่นชมและโปรดแจ้งให้เราทราบหากฉันทำอะไรผิด


5
ยินดีต้อนรับสู่ PPCG!
FantaC

คุณสามารถเปลี่ยนเครื่องหมายอัฒภาคบางส่วนหรือทั้งหมดเป็นบรรทัดใหม่ได้หรือไม่ มันจะไม่ช่วยนับไบต์ของคุณ แต่มันจะง่ายต่อการอ่าน
Jordan

นี่เป็นเวอร์ชันที่อ่านง่ายกว่ามากpastebin.com/PE4anSFw
M4Y

4

Java 8, 607 + 64 = 671 ไบต์

InterruptedExceptionนี่คือแลมบ์ดาการพารามิเตอร์ไม่ได้ใช้และการขว้างปา มันเปิดหน้าต่างซึ่งเมื่ออยู่ในโฟกัสดักจับกดของคีย์มาตรฐาน 101 จำนวนไบต์รวมแลมบ์ดาและการนำเข้าที่จำเป็น

import java.awt.event.*;import javax.swing.*;import java.util.*;

v->{Set<Integer>s=new HashSet();long[]l={0x2bfff1ff081f0300l,0x8fffefff3ffffffel,3075<<16,4<<28|1};JFrame f=new JFrame();f.addKeyListener(new KeyAdapter(){public void keyReleased(KeyEvent e){int c=e.getKeyCode(),o=e.getKeyLocation(),n;c=(c==10|c>15&c<19)&o<3?-c:c==225?98:c==226?100:c==65386?101:c==227?102:c==224?104:o>3?c==33?105:c==34?99:c==35?97:c==36?103:c==127?110:c==155?96:c:(l[c/64]>>>c&1)<1?0:c;if(c!=0)s.add(c);System.out.println(n=101-s.size());if(n<1)synchronized(f){f.notify();}}});f.setFocusTraversalKeysEnabled(0<1);f.show();synchronized(f){f.wait();}System.out.print("OK!");System.exit(0);}

คุณสามารถหาชั้นเรียนทดสอบด้วยรุ่นที่ไม่ดีได้ที่นี่

ภาพรวม

ในขณะที่กดปุ่มค่าจะระบุค่าเหล่านั้นโดยไม่ซ้ำกัน (ในกรณีส่วนใหญ่รหัสคีย์) จะถูกเก็บไว้ในชุด ระดับแรกของการมอบหมายแบบไตรภาคเพื่อcจัดการกรณีที่รหัสคีย์ไม่ชัดเจน (เช่นคีย์ "โฮม" ซึ่งอาจมาจากส่วนหลักของแป้นพิมพ์หรือแป้นตัวเลข) และกรณีที่คีย์เดียวกันสามารถแมปไปที่หลาย ๆ รหัสคีย์ (เช่นการทำงานของแป้นตัวเลขด้วยการเปิดหรือปิด Num Lock) สาขาสุดท้ายจัดการคีย์ "ปกติ" ซึ่งสามารถใช้รหัสในชุดได้อย่างง่ายดาย รหัสคีย์ดัชนีดัชนีลงในบิตแมปlซึ่งระบุว่าคีย์นั้นเป็นหนึ่งในมาตรฐาน 101 หรือไม่

ข้อ จำกัด

  • โปรแกรมควรสามารถทดสอบ 101 แป้นพิมพ์และดูว่าทุกปุ่มทำงานได้หรือไม่

    หากมีการกดคีย์ใด ๆ ที่นอกเหนือจากมาตรฐาน 101 การติดตามสแต็กอาจถูกพิมพ์ไปที่ข้อผิดพลาดมาตรฐานหรือพฤติกรรมที่ไม่คาดคิดอาจเกิดขึ้น

  • โปรแกรมใช้ค่าตัวเลขของค่าคงที่ของรหัสคีย์โดยตรงและKeyEventเอกสารของ Oracle ระบุว่าค่าเหล่านี้อาจเปลี่ยนแปลงตลอดเวลา

กิตติกรรมประกาศ

  • -10 ไบต์ขอบคุณ Kevin Cruijssen

2
f.setVisible(1>0);สามารถที่จะแข็งแรงเล่นกอล์ฟf.show();และ()->สามารถที่จะแข็งแรงเล่นกอล์ฟv->โดยใช้ไม่ได้ใช้Void nullพารามิเตอร์
Kevin Cruijssen

4

JavaScript, 98 90 75 ไบต์

ดังนั้น ... ฉันสงสัยว่าฉันอาจจะคิดสิ่งต่าง ๆ ที่นี่ แต่สิ่งนี้ควรจะได้ผล ให้ฉันรู้ว่าถ้าผมได้มองข้ามอะไร ทดสอบเฉพาะใน Chrome

s=new Set()
f=onkeydown=e=>!(onkeyup=e=>f(e,alert(101-s.add(e.code).size)))

ลองมัน

alert แทนที่สำหรับสติและคำสั่งของคุณกลับด้านเพื่อบันทึกการเลื่อน

alert=x=>o.prepend(document.createTextNode(x+`\n`))
s=new Set()
f=onkeydown=e=>!(onkeyup=e=>f(e,alert(101-s.add(e.code).size)))
p{font-family:sans-serif;font-size:14px;}pre{margin:0 10px;}
<p>Focus here and start typing ...</p><pre id=o></pre>


สิ่งหนึ่งที่คุณมองข้ามก็คือมันนับถอยหลังเมื่อคุณกดปุ่มที่ไม่ได้อยู่บนแป้นพิมพ์ 101 คีย์เช่นปุ่ม windows
M4Y

1
@ M4Y การตีความความท้าทายของฉันคือเราคิดว่าแป้นพิมพ์ที่ระบุคือสิ่งที่ถูกใช้โดยเฉพาะในบรรทัดนี้: " ถ้าคุณมีแล็ปท็อปหรือแป้นพิมพ์อื่น ๆ ที่ไม่มีเค้าโครงแป้นพิมพ์ US Standard 101 คุณไม่สามารถตอบสนองได้ ความท้าทายเว้นแต่คุณจะปลั๊กอินแป้นพิมพ์ที่เข้ากันได้ "
Shaggy

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