Keyboard Penguji

13

Masalahku

Di tempat kerja saya saat ini, saya seorang diri (ok dua orang karena saya tidak punya anggota badan) memelihara sekitar 700 laptop. Karena sifat dan frekuensi penggunaannya, saya sering menemukan mereka dikembalikan dengan sedikit kerusakan. Untuk masalah ini, perhatian utama saya adalah ketika laptop dikembalikan dengan keyboard yang rusak atau mati. Ketika tukang memperbaiki perangkat keras keyboard yang rusak ini, menjadi perlu untuk menguji mereka. Tes ini melibatkan penggunaan setiap ... dan ... setiap ... satu ... kunci. Apa yang benar? Masalahnya adalah, kadang-kadang saya lupa apakah saya mengetik kunci atau tidak.

Sebuah solusi?

Tulis program / skrip yang:

  1. Mengambil input pengguna
  2. Setelah pengiriman (dengan cara apa pun yang Anda anggap cocok), tentukan apakah setiap tombol ditekan.
  3. Keluaran ya atau tidak atau cara apa pun untuk menunjukkan bahwa saya berhasil menekan semua tombol atau tidak. (Tunjukkan dalam jawaban Anda dua kemungkinan keluaran jika itu bukan sesuatu yang jelas).

Asumsi:

  1. Huruf besar, huruf kecil, keduanya? Cara mana pun yang Anda anggap cocok. Asalkan [AZ], [az] atau [A-Za-z]. Sama halnya dengan angka dan simbol lainnya. (Jadi jika =diketik, +tidak masalah). Pilihan Anda jika Anda ingin memasukkan karakter yang digeser atau tidak.
  2. Anda tidak perlu khawatir tentang tab atau spasi
  3. Tidak perlu tombol fungsi, CTRL, ALT, Esc atau tombol lain yang tidak menampilkan sesuatu di layar
  4. Ini mengasumsikan keyboard EN-US dan laptop tidak termasuk numpad.
  5. OS agnostik, bahasa apa pun yang Anda suka
  6. Tidak masalah jika kunci telah ditekan beberapa kali (karena ketika penguji malas dan mulai menghancurkan tombol seperti Mortal Kombat)

Berikut adalah set input potensial yang akan mengembalikan true (atau ya, atau "Anda melakukannya!")

