Klavyenin tüm tuşlarını kontrol edin


14

Basılacak Standart 101 tuşlu ABD Klavyesi * ' nin her tuşunu bekleyen en kısa programı yazın ve ardından Tamam yazmayı bırakın !

Bir tuşa her basıldığında, program yeni bir satırda tüm tuşa en az bir kez basılana kadar basılması gereken kalan benzersiz tuşların sayısını gösterir. Program 101 klavyeyi test edebilmeli ve her tuşun çalışıp çalışmadığını görmelidir. Bu nedenle, bir tuşa veya enter tuşuna iki kez basmak, kullanıcıya belirtildiği sürece izin verilir.

Aynı tuşa iki kez veya daha fazla basılması, kodu bozmamalı veya görüntülenmemiş kalan tuşların sayısını değiştirmemelidir.

Tüm anahtarlar ( Left Shift, Right Shift, Right Control, Esc, Enter, vb) dahil edilmelidir.

Gerçek klavye tuşları (şimdiye programın perspektifinden bu meydan önemlidir Ave aaynıdır ve bu yüzden vardır, 6ve ^).

Birleşik tuşlar birleşik komut olarak kaydedilmez ve yalnızca Ctrl+ Alt+ Deltuşuna basılırsa, basılan kombinasyondaki tüm tek tek tuşlar için geçerli olacak ayrı tuşlar kaydedilir. Bu yüzden, küçük harflere zaten bastıysanız, büyük harflere de basmaya gerek yoktur.

Onlar hala sona program için basılmalıdır ihtiyaç vardır böylece bir dizüstü veya olmayan herhangi başka klavyeniz varsa sayısal tuş takımında Sayısal tuşlar, programın perspektifinden farklıdır ABD Standardı 101 klavye düzeni sizi uyumlu bir klavye eklemediğiniz sürece bu sorunu çözemezsiniz.

* Bu zorluğu yapılabilir kılmak için Fn tuşu ve dizüstü bilgisayar tuşu olan klavyeler desteklenmeyecektir

ABD Standart 101 klavye düzeni için tuşların listesi:

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
Her tuşa basıldıktan sonra Enter / Return tuşuna basılmasını zorunlu tutuyor musunuz? Değilse, bu birçok dilde imkansızdır.
Kapı Tokmağı

5
Anahtar listesi lütfen!
feersum

2
Ayrıca, program yazdırılamayan ASCII'yi de destekliyor mu? (örn. Escape, Sekme, Ctrl, Shift, Alt, Ekle, ok tuşları, Caps Lock, Ana Sayfa, Son, Sayfa Yukarı / Aşağı, Geri Al, Del, F tuşları vb.)? Bir karaktere ve onun kaydırılmış versiyonuna basılması gerekiyor mu? Ctrl + bir karakter ne olacak? Sayısal tuşlar normal tuşlardan farklı mı sayılıyor?
Kapı Tokmağı

1
@Doorknob ABD Standart 101 tuş düzeni için gereken 101 tuşun tamamı yoksa, dizüstü bilgisayarın klavyesini kullanarak bu zorluğu
gideremezsiniz

1
@ beta-decay Bu soruyu kapatan insanların çoğu asla ondan ne anlamadıklarını sordular, bu yüzden tahmin etmek zor.
Eduard Florinescu

Yanıtlar:


6

Javascript, 524 bayt

Merhaba, bu benim buradaki ilk yazım, bu yüzden bazı şeyler hakkında hala cahil olduğum için affedersiniz, sanırım kuralların içinde kaldım.

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

