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.

SomeShinyObject
źródło
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.
Dennis
źródło
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()))
Ry-
źródło
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])
rdzeń 1024
źródło
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).

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
„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

Alireza Fallah
źródło
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,./")
.ıʇǝɥʇuʎs
źródło
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.

YawarRaza7349
źródło
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.

Zaid
źródło
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.

Franzzzzzzzz
źródło