Test na sąsiednie litery

12

Jednym z aspektów testu siły hasła są przebiegi sąsiednich liter na klawiaturze. W tym wyzwaniu należy utworzyć program, który zwraca, truejeśli ciąg znaków zawiera jakiekolwiek ciągi sąsiednich liter.

Co liczy się jako ciąg sąsiednich liter?

W tej uproszczonej wersji testera siły hasła ciąg sąsiednich znaków to 3 lub więcej liter, które są obok siebie w jednym kierunku (w lewo, w prawo, powyżej lub poniżej) na klawiaturze QWERTY. Na potrzeby tego wyzwania układ klawiatury wygląda następująco:

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Na powyższym schemacie Qjest poniżej, 1ale nie poniżej 2, więc ciąg znaków, który zawiera 1qalub aq1gdziekolwiek w nim, spowoduje, że program zwróci true, ale 2qanie.

Wejście

Ciąg hasła do sprawdzenia. Będzie zawierać tylko znaki [0-9a-z]lub [0-9A-Z](twój wybór).

Wynik

Program musi zwrócić prawdziwą wartość, jeśli hasło zawiera jeden lub więcej przebiegów sąsiednich kluczy, lub falsey, jeśli nie zawiera żadnego.

Przykłady

Następujące dane wejściowe powinny generować wartość true:

  • asd
  • ytrewq
  • ju7
  • abc6yhdef

I te dane wejściowe powinny wyprowadzać false:

  • abc
  • aaa
  • qewretry
  • zse
  • qwdfbn
  • pas

Zasady

  • Odpowiedzi mogą być kompletnymi programami lub funkcjami.
  • Standardowe luki są niedozwolone.
  • To jest , wygrywa najniższy wynik (w bajtach)!
użytkownik 81655
źródło

Odpowiedzi:

3

Pyth - 66 62 60 bajtów

Całkiem proste podejście. Sprawdza, czy którykolwiek z podciągów len 3 znajduje się w którymkolwiek z obrotów klawiatury. Będzie używał podstawowego kodowania dla klawiatury.

.E}Rjb+J+Kc+jkS9"0
qwertyuiop
asdfghjkl
zxcvbnm"b.tKN_MJ.:z3

Pakiet testowy .

Maltysen
źródło
@ user81655 naprawiono i zapisano dwa bajty.
Maltysen
2

Japt , 78 bajtów

Japt to skrócona wersja Ja vaScri pt . Interpretator

V=1oA ¬+`0\nqØÆyuiop\n?dfghjkl \nzxcvbnm`;1+¡Y©(((VbX -VbUgY-1)-5 a -5 %A a)bB

Wyjścia 0dla przypadków falsey; w przeciwnym razie dodatnia liczba całkowita. ?Powinny zostać zastąpione przez niedrukowanego char Unicode U + 0086, lub jeśli nie chcesz iść do wszystkich, że kłopoty, po prostu as.

Jak to działa

V=1oA q +"0\nqwertyuiop\nasdfghjkl \nzxcvbnm";1+Um@Y&&(((VbX -VbUgY-1)-5 a -5 %A a)bB
           // Implicit: U = input string
V=1oA q    // Set variable V to the digits 1-9, plus
+"...";    // this string.
Um@        // Take U and map each character X and its index Y with this function:
Y&&        //  If Y is 0, return Y; otherwise,
VbX -      //  take the index of X in V, subtract
VbUgY-1    //  the index of (char at position Y - 1 in U) in V,
-5 a -5    //  subtract 5, take the absolute value, subtract 5 again,
%A a       //  take modulo by 10, then take the absolute value.
           //  This returns 1 for any pair of characters that is adjacent
           //  within V, horizontally or vertically.
bB +1      // Take the index of 11 in the result and add one.
           // Implicit: output last expression
ETHprodukcje
źródło
2

C #, 227

int h(string k){var q="1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM,1QAZ,2WSX,3EDC,4RFV,5TGB,6YHN,7UJM,8IK,9OL,";int i=0,j=0;for(;i<k.Length-2;i++)if((q+String.Concat(Enumerable.Reverse(q))).Contains(k.Substring(i,3)))j=1;return j;}

0 to falsey, 1 to prawda. Skonsolidowano wszystkie klucze w poziomie i pionie oraz odwrócono i sprawdza, czy zawiera którykolwiek z 3 znaków wejściowych.

C # jest bardzo gadatliwy, muszę zagłębić się w inne języki :(

noisyass2
źródło
0

PHP, 173 + 1 bajtów

while(~$argn[$i+2])($p=preg_match)($r=_.join(".{10}",str_split(($t=substr($argn,$i++,3))))."|$t"._,$d=_1234567890_qwertyuiop_asdfghjkl__zxcvbnm)||$p($r,strrev($d))?die(1):0;

Uruchom jako potok z -nRmałymi literami lub wypróbuj online .

Tytus
źródło
0

Clojure, 156 bajtów

#(some(set(for[R[["1234567890""QWERTYUIOP""ASDFGHJKL.""ZXCVBNM..."]]R[R(apply map list R)]r R p(partition 3 1 r)p((juxt seq reverse)p)]p))(partition 3 1 %))

Było to dość interesujące zadanie do zrealizowania.

NikoNyrh
źródło