Тестирование клавиатуры

13

Моя проблема

На моем нынешнем месте работы я в одиночку (хорошо, двуручный, потому что у меня нет конечностей) обслуживаю около 700 ноутбуков. Из-за характера и частоты их использования, я часто обнаруживаю, что они возвращаются с небольшим ущербом. В связи с этой проблемой меня больше всего беспокоит возвращение ноутбука со сломанной или неисправной клавиатурой. Когда ремонтник оборудования исправляет эти сломанные клавиатуры, возникает необходимость их тестировать. Тест включает использование каждого ... и ... каждого ... отдельного ... ключа. Какое право тянуть? Проблема в том, что иногда я теряю счет, набрал ли я ключ или нет.

Решение?

Напишите программу / скрипт, который:

  1. Принимает пользовательский ввод
  2. После отправки (любым способом, который вы считаете нужным) определяет, была ли нажата каждая клавиша.
  3. Выводит да или нет или каким-либо образом указывать, что я успешно нажал все клавиши или нет. (Укажите в своем ответе два возможных выхода, если это не очевидно).

Предположения:

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

Вот потенциальный набор входных данных, который вернул бы true (или да, или «Вы сделали это!»)

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

Победитель определяется по наименьшему количеству символов.

SomeShinyObject
источник
Нужно ли проверять, что каждое нажатие клавиши появляется хотя бы один раз или ровно один раз?
xnor
@xnor, если он появляется несколько раз, все в порядке. Я обновил вопрос.
SomeShinyObject
1
Хорошо, тогда это того не стоит.
nyuszika7h
1
@ChristopherW Если это нерешенная проблема для вас, вы должны взглянуть на этот сайт keyboardtester.com .
gxtaillon
2
@MomemtumMori, та рука, которая использует технику раскладки клавиатуры Пенсильвании в боковой панели? Полностью мое.
SomeShinyObject

Ответы:

1

GolfScript, 6 байт

.&,94=

Если присутствуют все символы ASCII с кодами от 33 до 127, выводится 1. В противном случае выводится 0.

Этот подход потерпит неудачу, если ввод содержит другие символы (включая заключительный перевод строки), что было разрешено OP и также верно для существующего решения 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), он просто говорит, что он будет содержать только допустимые символы. Является ли символ новой строки недопустимым символом?
Адицу ушел, потому что SE это ЗЛО
Под действительным я имел в виду диапазон, с которым мы тестируем , но, полагаю, мне следовало бы выразить себя более четко, задавая ОП ...
Деннис
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])
core1024
источник
2

CJam - 9

',33>q-!

Он также проверяет наличие «сдвинутых» символов (включая заглавные буквы).
Попробуйте это на http://cjam.aditsu.net/

Примечание: после апострофа есть невидимый символ (с кодом 127).

уйти, потому что SE это зло
источник
«Он также проверяет наличие« сдвинутых »символов (включая заглавные буквы)». Я бы сказал, что это неправильное поведение.
Ry-
@minitech "Ваш выбор, если вы хотите включить сдвинутые символы или нет."
Aditsu уйти, потому что SE зла
Но прямо перед этим написано «Прописные ИЛИ строчные буквы» (это эксклюзив, верно?)
Ry-
@minitech, я обновил вопрос. Сожалею. Это ИЛИ вводит в заблуждение.
SomeShinyObject
@ChristopherW Моя программа напечатает 0 на вашем примере ввода, но если вы также нажмете все эти символы, удерживая Shift, она напечатает 1. Это нормально?
Aditsu уйти, потому что SE зла
2

PHP

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

$_GET['i'] это вход

Алиреза Фалла
источник
1
Используйте, $_GETчтобы сохранить 1 символ, если это приемлемо.
Томсминг
@ tomsmeding, да, я сделал :)
Алиреза Фалла
Вы можете добавить символ вставки (é или что-то) в начало строки и удалить, !==falseчтобы сохранить 8 символов, затем фигурные скобки для еще 4. register_globalsделает это "é$i". die(NO)тоже возможно.
Ry-
@minitech - я не знаю, что вы говорите, символ заполнения? не стесняйтесь редактировать мой ответ вместо этого
Алиреза Фалла
1

Python 72:

f=lambda x:set(x)==set("`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./")
ɐɔıʇǝɥʇuʎs
источник
3
ОП попросил программу, которая принимает пользовательский ввод.
nyuszika7h
1

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

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

или (бессмысленный стиль)

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

Необходимо ввести хотя бы эти символы:

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

в любом порядке, любое количество раз. Допускаются дополнительные символы. Беги в переводчике. Должен нажать Enter, когда закончите, но если вы нажмете Enter до того, как закончите, вы можете продолжать вводить символы и снова нажать Enter. Напечатает, Trueесли вы нажали на каждого персонажа, иначе ничего не напечатает.

YawarRaza7349
источник
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.

Franzzzzzzzz
источник