Php QWERTY键盘的助记密码生成算法
我有一个“密码生成”功能,它是这样的:Php QWERTY键盘的助记密码生成算法,php,algorithm,string,keyboard,qwerty,Php,Algorithm,String,Keyboard,Qwerty,我有一个“密码生成”功能,它是这样的: function Mnemonic($mnemonic) { $result = null; $charset = array(str_split('aeiou', 1), str_split('bcdfghjklmnpqrstvwxyz', 1)); for ($i = 1; $i <= $mnemonic; $i++) { $result .= $charset[$i % 2][array_ran
function Mnemonic($mnemonic)
{
$result = null;
$charset = array(str_split('aeiou', 1), str_split('bcdfghjklmnpqrstvwxyz', 1));
for ($i = 1; $i <= $mnemonic; $i++)
{
$result .= $charset[$i % 2][array_rand($charset[$i % 2])];
}
return $result;
}
函数助记符($助记符)
{
$result=null;
$charset=array(str_split('aeiou',1),str_split('bcdfghjklmnpqrstvwxyz',1));
对于($i=1;$i也许您可以使用一些启发式方法来衡量“键入的容易程度”
例如,考虑下一个角色移动手指的成本。这可以是手指需要移动的距离,哪个方向等等。
当需要交换手指或手时,您还可以增加额外费用
在稍微考虑一下成本后,您可能会找到一个令人满意的解决方案
希望有帮助。您可以消除所有用戒指和小指(q、w、x、z、p)键入的字符,然后吐出左手和右手键入的字符,并在这些字母之间交替。构建一个表示键盘的数据结构,并对用于键入每个字符的行、列、手和手指进行编码。编写一个函数,该函数在显示字符时提供“下一步易于键入”列表字符,基于您开发的灵活规则。它可能依赖于另一个计算关键点之间距离的函数
就我个人而言,我并不觉得用同一只手打字两次会很慢:只有在前一个字母使用的手指太近时才很难打字。例如,XQ很难打字,因为我的手必须向上移动才能处理相邻的手指来打字。但我一点也不觉得BQ很难打字,因为我的食指我的小指还在做B,我的小指可以指向Q
输入AW也比输入QS容易得多,因为无名指较长,因此当小指位于A上时,自然适合于W,处于接近静止的位置,而QS需要小指伸展和同时的、相互冲突的无名指肌肉紧缩
如果你开始建立一个每个字母与另一个字母的对应图,你很快就会找到一种合理的方法来表示各个方面的难易程度。概括我的XQ/BQ示例,你可以进行一行更改,需要两个或更多手指的距离,两行更改需要三个手指的距离,以及三行更改(可能是数字)需要换手
我还注意到WD和IL之间的距离比SE和KO之间的距离稍长,这也会改变难度,因为键的位置稍有参差不齐
通过一些分析(我建议使用Excel来“规划”键入难度),我确信您可以想出一种算法,帮助您构建易于键入的单词
如果可能的话,试着输入至少一个数字,并考虑使用空格。
< P>伟大的问题-根据上面的建议,这里有一个从密钥i到密钥j:的距离的公式。
重量=距离*a+开关*b+相同*c+移位*d+怪异*e+启动*f
距离是一个值,其他值为0/1
距离-在QWERTY键盘上叠加一个精细网格,查找x,y
并计算距离。距离具有正权重。如果字母组合使用不同的手(例如aj、sk、wu…),则距离为零
开关-负重;开关良好
相同-aq、qa、az、za使用相同的手指。相同为阳性
移位-任何移位都是积极的,而且非常糟糕
奇怪-我不知道$or~不好,因为你得看看键盘
开始-asdfjkl开始或结束。可能是消极的&好的,因为你的手指在那里休息
系数-只要相对值看起来合理,就可以将其重新设置为开始。
如果你真的想让别人输入几十组数字,就用秒表拟合回归模型
实现-假设我们有一个六个字符的密码
现在我需要以每个字母开头的六个字符的最小值。想象一列中的N个键的数组。现在想象六列。您的最短密码是通过这六列的最短路径(允许循环)。您可能需要添加一些逻辑来消除循环,但这应该是一个很好的第一步。(我在这里越来越懒了——可能有一个图论公式可以处理这个问题。)
我敢打赌,以前有人做过这件事,尤其是击键部分。如果您实现了这一点,请在确定“成本”时考虑用户的区域设置从一个字符移动到另一个字符的过程。如果用户使用不同的键盘布局,则易于键入的密码可能会变得相当麻烦。如果不需要额外的修改键(shift、meta等),在一种语言的键盘上可能无法使用某些易于访问的键
为了保持这种想法的普遍性,我建议忽略哪个字符属于哪个键,而将键视为具有行和列的数组。每一行通常比前一行偏移大约键宽度的1/3。考虑到这一点,计算任意两个键之间的距离应该不难:
# Key at top left corner is {0, 0}
key1 @ {x1, y1}
key2 @ {x2, y2}
xdistance = absolute_value(x2 - x1)
ydistance = absolute_value(y2 - y1)
if y1 > y2
xdistance += (1/3 * ydistance)
else
xdistance -= (1/3 * ydistance)
total_distance = square_root(xdistance^2 + ydistance^2)
生成一系列符合您的长度和“易于键入”要求的关键位置,然后使用用户当前的关键地图将这些索引重新映射为字符。对计算进行了大量研究,其中包括:
- 手指移动距离
- 手、手指和划船处罚
- 笔划路径
他们的研究成果是键盘布局,这是一个非常复杂的问题
但是,它是从您想要的内容向后写的-他们的目标是基于输入找到更好的键盘布局,但是您正在尝试基于键盘布局找到简单的输入
所以,即使你可能无法直接使用它,我认为你