キーボードのすべてのキーを確認します


14

標準101キーUSキーボード*のすべてのキーが押されるのを待ってから、OKの書き込みを終了する最短のプログラムを作成します。

キーが押されるたびに、プログラムは新しい行に、すべてのキーが少なくとも1回押されるまで押される必要がある押されていない一意のキーの残りの数を表示します。プログラムは101キーボードをテストし、すべてのキーが機能するかどうかを確認できる必要があります。したがって、キーまたはEnterを2回押すことは、ユーザーに指定されている限り許可されます。

同じキーを2回以上押しても、コードが中断したり、表示されている残りの押されていないキーの数が変わったりすることはありません。

すべてのキー(Left ShiftRight ShiftRight ControlEscEnter、など)が含まれなければなりません。

実際のキーボードのキーは、(そのプログラムの観点から、この課題において重要であるAa同じであり、そうしている、6^)。

結合されたキーは結合されたコマンドとして登録されず、Ctrl+ Alt+ Delが押された場合、個々のキーのみが登録され、押された組み合わせの個々のキーすべてがカウントされます。そのため、すでに小文字を押している場合、大文字を押す必要はありません。その逆も同様です。

数字キーパッドの数字キーはプログラムの観点とは異なるため、ラップトップまたはUS Standard 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キーを押す必要がありますか?そうでない場合、これは多くの言語で不可能です。
ドアノブ

5
キーのリストをお願いします!
feersum

2
また、プログラムは非印刷可能ASCIIをサポートする必要がありますか?(例:エスケープ、タブ、Ctrl、Shift、Alt、挿入、矢印キー、Caps Lock、Home、End、Page Up / Down、Backspace、Del、Fキーなど)?キャラクターとそのシフトバージョンの両方を押す必要がありますか?Ctrl +文字はどうですか?テンキーのキーのカウントは通常のものとは異なりますか?
ドアノブ

1
それは米国標準101個のキーが必要とするすべての101のキーレイアウトしていない限り、あなたはノートパソコンのキーボードを使用しての挑戦を満たすことができない@Doorknob
エドゥアルトFlorinescu

1
@ beta-decayこの質問を閉じた人々のほとんどは、彼らがそれから何を理解していないか尋ねなかったので、私が推測するのは難しいです。
エデュアルドフロリネスク

回答:


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個すべての「キーコード」の配列を作成します。一部は明示的に記述され、一部はforループで追加され、一部は文字列として保存されます。たとえば、左右のコントロールが同じキーコードを提供するため、「ダブル」キーコード用の個別の配列があります。ただし、これらは場所も提供するため、キーコードと配列内の文字列としての場所を組み合わせます。そこからは、デフォルトのキーダウン機能(この場合はF5で更新したくない)を防ぐイベントリスナーと、キーアップで個別のイベントリスナーを使用します。

すべてのキーアップイベントの後、残りのキー(別名配列の長さ)とキーコードの名前が記録されます(そのため、左シフトと右シフトなどが区別されます)。それが要件であるかどうかはわかりませんでした。そうでなければ、スコアからさらに10バイトを差し引くことができます。

制限事項

  • Chromeでのみうまくいくようです

この回答に感謝し、何か間違ったことをした場合はお知らせください。


5
PPCGへようこそ!
ファンタ

セミコロンの一部またはすべてを改行に変更できますか?バイトカウントには役立ちませんが、読みやすくなります。
ヨルダン

ここで読むためにはるかに簡単だバージョンだ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の1つであるかどうかを示すビットマップにインデックスを付けます。

制限事項

  • プログラムは101キーボードをテストし、すべてのキーが機能するかどうかを確認できる必要があります。

    標準101以外のキーが押されると、スタックトレースが標準エラーに出力されるか、予期しない動作が発生する場合があります。

  • プログラムは、キーコード定数の数値を直接使用します。OracleのKeyEventドキュメントは、これらの値が時間とともに変化する可能性があることを示しています。

謝辞

  • Kevin Cruijssenのおかげで-10バイト

2
f.setVisible(1>0);golfedことができるf.show();()->するgolfedすることができますv->使用することによって、未使用のVoid nullパラメータを
ケビン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>


見落とされがちなことの1つは、Windowsのキーのように101キーのキーボード上にないキーを押すとカウントダウンすることです。
M4Y

1
@ M4Y、チャレンジの私の解釈は、指定されたキーボードが使用されているものであると仮定することでした。特に次の行を考えてみてください: " ラップトップまたはUS Standard 101キーボードレイアウトを持たない他のキーボードをお持ちの場合、実現できない互換性のあるキーボードをプラグインしない限り、課題です。 "
シャギー

それは十分に公平だと思う、賢い解決策!
M4Y
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.