Ben Chrome kullanın yok, ama bunu deneyebilirsiniz eğer arabası görünüyor burada . (F12'nin varsayılan işlevselliği engellendiği için örnek penceresine odaklanmadan önce konsolu açtığınızdan emin olun)

genel bakış

Program tüm 101 "anahtar kodları" bir dizi yapar. Bazıları açıkça yazılır, bazı diziler bir for döngüsü ile eklenir ve bazıları dizeler olarak saklanır. Sol ve sağ kontrol örneğin aynı anahtar kodu vermek beri "çift" anahtar kodları için ayrı bir dizi var. Onlar da bir konum vermek, ancak, böylece anahtar dizeleri dizeleri olarak konumları ile birleştirin. Oradan sadece varsayılan tuş kilidi işlevselliğini (bu durumda F5 ile yenilemek istemezsiniz) önleyen bir olay listeleyicisi ve keyup için ayrı bir olay listeleyicisi vardır, çünkü her bir tuş tuş basımında, PRINTSCREEN İÇİN DIŞINDA.

Her bir keyup olayından sonra, kalan anahtarlar (dizinin uzunluğu olarak da bilinir) yanı sıra anahtar kodunun adı kaydedilir (böylece sol ve sağ kaydırma vb. Arasında ayrım yapılır). Bunun bir gereklilik olup olmadığından emin değildim, eğer değilse başka bir 10 bayt çıkarabilirsiniz.

Sınırlamalar

  • Yalnızca Chrome'da iyi çalışıyor gibi görünüyor

Umarım bu cevap takdir edilir ve yanlış bir şey yaptıysam lütfen bana bildirin.


5
PPCG'ye Hoşgeldiniz!
FantaC

Noktalı virgüllerin bir kısmını veya tamamını satırsonuna çevirebilir misiniz? Bayt sayınıza yardımcı olmaz, ancak okunması çok daha kolay olacaktır.
Ürdün

İşte daha kolay okunan bir versiyon pastebin.com/PE4anSFw
M4Y

4

Java 8, 607 + 64 = 671 bayt

Bu, kullanılmayan bir parametre alan ve fırlayan bir lambdadır InterruptedException. Odaklandığında 101 standart tuşa basmayı engelleyen bir pencere başlatır. Bayt sayısı lambda ve gerekli ithalatı içerir.

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

Burada golf edilmemiş versiyona sahip bir test sınıfı bulabilirsiniz .

genel bakış

Tuşlara basıldığında, onları benzersiz şekilde tanımlayan değerler (çoğu durumda anahtar kodu) bir kümede saklanır. Üçlü atamanın c, anahtar kodunun belirsiz olduğu durumlarda (örneğin, klavyenin ana bölümünden veya sayısal tuş takımından gelebilecek "Ev" tuşu) ve aynı tuşun birden çokla eşleştirilebildiği vakaları işlemek için ilk birkaç düzey tuş kodları (örn. Num Lock açık veya kapalı iken sayısal tuş takımı davranışı). Son dal, anahtar kodu kümede kullanılabilen "normal" anahtarları işler. Anahtar kodu l, anahtarın standart 101'den biri olup olmadığını gösteren bitmap'e endekslenir .

Sınırlamalar

  • Program 101 klavyeyi test edebilmeli ve her tuşun çalışıp çalışmadığını görmelidir.

    Standart 101 dışında bir tuşa basılırsa, standart hataya göre yığın izlemesi yazdırılabilir veya beklenmeyen davranışlar ortaya çıkabilir.

  • Program doğrudan anahtar kodu sabitlerinin sayısal değerlerini kullanır ve Oracle'ın KeyEventbelgeleri bu değerlerin zaman içinde değişebileceğini gösterir.

Teşekkür

  • Kevin Cruijssen sayesinde -10 bayt

2
f.setVisible(1>0);için golfed edilebilir f.show();ve ()->üzere golfed edilebilir v->kullanarak kullanılmayan bir Void nullparametre .
Kevin Cruijssen

4

JavaScript, 98 90 75 bayt

Yani ... sanırım burada bir şeyler düşünüyor olabilirim ama bu işe yaramalı. Ben bana bildirin gelmiş bir şey gözardı. Yalnızca Chrome'da test edildi.

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

Dene

alert akıl sağlığınız ve kaydırmanızdan tasarruf etmek için tersine çevrilmiş siparişiniz için geçersiz kılınmıştır.

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>


Göz ardı ettiğiniz bir şey, 101 tuşlu klavyede olmayan tuşlara, Windows tuşları gibi bastığınızda da geriye doğru sayılmasıdır.
M4Y

1
@ M4Y, zorluğa ilişkin yorumum, özellikle şu satır göz önüne alındığında, belirtilen klavyenin kullanılan şey olduğunu varsaymamızdı: " ABD Standart 101 klavye düzenine sahip olmayan bir dizüstü bilgisayarınız veya başka bir klavyeniz varsa, uyumlu bir klavye
Shaggy

sanırım bu yeterince adil, zekice bir çözüm!
M4Y
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.