`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./

Pemenang ditentukan oleh jumlah karakter paling sedikit.

SomeShinyObject
sumber
Apakah kita perlu memeriksa bahwa setiap keystroke muncul setidaknya sekali atau tepat sekali?
xnor
@ xnor, Jika muncul beberapa kali, tidak apa-apa. Saya memperbarui pertanyaan.
SomeShinyObject
1
Baiklah kalau begitu, itu tidak sepadan.
nyuszika7h
1
@ChristopherW Jika ini adalah masalah yang sedang Anda alami, Anda harus mengunjungi situs web ini keyboardtester.com .
gxtaillon
2
@MememtumMori, tangan itu melakukan teknik keyboard Pennsylvania Belanda di bar samping? Sepenuhnya milikku.
SomeShinyObject

Jawaban:

1

GolfScript, 6 byte

.&,94=

Jika semua karakter ASCII dengan kode antara 33 dan 127 ada, ia mencetak 1. Jika tidak, ia mencetak 0.

Pendekatan ini akan gagal jika input berisi karakter lain (termasuk baris baru akhir), yang telah diizinkan oleh OP dan juga berlaku untuk solusi GolfScript yang ada.

Pemakaian

$ echo -n '!"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' |
> golfscript <(echo '.&,94=')
1

Bagaimana itu bekerja

.&  # Compute the intersection of the input string with itself. This removes duplicates.
,   # Compute the length of the resulting string.
94= # Push 1 if the length is 94, otherwise push 0.
Dennis
sumber
Komentar yang Anda tautkan tidak mengatakan bahwa input tidak akan berisi baris baru (atau karakter lain di luar 33-126), hanya mengatakan itu hanya akan berisi karakter yang valid. Apakah baris baru merupakan karakter yang tidak valid?
Aditsu berhenti karena SE adalah JAHAT
Secara valid yang saya maksudkan dalam rentang yang sedang kami uji , tapi saya kira saya seharusnya mengekspresikan diri saya lebih jelas ketika menanyakan OP ...
Dennis
6

GolfScript, 11

Printable ASCII tidak begitu menarik ...

127,32,-^,!

Ruby, 68

Dengan bendera -rsetuntuk 4 karakter.

p Set.new(?`..?z)+(?,..?9)+%w{[ ] \\ ; '}==Set.new(gets.split'')

dan

Python 3, 76

print(set("`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./")==set(input()))
Ry-
sumber
1
Saya sarankan memposting ini dalam dua jawaban terpisah.
nyuszika7h
3

JavaScript - 62 70

alert(!(47-prompt().match(/([',-\/\d;=a-z\[-\]`]?)(?!.*\1)/g).length))

Dan sedikit lebih pendek:

alert(!!prompt().match(/([',-\/\d;=a-z\[-\]`])(?!.*\1)/g)[46])
core1024
sumber
2

CJam - 9

',33>q-!

Itu memeriksa untuk karakter "bergeser" juga (termasuk huruf besar).
Cobalah di http://cjam.aditsu.net/

Catatan: ada karakter yang tidak terlihat (dengan kode 127) setelah tanda kutip.

aditsu berhenti karena SE adalah JAHAT
sumber
"Itu memeriksa karakter" bergeser "juga (termasuk huruf besar)." Saya akan mengatakan itu perilaku yang salah.
Ry-
@minitech "Pilihan Anda jika Anda ingin menyertakan karakter yang digeser atau tidak."
Aditsu berhenti karena SE adalah JAHAT
Tetapi tepat sebelum itu, tertulis "Huruf Besar ATAU Huruf Kecil" (itu eksklusif, bukan?)
Ry-
@minitech, saya memperbarui pertanyaan. Maaf. OR itu menyesatkan.
SomeShinyObject
@ChristopherW Program saya akan mencetak 0 pada input contoh Anda, tetapi jika Anda juga menekan semua karakter sambil menahan shift, itu akan mencetak 1. Apakah itu ok?
Aditsu berhenti karena SE adalah JAHAT
2

PHP

    foreach (str_split("`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./") as $v) {
        if (strpos($_GET['i'],$v)!==false)die(NO);
    }

$_GET['i'] adalah input

Alireza Fallah
sumber
1
Gunakan $_GETuntuk menyimpan 1 char jika itu dapat diterima.
tommeding
@tomsmeding, ya saya lakukan :)
Alireza Fallah
Anda dapat menambahkan karakter padding (é atau sesuatu) ke bagian depan string Anda dan menghapus !==falseuntuk menyimpan 8 karakter, kemudian menguatkan untuk 4 lebih. register_globalsmembuat ini "é$i". die(NO)itu juga mungkin.
Ry-
@minitech - Saya tidak tahu apa yang Anda katakan, karakter padding? silakan mengedit jawaban saya sebagai gantinya
Alireza Fallah
1

Python 72:

f=lambda x:set(x)==set("`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./")
ɐɔıʇǝɥʇu
sumber
3
OP meminta program yang mengambil input pengguna.
nyuszika7h
1

Haskell, 41 (dua solusi)

interact(\y->show$all(`elem`y)[' '..'`'])

atau (gaya point-free)

interact$show.(`all`[' '..'`']).flip elem

Harus memasukkan setidaknya karakter ini:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`

dalam urutan apa pun, berapa kali. Karakter tambahan diizinkan. Jalankan dalam penerjemah. Harus menekan Enter ketika Anda selesai, tetapi jika Anda menekan Enter sebelum Anda selesai, Anda dapat terus memasukkan karakter, dan tekan Enter lagi. Akan mencetak Truejika Anda menekan setiap karakter, jika tidak maka tidak akan mencetak apa pun.

YawarRaza7349
sumber
0

Perl, 70 karakter

say[sort grep!$s{$_}++,<>=~/\S/g]~~[sort"',-./;=[\]`"=~/./g,0..9,a..z]

Pemakaian:

echo `134223423567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./ | perl -E 'say[sort grep!$s{$_}++,pop=~/\S/g]~~[sort"',-./;=[\]`"=~/./g,0..9,a..z]'

Mencetak 1 jika semua penekanan tombol ada, yang lain tidak mencetak apa pun.

Zaid
sumber
Membutuhkan Perl 5.10+
Zaid
Pada sebagian besar shell, contoh Anda akan gagal karena beberapa karakter dalam string yang di-echo memerlukan pelarian.
Dennis
0

C, 97 karakter

main(long a,char**u){a=0xfb0000000750003d;for(u++;**u;a|=2L<<*(*u)++-39);a=48+!~a;write(1,&a,1);}

Perlu memanggil program dengan argumen yang berisi setidaknya surat-surat:

`1234567890-=AZERTYUIOPQSDFGHJKLMWXCVBN[]\;',./

dan dapatkan jawaban 1 (benar). Charset dapat diubah dengan mengubah nilai inisialisasi a.

Franzzzzzzzz
sumber