Prueba de teclados


13

Mi problema

En mi lugar actual de empleo, solo (solo con dos manos porque no me faltan extremidades) mantengo aproximadamente 700 computadoras portátiles. Debido a la naturaleza y frecuencia de su uso, a menudo encuentro que son devueltos con un poco de daño. Para este problema, mi principal preocupación es cuando una computadora portátil se devuelve con un teclado roto o apagado. Cuando el reparador de hardware repara estos teclados rotos, se hace necesario probarlos. La prueba implica el uso de cada ... y ... cada ... tecla ... individual. ¿Qué arrastre, verdad? El problema es que a veces pierdo el rastro de si escribí una tecla o no.

¿Una solución?

Escriba un programa / script que:

  1. Toma la entrada del usuario
  2. Tras el envío (de la forma que considere adecuada), determina si se presionó cada tecla.
  3. Emite sí o no o cualquier forma de indicar que o bien tuve éxito al presionar todas las teclas o no. (Indique en su respuesta las dos salidas posibles si no es algo obvio).

Suposiciones

  1. ¿Mayúsculas, minúsculas, ambas? De cualquier forma que consideres adecuada. Siempre que sea [AZ], [az] o [A-Za-z]. Lo mismo ocurre con los números y otros símbolos. (Entonces, si =se escribió,+ no importa). Su elección si desea incluir caracteres desplazados o no.
  2. No necesita preocuparse por pestañas o espacios
  3. No necesita teclas de función, CTRL, ALT, Esc ni ninguna otra tecla que no muestre algo en la pantalla
  4. Esto supone un teclado EN-US y las computadoras portátiles no incluyen un teclado numérico.
  5. Sistema operativo independiente, cualquier idioma que prefiera
  6. No importa si la tecla se ha presionado varias veces (para cuando el probador simplemente se vuelve flojo y comienza a romper el botón como si fuera Mortal Kombat)

Aquí hay un conjunto de entrada potencial que devolvería verdadero (o sí, o "¡Lo hiciste!")

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

El ganador está determinado por el menor número de caracteres.


¿Necesitamos verificar que cada pulsación de tecla aparezca al menos una vez o exactamente una vez?
xnor

@xnor, si aparece varias veces, está bien. Actualicé la pregunta.
SomeShinyObject

1
Bien entonces, eso no vale la pena.
nyuszika7h

1
@ChristopherW Si este es un problema continuo para usted, debería echar un vistazo a este sitio web keyboardtester.com .
gxtaillon

2
@MomemtumMori, esa mano haciendo la técnica de teclado holandés de Pennsylvania en la barra lateral? Totalmente mio.
SomeShinyObject

Respuestas:


1

GolfScript, 6 bytes

.&,94=

Si todos los caracteres ASCII con códigos entre 33 y 127 están presentes, imprime 1. De lo contrario, imprime 0.

Este enfoque fallará si la entrada contiene otros caracteres (incluida una nueva línea final), lo que ha sido permitido por el OP y también es cierto para la solución GolfScript existente.

Uso

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

Cómo funciona

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

El comentario que vinculó no dice que la entrada no contendrá una nueva línea (u otros caracteres fuera de 33-126), solo dice que solo contendrá caracteres válidos. ¿Newline es un carácter no válido?
Aditsu renunció porque SE es MAL

Por válido me refería al rango en el que estamos probando , pero supongo que debería haberme expresado más claramente al preguntar al OP ...
Dennis

6

GolfScript, 11

Imprimir ASCII no es tan interesante ...

127,32,-^,!

Rubí, 68

Con bandera -rsetpara 4 personajes.

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

y

Pitón 3, 76

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

1
Sugeriría publicar esto en dos respuestas separadas.
nyuszika7h

3

JavaScript - 62 70

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

Y un poco más corto:

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

2

CJam - 9

',33>q-!

Comprueba también los caracteres "desplazados" (incluidas las letras mayúsculas).
Pruébalo en http://cjam.aditsu.net/

Nota: hay un carácter invisible (con código 127) después del apóstrofe.


"Comprueba también los caracteres" desplazados "(incluidas las letras mayúsculas)". Yo diría que es un comportamiento incorrecto.
Ry-

@minitech "Tu elección si quieres incluir caracteres desplazados o no".
Aditsu renunció porque SE es MALO

Pero justo antes de eso, dice "mayúsculas o minúsculas" (eso es exclusivo, ¿verdad?)
Ry-

@minitech, actualicé la pregunta. Lo siento. Eso O es engañoso.
SomeShinyObject

@ChristopherW Mi programa imprimirá 0 en su entrada de ejemplo, pero si también presiona todos esos caracteres mientras mantiene presionada la tecla Mayús, imprimirá 1. ¿Está bien?
Aditsu renunció porque SE es MALO

2

PHP

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

$_GET['i'] es la entrada


1
Use $_GETpara guardar 1 char si es aceptable.
tomsmeding

@tomsmeding, sí lo hice :)
Alireza Fallah

Puede agregar un carácter de relleno (é o algo) al frente de su cadena y eliminarlo !==falsepara guardar 8 caracteres, luego las llaves para 4 más. register_globalshace que este "é$i". die(NO)También es posible.
Ry-

@minitech - No sé lo que dices, personaje de relleno? siéntase libre de editar mi respuesta en su lugar
Alireza Fallah

1

Python 72:

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

3
El OP solicitó un programa que tome la entrada del usuario.
nyuszika7h

1

Haskell, 41 (dos soluciones)

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

o (estilo sin puntos)

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

Necesita ingresar al menos estos caracteres:

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

en cualquier orden, cualquier cantidad de veces. Se permiten caracteres adicionales. Ejecutar en un intérprete. Debe presionar Enter cuando haya terminado, pero si presiona Enter antes de terminar, puede seguir ingresando caracteres y presionar Enter nuevamente. Se imprimirá Truesi golpeó a cada personaje, de lo contrario no imprimirá nada.


0

Perl, 70 caracteres.

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

Uso:

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

Imprime 1 si están presentes todas las pulsaciones de teclas, de lo contrario no imprime nada.


Requiere Perl 5.10+
Zaid

En la mayoría de los shells, su ejemplo fallará ya que algunos de los caracteres en la cadena con eco requieren escapar.
Dennis

0

C, 97 caracteres

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

Necesita llamar al programa con un argumento que contenga al menos las letras:

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

y obtenga la respuesta 1 (verdadero). El juego de caracteres se puede cambiar cambiando el valor de inicialización de a.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.