Тестування клавіатур


13

Моя проблема

На моєму теперішньому місці роботи я одноосібно (добре подвійно, бо мені не вистачає кінцівок) підтримую приблизно 700 ноутбуків. Через характер і частоту їх використання я часто виявляю, що вони повертаються з невеликою шкодою. З цієї проблеми моя головна стурбованість викликає повернення ноутбука зі зламаною або неіснуючою клавіатурою. Коли ремонтник обладнання виправить ці розбиті клавіатури, виникає необхідність протестувати їх. Тест передбачає використання кожної ... та ... кожної ... одиничної ... клавіші. Яке перетягування праворуч? Проблема полягає в тому, що іноді я втрачаю інформацію про те, якщо я набрав ключ чи ні.

Рішення?

Напишіть програму / сценарій, який:

  1. Бере введення користувача
  2. Після подання (будь-яким способом, який вважаєте за потрібне) визначає, чи була натиснута кожна клавіша.
  3. Виходить так чи ні або будь-яким способом вказує на те, що я успішно натискав усі клавіші, чи ні. (Укажіть у своїй відповіді два можливі результати, якщо це не щось очевидне).

Припущення:

  1. Великі, малі, обидва? Де б ви не вважали за потрібне. Поки це [AZ], [az] або [A-Za-z]. Те саме стосується цифр та інших символів. (Отже, якщо це =було введено, +значення не має). Ви хочете включити змінені символи чи ні.
  2. Вам не потрібно турбуватися про вкладки чи пробіли
  3. Не потрібно функціональних клавіш, CTRL, ALT, Esc або будь-яких інших клавіш, які нічого не виводять на екран
  4. Це передбачає клавіатуру EN-US, а ноутбуки не включають цифрову клавіатуру.
  5. OS агностик, якою б мову ви не хотіли
  6. Не має значення, чи натискали клавішу кілька разів (бо коли тестер просто лінивий і запускає кнопку розбиття, як це Mortal Kombat)

Ось потенційний вхідний набір, який би повернув істину (або так, або "Ви зробили це!")

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

Переможець визначається найменшою кількістю символів.


Чи потрібно перевіряти, чи кожен натискання клавіші з’являється хоча б раз або точно один раз?
xnor

@xnor, якщо вона з’являється кілька разів, це нормально. Я оновив питання.
SomeShinyObject

1
Добре тоді, цього не варто.
nyuszika7h

1
@ChristopherW Якщо це проблема, яка триває для вас, вам слід ознайомитись із цим веб-сайтом: keytestes.com .
gxtaillon

2
@MomemtumMori, що ця рука займається голландською технікою клавіатури Пенсильванії в бічній смузі? Повністю моя.
SomeShinyObject

Відповіді:


1

GolfScript, 6 байт

.&,94=

Якщо всі ASCII символи з кодами між 33 і 127 присутні, він друкує 1. В іншому випадку він друкує 0.

Цей підхід буде невдалим, якщо вхід містить інші символи (включаючи остаточний новий рядок), дозволений ОП, а також вірно для існуючого рішення GolfScript.

Використання

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

Як це працює

.&  # 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.

У коментарі, який ви зв'язали, не сказано, що введення не буде містити нову лінію (або інші символи поза межами 33-126), вона просто говорить, що вона буде містити лише дійсні символи. Чи є новий рядок недійсним символом?
aditsu кинь, тому що SE - EVIL

Під дійсним я мав на увазі в діапазоні, на який ми тестуємо , але, мабуть, я мав би висловитись більш чітко, коли просив ОП ...
Денніс

6

GolfScript, 11

Друк ASCII не так цікавий ...

127,32,-^,!

Рубі, 68

З прапором -rsetна 4 символи.

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

і

Пітон 3, 76

print(set("`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./")==set(input()))

1
Я б запропонував розмістити їх у двох окремих відповідях.
nyuszika7h

3

JavaScript - 62 70

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

І трохи коротше:

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

2

CJam - 9

',33>q-!

Він також перевіряє "зміщені" символи (включаючи великі літери).
Спробуйте це на веб-сайті http://cjam.aditsu.net/

Примітка: після апострофа є невидимий символ (з кодом 127).


"Він також перевіряє" зміщені "символи (включаючи великі літери)." Я б сказав, що це неправильна поведінка.
Ри-

@minitech "Ваш вибір, хочете ви включити зміщені символи чи ні".
aditsu кинути, тому що SE - EVIL

Але безпосередньо перед цим написано: «Пропис великої чи малої літери» (це ексклюзивно, правда?)
Ри-

@minitech, я оновив питання. Вибачте. Це АБО вводить в оману.
SomeShinyObject

@ChristopherW Моя програма надрукує 0 на вашому прикладі, але якщо ви також натиснете всі ці символи, утримуючи зміну, вона надрукує 1. Це все в порядку?
aditsu кинути, тому що SE - EVIL

2

PHP

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

$_GET['i'] є вхід


1
Використовуйте $_GETдля збереження 1 char, якщо це прийнятно.
tomsmeding

@tomsmeding, так, я :)
Аліреза Фалла

Ви можете додати символ накладки (é чи щось) на передню частину рядка та видалити, !==falseщоб зберегти 8 символів, а потім дужки для ще 4. register_globalsробить це "é$i". die(NO)також можливо.
Ри-

@minitech - Я не знаю, що ти кажеш, підкладний персонаж? не соромтесь редагувати мою відповідь
Alireza Fallah

1

Python 72:

f=lambda x:set(x)==set("`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./")

3
ОП запитувала програму, яка приймає введення користувача.
nyuszika7h

1

Хаскелл, 41 (два рішення)

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

або (стиль без точки)

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

Потрібно ввести принаймні ці символи:

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

у будь-якому порядку, у будь-яку кількість разів. Допускаються додаткові символи. Бігайте в перекладача. Потрібно натиснути Enter, коли ви закінчите, але якщо натисніть Enter, перш ніж закінчите, ви можете продовжувати вводити символи та знову натискати Enter. Буде надруковано, Trueякщо ви потрапили на кожного символу, інакше він нічого не надрукує.


0

Perl, 70 символів

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

Використання:

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

Друкує 1, якщо всі натискання клавіш присутні, в іншому нічого не друкується.


Потрібен Perl 5.10+
Заїд

У більшості оболонок ваш приклад завершиться невдачею, оскільки для деяких символів у відлуненому рядку потрібно втекти.
Денніс

0

C, 97 символів

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

Потрібно викликати програму з аргументом, що містить принаймні літери:

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

і отримати відповідь 1 (правда). Графік можна змінити, змінивши значення ініціалізації a.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.