Test des claviers

13

Mon problème

À mon lieu de travail actuel, je gère à moi seul (ok à deux parce que je ne manque aucun membre) environ 700 ordinateurs portables. En raison de la nature et de la fréquence de leur utilisation, je trouve souvent qu'ils sont retournés avec un peu de dégâts. Pour ce problème, ma principale préoccupation est lorsqu'un ordinateur portable est retourné avec un clavier cassé ou défunt. Lorsque le réparateur de matériel corrige ces claviers cassés, il devient nécessaire de les tester. Le test consiste à utiliser chaque ... et ... chaque ... seule ... clé. Quelle traînée à droite? Le problème est, parfois, je ne sais pas si j'ai tapé une clé ou non.

Une solution?

Écrivez un programme / script qui:

  1. Prend l'entrée de l'utilisateur
  2. Lors de la soumission (de la manière que vous jugez appropriée), détermine si chaque touche a été enfoncée.
  3. Sorties oui ou non ou de toute façon pour indiquer que j'ai réussi à appuyer sur toutes les touches ou non. (Indiquez dans votre réponse les deux sorties possibles si ce n'est pas quelque chose d'évident).

Hypothèses:

  1. Majuscule, minuscule, les deux? Quelle que soit la manière que vous jugerez appropriée. Tant que c'est [AZ], [az] ou [A-Za-z]. Il en va de même pour les chiffres et autres symboles. (Donc, si a =été tapé, +peu importe). Votre choix si vous souhaitez inclure des caractères décalés ou non.
  2. Vous n'avez pas à vous soucier des tabulations ou des espaces
  3. Pas besoin de touches de fonction, CTRL, ALT, Esc ou toute autre touche qui ne sort pas quelque chose à l'écran
  4. Cela suppose un clavier EN-US et les ordinateurs portables ne comprennent pas de pavé numérique.
  5. Indépendant du système d'exploitation, quelle que soit la langue que vous préférez
  6. Peu importe si la touche a été pressée plusieurs fois (lorsque le testeur devient paresseux et commence à casser le bouton comme s'il s'agissait de Mortal Kombat)

Voici un ensemble d'entrée potentiel qui retournerait vrai (ou oui, ou "vous l'avez fait!")

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

Le gagnant est déterminé par le moins de caractères.

SomeShinyObject
la source
Faut-il vérifier que chaque frappe apparaît au moins une fois ou exactement une fois?
xnor
@xnor, s'il apparaît plusieurs fois, c'est ok. J'ai mis à jour la question.
SomeShinyObject
1
D'accord, ça n'en vaut pas la peine.
nyuszika7h
1
@ChristopherW S'il s'agit d'un problème persistant pour vous, vous devriez consulter ce site Web keyboardtester.com .
gxtaillon
2
@MomemtumMori, cette main faisant la technique du clavier hollandais de Pennsylvanie dans la barre latérale? Totalement à moi.
SomeShinyObject

Réponses:

1

GolfScript, 6 octets

.&,94=

Si tous les caractères ASCII avec des codes entre 33 et 127 sont présents, il imprime 1. Sinon, il imprime 0.

Cette approche échouera si l'entrée contient d'autres caractères (y compris une nouvelle ligne finale), ce qui a été autorisé par l'OP et est également vrai pour la solution GolfScript existante.

Usage

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

Comment ça fonctionne

.&  # 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
la source
Le commentaire que vous avez lié ne dit pas que l'entrée ne contiendra pas de nouvelle ligne (ou d'autres caractères en dehors de 33-126), il dit simplement qu'elle ne contiendra que des caractères valides. La nouvelle ligne est-elle un caractère non valide?
aditsu quitte car SE est EVIL
Par valide, je voulais dire dans la gamme contre laquelle nous testons , mais je suppose que j'aurais dû m'exprimer plus clairement en demandant l'OP ...
Dennis
6

GolfScript, 11

L'ASCII imprimable n'est pas si intéressant…

127,32,-^,!

Rubis, 68

Avec drapeau -rsetpour 4 personnages.

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

et

Python 3, 76

print(set("`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./")==set(input()))
Ry-
la source
1
Je suggère de les publier dans deux réponses distinctes.
nyuszika7h
3

JavaScript - 62 70

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

Et un peu plus court:

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

CJam - 9

',33>q-!

Il vérifie également les caractères "décalés" (y compris les lettres majuscules).
Essayez-le sur http://cjam.aditsu.net/

Remarque: il y a un caractère invisible (avec le code 127) après l'apostrophe.

aditsu quitte parce que SE est MAL
la source
"Il vérifie également les caractères" décalés "(y compris les lettres majuscules)." Je dirais que c'est un comportement incorrect.
Ry-
@minitech "Votre choix si vous souhaitez inclure ou non des caractères décalés."
aditsu quitte car SE est EVIL le
Mais juste avant cela, il est écrit "Majuscule OU minuscule" (c'est exclusif, non?)
Ry-
@minitech, j'ai mis à jour la question. Pardon. Cette opération est trompeuse.
SomeShinyObject
@ChristopherW Mon programme affichera 0 sur votre exemple d'entrée, mais si vous appuyez également sur tous ces caractères tout en maintenant shift, il imprimera 1. Est-ce que ça va?
aditsu quitte car SE est EVIL le
2

PHP

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

$_GET['i'] est l'entrée

Alireza Fallah
la source
1
Utilisez $_GETpour enregistrer 1 caractère si cela est acceptable.
tomsmeding
@tomsmeding, ouais je l'ai fait :)
Alireza Fallah
Vous pouvez ajouter un caractère de remplissage (é ou quelque chose) à l'avant de votre chaîne et supprimer le !==falsepour enregistrer 8 caractères, puis les accolades pour 4 autres. register_globalsrend cela "é$i". die(NO)est également possible.
Ry-
@minitech - Je ne sais pas ce que tu dis, caractère de remplissage? n'hésitez pas à modifier ma réponse à la place
Alireza Fallah
1

Python 72:

f=lambda x:set(x)==set("`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./")
ɐɔıʇǝɥʇuʎs
la source
3
L'OP a demandé un programme qui accepte les entrées des utilisateurs.
nyuszika7h
1

Haskell, 41 (deux solutions)

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

ou (style sans point)

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

Besoin de saisir au moins ces caractères:

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

dans n'importe quel ordre, n'importe quel nombre de fois. Les caractères supplémentaires sont autorisés. Courez dans un interprète. Vous devez appuyer sur Entrée lorsque vous avez terminé, mais si vous appuyez sur Entrée avant d'avoir terminé, vous pouvez continuer à saisir des caractères et appuyer à nouveau sur Entrée. S'imprimera Truesi vous avez touché chaque caractère, sinon il n'imprimera rien.

YawarRaza7349
la source
0

Perl, 70 caractères

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

Usage:

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

Imprime 1 si toutes les frappes sont présentes, sinon n'imprime rien.

Zaid
la source
Requiert Perl 5.10+
Zaid
Dans la plupart des shells, votre exemple échouera car certains des caractères de la chaîne en écho nécessitent un échappement.
Dennis
0

C, 97 caractères

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

Besoin d'appeler le programme avec un argument contenant au moins les lettres:

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

et obtenez la réponse 1 (vrai). Le jeu de caractères peut être modifié en modifiant la valeur d'initialisation de a.

Franzzzzzzzz
la source