Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php QWERTY键盘的助记密码生成算法_Php_Algorithm_String_Keyboard_Qwerty - Fatal编程技术网

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)
生成一系列符合您的长度和“易于键入”要求的关键位置,然后使用用户当前的关键地图将这些索引重新映射为字符。

对计算进行了大量研究,其中包括:

  • 手指移动距离
  • 手、手指和划船处罚
  • 笔划路径
他们的研究成果是键盘布局,这是一个非常复杂的问题

但是,它是从您想要的内容向后写的-他们的目标是基于输入找到更好的键盘布局,但是您正在尝试基于键盘布局找到简单的输入

所以,即使你可能无法直接使用它,我认为你