Teclados de teste


13

Meu problema

No meu local de trabalho atual, eu, sozinho (ok em parte porque não tenho membros), mantenho aproximadamente 700 laptops. Devido à natureza e frequência de seu uso, muitas vezes acho que eles são devolvidos com alguns danos. Para esse problema, minha principal preocupação é quando um laptop é retornado com um teclado quebrado ou desativado. Quando o reparador de hardware corrige esses teclados quebrados, torna-se necessário testá-los. O teste envolve o uso de cada ... e ... cada ... única ... chave. Que arrasto certo? O problema é que, às vezes, eu perco o controle se digito uma chave ou não.

Uma solução?

Escreva um programa / script que:

  1. Recebe entrada do usuário
  2. Após o envio (da maneira que você julgar adequada), determina se cada tecla foi pressionada.
  3. Emite sim ou não ou alguma maneira de indicar que eu consegui pressionar todas as teclas ou não. (Indique na sua resposta as duas saídas possíveis, se não for algo óbvio).

Premissas:

  1. Maiúsculas, minúsculas, ambas? Qualquer que seja a maneira que você considere adequada. Contanto que seja [AZ], [az] ou [A-Za-z]. O mesmo acontece com números e outros símbolos. (Portanto, se =foi digitado, +não importa). Sua escolha se você deseja incluir caracteres deslocados ou não.
  2. Você não precisa se preocupar com guias ou espaços
  3. Não há necessidade de teclas de função, CTRL, ALT, Esc ou qualquer outra tecla que não produza algo na tela
  4. Isso pressupõe um teclado EN-US e os laptops não incluem um teclado numérico.
  5. SO independente do idioma que você preferir
  6. Não importa se a tecla foi pressionada várias vezes (quando o testador fica preguiçoso e começa a pressionar o botão como se fosse Mortal Kombat)

Aqui está um conjunto de entradas em potencial que retornaria verdadeiro (ou sim, ou "Você conseguiu!")

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

O vencedor é determinado pelo menor número de caracteres.


Precisamos verificar se cada pressionamento de tecla aparece pelo menos uma vez ou exatamente uma vez?
xnor

@ xnor, se aparecer várias vezes, tudo bem. Eu atualizei a pergunta.
SomeShinyMonica

1
Ok, então, isso não vale a pena.
usar o seguinte código

1
@ChristopherW Se esse é um problema contínuo para você, consulte este site keyboardtester.com .
precisa saber é o seguinte

2
@MomemtumMori, aquela mão fazendo a técnica de teclado holandês da Pensilvânia na barra lateral? Totalmente minha.
SomeShinyMonica

Respostas:


1

GolfScript, 6 bytes

.&,94=

Se todos os caracteres ASCII com códigos entre 33 e 127 estiverem presentes, ele imprimirá 1. Caso contrário, ele imprimirá 0.

Essa abordagem falhará se a entrada contiver outros caracteres (incluindo uma nova linha final), permitidos pelo OP e também para a solução GolfScript existente.

Uso

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

Como 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.

O comentário que você vinculou não diz que a entrada não conterá uma nova linha (ou outros caracteres fora de 33-126), apenas diz que conterá apenas caracteres válidos. Newline é um caractere inválido?
aditsu encerrou porque SE é MAU

Por válida eu quis dizer na faixa Estamos testando contra , mas eu acho que deveria ter me expressado de forma mais clara quando perguntar ao OP ...
Dennis

6

GolfScript, 11

ASCII imprimível não é tão interessante…

127,32,-^,!

Ruby, 68

Com bandeira -rsetpara 4 caracteres.

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

e

Python 3, 76

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

1
Sugiro postá-los em duas respostas separadas.
precisa saber é o seguinte

3

JavaScript - 62 70

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

E um pouco mais curto:

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

2

CJam - 9

',33>q-!

Ele verifica também os caracteres "deslocados" (incluindo letras maiúsculas).
Experimente em http://cjam.aditsu.net/

Nota: existe um caractere invisível (com o código 127) após o apóstrofo.


“Ele também verifica os caracteres" deslocados "(incluindo letras maiúsculas)." Eu diria que esse comportamento é incorreto.
precisa saber é

@minitech "Sua escolha se você deseja incluir caracteres deslocados ou não."
aditsu saiu porque SE é MAU 07/07

Mas bem antes disso, ele diz que “maiúscula ou minúscula” (que é exclusivo, né?)
Ry-

@ Minitech, atualizei a pergunta. Desculpe. Essa sala de operações é enganosa.
SomeShinyMonica

@ChristopherW Meu programa imprimirá 0 em sua entrada de exemplo, mas se você também pressionar todos esses caracteres enquanto mantém pressionada a tecla Shift, ele imprimirá 1. Está tudo bem?
aditsu saiu porque SE é MAU 07/07

2

PHP

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

$_GET['i'] é a entrada


1
Use $_GETpara salvar 1 caractere se for aceitável.
tomsmeding

@tomsmeding, sim eu fiz :)
Alireza Fallah

Você pode adicionar um caractere de preenchimento (é ou algo assim) à frente da sua corda e remover o !==falsepara salvar 8 caracteres e, em seguida, os suportes para mais 4. register_globalsfaz isso "é$i". die(NO)também é possível.
Ry-

@ minitech - Eu não sei o que você diz, personagem de preenchimento? sinta-se à vontade para editar minha resposta
Alireza Fallah


1

Haskell, 41 (duas soluções)

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

ou (estilo sem ponto)

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

É necessário inserir pelo menos esses caracteres:

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

em qualquer ordem, qualquer número de vezes. Caracteres extras são permitidos. Execute em um intérprete. É necessário pressionar Enter quando terminar, mas se você pressionar Enter antes de terminar, poderá continuar digitando os caracteres e pressione Enter novamente. Será impresso Truese você acertar todos os caracteres, caso contrário, não 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 se todas as teclas estiverem presentes, caso contrário, não imprime nada.


Requer Perl 5.10+
Zaid

Na maioria dos shells, seu exemplo falhará, já que alguns dos caracteres na sequência de eco exigem escape.
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);}

É necessário chamar o programa com argumento que contenha pelo menos as letras:

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

e obtenha a resposta 1 (verdadeira). O conjunto de caracteres pode ser alterado alterando o valor de inicialização de a.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.