相邻字母测试


12

密码强度测试的一个方面是键盘上相邻字母的排列。在此挑战中,必须创建一个程序,该程序将在true字符串包含相邻字母的任何运行时返回。

什么算作一系列相邻的字母?

对于此简化版的密码强度测试仪,相邻字符的连续字符为3个或更多字母,它们在QWERTY键盘上沿单个方向(左,右,上方或下方)彼此相邻。出于此挑战的目的,键盘的布局如下所示:

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

在上图中,Q在下面1但不在下面2,因此包含1qa或其中aq1任何地方的字符串会使程序返回true,但2qa不会。

输入值

要检查的密码字符串。它仅包含字符[0-9a-z][0-9A-Z](您的选择)。

输出量

如果密码包含一个或多个相邻键运行,则程序必须返回真实值;如果密码不包含相邻键,则该程序必须返回false。

例子

以下输入应输出true:

  • asd
  • ytrewq
  • ju7
  • abc6yhdef

这些输入应输出false:

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

规则

  • 答案可能是完整的程序或功能。
  • 不允许出现标准漏洞。
  • 这是,最低分(以字节为单位)获胜!

Answers:


3

Pyth- 66 62 60字节

非常简单的方法。检查子字符串len 3是否在键盘的任何旋转中。将对键盘使用基本编码。

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

测试套件


@ user81655已修复,保存了两个字节。
Maltysen,2015年

2

Japt,78个字节

JaptJa vaScri pt的缩写。口译员

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

0虚假案件的输出;否则为正整数。本?应与非打印字符的Unicode U + 0086来代替,或者如果你不想去所有的麻烦,只是as

怎么运行的

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

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为假,1为真。将所有键水平和垂直并反转,并检查其中是否包含3个输入字符中的任何一个。

C#非常冗长,必须深入其他语言:(


0

PHP,173 + 1个字节

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;

-nR使用小写输入作为管道运行,或在线尝试


0

Clojure,156个字节

#(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 using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.