Testowanie klawiatur


13

Mój problem

W moim obecnym miejscu pracy samotnie (ok dwuręcznie, bo brakuje mi kończyn) utrzymuję około 700 laptopów. Ze względu na charakter i częstotliwość ich używania często stwierdzam, że są zwracane z niewielkimi obrażeniami. W przypadku tego problemu moim głównym problemem jest zwrot laptopa z uszkodzoną lub niedziałającą klawiaturą. Gdy mechanik naprawi uszkodzone klawiatury, konieczne będzie ich przetestowanie. Test obejmuje użycie każdego ... i ... każdego ... pojedynczego ... klucza. Co za trud, prawda? Problem polega na tym, że czasami tracę orientację, czy wpisałem klucz, czy nie.

Rozwiązanie?

Napisz program / skrypt, który:

  1. Pobiera dane od użytkownika
  2. Po przesłaniu (w dowolny sposób, który uznasz za odpowiedni), określa, czy naciśnięto każdy klawisz.
  3. Zwraca tak lub nie lub w jakikolwiek sposób wskazujący, że albo udało mi się nacisnąć wszystkie klawisze, albo nie. (Podaj w swojej odpowiedzi dwa możliwe wyniki, jeśli nie jest to oczywiste).

Założenia:

  1. Wielkie, małe litery, oba? Niezależnie od tego, co uznasz za stosowne. O ile jest to [AZ], [az] lub [A-Za-z]. To samo dotyczy liczb i innych symboli. (Więc jeśli =został wpisany, +nie ma znaczenia). Twój wybór, jeśli chcesz uwzględnić przesunięte znaki, czy nie.
  2. Nie musisz się martwić o tabulatory lub spacje
  3. Nie ma potrzeby używania klawiszy funkcyjnych, CTRL, ALT, Esc ani żadnych innych klawiszy, które nie wyświetlają czegoś na ekranie
  4. Zakłada się klawiaturę EN-US, a laptopy nie zawierają klawiatury numerycznej.
  5. Niezależnie od systemu operacyjnego, niezależnie od preferowanego języka
  6. Nie ma znaczenia, czy klawisz został naciśnięty wiele razy (na przykład, gdy tester staje się leniwy i zaczyna pękać przyciskami, jakby to był Mortal Kombat)

Oto potencjalny zestaw danych wejściowych, który zwróciłby wartość true (lub tak lub „Zrobiłeś to!”)

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

Zwycięzca jest określany przez najmniejszą liczbę znaków.


Czy musimy sprawdzić, czy każde naciśnięcie klawisza pojawia się co najmniej raz czy dokładnie raz?
xnor

@ xnor, Jeśli pojawia się wiele razy, jest w porządku. Zaktualizowałem pytanie.
SomeShinyObject

1
Okej, to nie jest tego warte.
nyuszika7h

1
@ChristopherW Jeśli jest to ciągły problem, powinieneś zajrzeć na tę stronę keyboardtester.com .
gxtaillon

2
@MememtumMori, czy ta ręka wykonuje technikę klawiatury holenderskiej w Pensylwanii na pasku bocznym? Całkowicie moje.
SomeShinyObject

Odpowiedzi:


1

GolfScript, 6 bajtów

.&,94=

Jeśli wszystkie znaki ASCII o kodach od 33 do 127 są obecne, drukuje 1. W przeciwnym razie drukuje 0.

To podejście zakończy się niepowodzeniem, jeśli dane wejściowe zawierają inne znaki (w tym końcowy nowy wiersz), co zostało dozwolone przez OP i jest prawdą również w przypadku istniejącego rozwiązania GolfScript.

Stosowanie

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

Jak to działa

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

Komentarz, który podłączyłeś, nie mówi, że dane wejściowe nie będą zawierać nowego wiersza (ani innych znaków poza 33-126), po prostu mówi, że będzie on zawierał tylko prawidłowe znaki. Czy znak nowej linii jest nieprawidłowym znakiem?
Aditsu zakończyło się, ponieważ SE to EVIL

Przez prawidłowy miałem na myśli zakres, w którym testujemy , ale chyba powinienem wyrazić się wyraźniej, pytając OP ...
Dennis

6

GolfScript, 11

ASCII do wydruku nie jest aż tak interesujące…

127,32,-^,!

Ruby, 68

Z flagą -rsetna 4 znaki.

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

i

Python 3, 76

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

1
Proponuję zamieścić je w dwóch osobnych odpowiedziach.
nyuszika7h

3

JavaScript - 62 70

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

I nieco krótszy:

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

2

CJam - 9

',33>q-!

Sprawdza również „przesunięte” znaki (w tym wielkie litery).
Wypróbuj na http://cjam.aditsu.net/

Uwaga: po apostrofie znajduje się niewidoczny znak (z kodem 127).


„Sprawdza również„ przesunięte ”znaki (w tym wielkie litery).” Powiedziałbym, że to nieprawidłowe zachowanie.
Ry-

@minitech „Twój wybór, jeśli chcesz uwzględnić przesunięte znaki, czy nie”.
Aditsu zakończyło się, ponieważ SE to EVIL

Ale tuż przed tym jest napisane „wielkie lub małe litery” (to ekskluzywne, prawda?)
Ry-

@minitech, zaktualizowałem pytanie. Przepraszam. To OR wprowadza w błąd.
SomeShinyObject

@ChristopherW Mój program wypisze 0 na przykładowym wejściu, ale jeśli naciśniesz wszystkie te znaki, przytrzymując Shift, wydrukuje 1. Czy to w porządku?
Aditsu zakończyło się, ponieważ SE to EVIL

2

PHP

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

$_GET['i'] jest wejściem


1
Użyj, $_GETaby zapisać 1 znak, jeśli jest to dopuszczalne.
tomsmeding

@tomsmeding, yeah zrobiłem :)
Alireza Fallah

Możesz dodać znak dopełniający (é lub coś) z przodu łańcucha i usunąć, !==falseaby zapisać 8 znaków, a następnie nawiasy klamrowe na 4 kolejne. register_globalssprawia to "é$i". die(NO)jest również możliwe.
Ry-

@minitech - Nie wiem, co mówisz, znak padding? Zamiast tego możesz edytować moją odpowiedź
Alireza Fallah,

1

Python 72:

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

3
OP poprosił o program, który pobiera dane od użytkowników.
nyuszika7h

1

Haskell, 41 (dwa rozwiązania)

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

lub (styl bez punktów)

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

Musisz wprowadzić przynajmniej następujące znaki:

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

w dowolnej kolejności, dowolną liczbę razy. Dodatkowe znaki są dozwolone. Uruchom tłumacza. Musisz nacisnąć Enter, gdy skończysz, ale jeśli naciśniesz Enter przed zakończeniem, możesz nadal wprowadzać znaki i ponownie nacisnąć Enter. Wydrukuje, Truejeśli trafisz każdą postać, w przeciwnym razie nic nie wydrukuje.


0

Perl, 70 znaków

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

Stosowanie:

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

Drukuje 1, jeśli wszystkie klawisze są obecne, w przeciwnym razie nic nie drukuje.


Wymaga Perla 5.10+
Zaid

W większości powłok przykład nie powiedzie się, ponieważ niektóre znaki w ciągu echa wymagają zmiany znaczenia.
Dennis

0

C, 97 znaków

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

Musisz wywołać program z argumentem zawierającym co najmniej litery:

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

i uzyskaj odpowiedź 1 (prawda). Zestaw znaków można zmienić, zmieniając wartość inicjalizacji a.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.