कीबोर्ड की सभी कुंजियों की जांच करें


14

सबसे छोटा प्रोग्राम लिखें जो कि एक मानक 101 कुंजी यूएस कीबोर्ड * की प्रत्येक कुंजी के लिए प्रतीक्षा करता है जिसे दबाया जाए और फिर लिखना ठीक है!

हर बार जब एक कुंजी को एक नई लाइन पर प्रोग्राम डिस्प्ले को दबाया जाता है तो शेष संख्या में अनपेक्षित यूनीक कीज़ को दबाया जाता है जब तक कि सभी कुंजी को कम से कम एक बार दबाया जाए। कार्यक्रम को 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
क्या हर कीप के बाद एंटर / रिटर्न कुंजी को दबाया जाना ठीक है? यदि नहीं, तो यह कई भाषाओं में असंभव है।
दरवाज़े

5
कृपया कुंजी की सूची!
feersum

2
इसके अलावा, क्या कार्यक्रम को गैर-मुद्रण योग्य-एएससीआईआई का समर्थन करना है? (पूर्व। एस्केप, टैब, Ctrl, Shift, Alt, सम्मिलित करें, तीर कुंजी, कैप्स लॉक, होम, एंड, पेज अप / डाउन, बैकस्पेस, डेल, एफ कुंजी, आदि)? एक चरित्र और उसके स्थानांतरित संस्करण दोनों को दबाया जाना है? Ctrl + वर्ण के बारे में क्या? क्या नंबरों की चाबियां नियमित लोगों की तुलना में अलग-अलग होती हैं?
दरवाज़े

1
@Doorknob आप एक लैपटॉप के कीबोर्ड का उपयोग करते हुए चुनौती को पूरा नहीं कर सकते हैं जब तक कि इसके सभी 101 कुंजी यूएस मानक 101 कुंजी लेआउट द्वारा आवश्यक न हों
Eduard Florinescu

1
@ बीटा-क्षय इस सवाल को बंद करने वाले अधिकांश लोगों ने कभी नहीं पूछा कि वे इससे क्या समझते हैं इसलिए मेरे लिए अनुमान लगाना कठिन है।
एडुआर्ड फ्लोरिंसक्यू

जवाबों:


6

जावास्क्रिप्ट, 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 "कीकोड" की एक सरणी बनाता है। कुछ स्पष्ट रूप से लिखे गए हैं, कुछ अनुक्रम लूप के साथ जोड़े गए हैं और कुछ तार के रूप में संग्रहीत हैं। मेरे पास "डबल" कीकोड के लिए एक अलग सरणी है, क्योंकि उदाहरण के लिए बाएं और दाएं नियंत्रण एक ही कीकोड देते हैं। हालाँकि, वे एक स्थान भी देते हैं, इसलिए मैं कीकोड को स्थानों के साथ जोड़ देता हूं, जैसे कि ऐरे में स्ट्रिंग्स। वहाँ से यह सिर्फ एक घटनासूची है जो डिफ़ॉल्ट कीडाउन कार्यक्षमता को रोकता है (इस मामले में F5 के साथ ताज़ा नहीं करना चाहिए) और कीअप के लिए एक अलग आयोजक, क्योंकि कीनडाउन पर हर एक कुंजी का पता लगाया जा सकता है, PRINCSENEN के लिए EXCEPT।

प्रत्येक कीअप इवेंट के बाद शेष कुंजी (सरणी की लंबाई उर्फ) लॉग हो जाती है, साथ ही कीकोड का नाम (इसलिए बाएं और दाएं पारी के बीच अंतर है, आदि)। मुझे यकीन नहीं था कि अगर यह एक आवश्यकता थी, यदि आप स्कोर से एक और 10 बाइट्स घटा सकते हैं।

सीमाएं

  • यह केवल क्रोम में अच्छा काम करता है

मुझे आशा है कि यह उत्तर सराहा गया है और कृपया मुझे बताएं कि क्या मैंने कुछ गलत किया है।


5
PPCG में आपका स्वागत है!
22

क्या आप कुछ या सभी अर्धविरामों को बदलकर नई सूची में ला सकते हैं? यह आपकी बाइट गिनती में मदद नहीं करेगा, लेकिन इसे पढ़ना बहुत आसान होगा।
जॉर्डन

यहाँ एक संस्करण है कि pastebin.com/PE4anSFw
M4Y

4

जावा 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मामलों को संभालने के लिए टर्नरी असाइनमेंट के पहले कुछ स्तर जहां कुंजी कोड अस्पष्ट है (उदाहरण के लिए "होम" कुंजी, जो कीबोर्ड या नंबर पैड के मुख्य भाग से आ सकता है) और ऐसे मामले जहां एक ही कुंजी कई में मैप हो सकती है कुंजी कोड (उदाहरण के लिए नंबर लॉक के साथ या बंद नंबर पैड व्यवहार)। अंतिम शाखा "सामान्य" कुंजी संभालती है जिसका कुंजी कोड बस सेट में उपयोग किया जा सकता है। कुंजी कोड बिटमैप में अनुक्रमित होता है lजो इंगित करता है कि कुंजी मानक 101 में से एक है या नहीं।

सीमाएं

  • कार्यक्रम को 101 कीबोर्ड का परीक्षण करने और यह देखने में सक्षम होना चाहिए कि क्या प्रत्येक कुंजी काम करती है।

    यदि मानक 101 के अलावा किसी भी कुंजी को दबाया जाता है, तो स्टैक ट्रेस को मानक त्रुटि पर मुद्रित किया जा सकता है, या अप्रत्याशित व्यवहार हो सकता है।

  • प्रोग्राम सीधे कुंजी कोड स्थिरांक के संख्यात्मक मूल्यों का उपयोग करता है, और ओरेकल के KeyEventप्रलेखन से संकेत मिलता है कि ये मान समय के साथ बदल सकते हैं।

स्वीकृतियाँ

  • -10 बाइट्स केविन क्रूज़सेन को धन्यवाद

2
f.setVisible(1>0);का उपयोग नहीं किया जा सकता है f.show();और एक अप्रयुक्त पैरामीटर का उपयोग करके ()->गोल्फ किया जा सकता है । v->Void null
केविन क्रूजसेन

4

जावास्क्रिप्ट, 98 90 75 बाइट्स

इसलिए ... मुझे संदेह है कि मैं यहां चीजों से गुजर रहा हूं, लेकिन यह काम करना चाहिए। मुझे पता है कि अगर मैं चलो है कुछ भी अनदेखी की। केवल क्रोम में परीक्षण किया गया।

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-की-बोर्ड पर नहीं होती हैं, जैसे कि विंडोज की।
M4Y

1
@ M4Y, चुनौती की मेरी व्याख्या थी कि हम मानते हैं कि निर्दिष्ट कीबोर्ड का उपयोग किया जा रहा है, विशेष रूप से इस लाइन को दिया गया है: " यदि आपके पास एक लैपटॉप या कोई अन्य कीबोर्ड है जिसमें यूएस मानक 101 कीबोर्ड लेआउट नहीं है तो आप उसे पूरा नहीं कर सकते हैं। चुनौती जब तक आप एक संगत कीबोर्ड प्लग इन नहीं करते हैं। "
झबरा

यह काफी उचित है कि मुझे लगता है, चतुर समाधान!
M4Y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.