并击输入是什么?它与五笔、拼音有何异同?
目录:并击输入是什么?它与五笔、拼音有何异同?
本文首发于雪星实验室,编号("SNOLAB4807")
什么是并击输入?
如果你还不了解什么是并击,请先看看这些文章。
以及小仙并击的介绍
并击为何能够提速:
下文假设你已经了解什么是并击,如果还不了解请先看一下上面的介绍去了解一下。
动手实践体会并击
比如你可以尝试快速地,交替连续按键盘的某 2 个键,像这样
交替按下 j
和 f
键各 8 次:jfjfjfjfjfjfjfjf
,一共需要按下 16 次按键。
现在使用一种算法对它进行编码,用 df
同时按下来代替 f
,再用 jk
同时按下来代替 j
。
而当 dfjk
同时按下时,规定 f
在前 j
在后。
那么,dfjk
四键无论以何种顺序按下,都可以被解析为 jf
现在,试试同时按下 jd
fk
这 4 个键 8 次,像这样:
jfkddfjkdfjkdfkjfdjkdfkjdfjkdfjk
对比前面的例子,交替按键法需要按下16次按键,而并击方法则只需要按下8次按键,击键次数直接折半。 在这个例子中,按出的字母键多出一倍的同时,你会发现这样编码过之后的按键数量虽然有提升。
下面这一行由于不需要去管 jfdk
的顺序,这4个键可以在同一时间同时被按下,虽然你按下键的次数没有减少,但能够因为同时按下更多的键,所以就可以在相同的时间内输出更多的按键。
按键的反应时间
在 编码并击方案 - 简书 这篇文章中有提到
并击输入其实和传统单击输入方式击键速度上相差无几。最主要的原因是人的反应力有个知觉的阀限,按完一个键后,你的大脑要用一定的时间接受触觉信号再下达下一个要按的键的命令,这是影响击键的主要原因——人类的反应速度有限,即使是条件反射。
其中的原理就是你的左脑和右脑需要一个上一个键已经被按下了的反馈,才能很有自信地去按下下一个键。 如果估算神经反馈的时间在 100ms 的话,那么人脑的运动反馈频率大约在 10Hz 左右,
你也可以在这里测试一下你的反应时间(虽然这个测出来的时间跟最短正确按键间隔不大一样) Human Benchmark - Reaction Time Test
现有并击方案介绍
- 小仙并击方案:“小仙并击,采用可自由定制的并击方案,除了支持双拼之外,还能大大提升原五笔或者郑码等形码爱好者的输入效率。”
- 大千声韵方案:用户不需要讲究单字内的声母、介母、韵母的输入顺序
- 琴码速录:采用左声右韵的类双拼并击方案
- 宫保拼音:本方案使用左手食指、中指、無名指控制12枚聲母鍵,右手拇指、食指、中指、無名指控制11枚韻母鍵。不使用小指。 见: ComboPinyin · rime/home Wiki
按键信息熵理论极限计算
在计算之前,先列出一些常见的数据。
- 5:主键区,半行按键的数量,例如
12345
、67890
、qwert
、yuiop
、hjkl;
等 - 10:在主键区,像这样的一行
1234567890
或asdfghjkl;
可以认为有 10 个按键。 - 26:不区分大小写英文有 26 个字母
abcdefghijklmnopqrstuvwxyz
- 30:主键区,去掉数字键,可以有30个按键
- 40:主键区,包括数字键的 4 行按键,把它切出 10列 * 4行 的一块,一共有40个键
- 81:键盘
- 108:标准键盘按键数量
从二进制按键编码入手
首先考虑二进制,据本人胡乱抽样调查,大多数程序员都能用两只手从 0 数到 1023。 其原理可以参考百科: 二进制 - 维基百科,自由的百科全书
既然只用 10位的二进制数字就可以确定 1024 种状态的话,那么可以考虑它在并击上的应用。 从 1 到 10 位的二进制数字分别能代表的状态数量如下
2 4 8 16 32 64 128 256 512 1024
来看看它们可以干些什么
推广到三进制按键编码
假设左手左三指使用 qweasd
键来确定一个字母,那么一只手指可以有三种状态,分别是不按、按第一行 qwe
、按第二行 asd
。
这样仅三只手指就可以按到 种状态。其中全部不按的状态为空。
雪星的方案
提问:你是左撇子还是右撇子?你喜欢用左手一直撑着下巴,然后用右手打字?还是右手一直撑着下巴,左手打字?
一、对称行映射方案
雪星在这里实现了一个对称行映射方案的并击输入转换程序:
行映射规则解读如下: 同时按下的键 => 输出的键
- 对于单个键按下的情况,使其原有键位保持不变,原样输出。
- 对于多个键按下的情况,输出键盘另一边的对应位置的键。
映射关系见下表:
雪星并击左手编码:
1 => 1 |
2 => 2 |
3 => 3 |
4 => 4 |
5 => 5 |
q => q |
w => w |
e => e |
r => r |
t => t |
a => a |
s => s |
d => d |
f => f |
g => g |
z => z |
x => x |
c => c |
v => v |
b => b |
12 => 0 |
13 => 9 |
23 => 8 |
24 => 7 |
34 => 6 |
qw => p |
qe => o |
we => i |
wr => u |
er => y |
as => ; |
ad => l |
sd => k |
sf => j |
df => h |
zx => / |
zc => . |
xc => , |
xv => m |
cv => n |
雪星并击右手编码:
6 => 6 |
7 => 7 |
8 => 8 |
9 => 9 |
0 => 0 |
y => y |
u => u |
i => i |
o => o |
p => p |
h => h |
j => j |
k => k |
l => l |
; => ; |
n => n |
m => m |
, => , |
. => . |
/ => / |
78 => 5 |
79 => 4 |
89 => 3 |
08 => 2 |
09 => 1 |
ui => t |
uo => r |
io => e |
pi => w |
po => q |
jk => g |
jl => f |
kl => d |
;k => s |
;l => a |
m, => b |
m. => v |
,. => c |
/, => x |
/. => z |
雪星并击例子:
雪星并击英文输入:hello, world.
dfio =>he |
adl =>ll |
qe, =>o, |
wo =>wo |
rl =>rl |
d. =>d. |
he |
ll |
o, |
wo |
rl |
d. |
雪星并击微软双拼输入:我可以请你吃你喜欢的大餐,我可以陪你随处玩耍。
并击 | wo |
sdio |
eri |
q; |
cvi |
wei |
cvi |
xi |
dfuo |
dio |
dl; |
cj |
, |
wo |
sdio |
eri |
qw/. |
cvi |
s.m |
weu |
wj |
wrip |
|
映射 | wo |
ke |
yi |
q; |
ni |
ii |
ni |
xi |
hr |
de |
da |
cj |
, |
wo |
ke |
yi |
pz |
ni |
sv |
ii |
wj |
uw |
. |
输出 | 我 |
可 |
以 |
请 |
你 |
吃 |
你 |
喜 |
欢 |
的 |
大 |
餐 |
, |
我 |
可 |
以 |
陪 |
你 |
随 |
处 |
玩 |
耍 |
。 |
二、6键字母表并击方案
用 qweasd 6个键,每一列的键有3种状态,
比如拿 q a 这一列的按键来说,第1种状态是什么都不按,第2种状态是按下q,第3种状态是按下a, 那么6个键可以达到的按压状态数量就是,三的三次方也就是27,由于一个键都不按的状态是一种常态,所以6个按键按下的状态组合数量正好是26,
你也可以把它理解为一个3进制的计数法,把 aq sw de 分割为三位数字,当你按下a,s、d时,认为他们代表了所在位上的数字1,当按下 q w e 时,也就是对应位上的数字为2,当什么都不按的时候,对应位的数字为0。
下面来写一个简单的 Javascript 代码来,生成这些可能的组合。
// 定义按键
var charList = [' aq',' sw',' de'].map(e=>e.split(''))
// 计算它们的排列组合
var outall = []
for (let k = 0; k < 27; k++) {
var i = k;
var out = []
out.push(charList[0][ i % 3]); i = i / 3 | 0;
out.push(charList[1][ i % 3]); i = i / 3 | 0;
out.push(charList[2][ i % 3]); i = i / 3 | 0;
outall.push( out.join('') + '\t' + k.toString(3) + '\t' + k.toString(10))
}
// 输出
console.log(outall.join('\n'))
生成的结果表示如下(应该注意到它们的编码顺序有所不同)
按键 | 3进制编码 | 10进制 |
---|---|---|
0 | 0 | |
a | 1 | 1 |
q | 2 | 2 |
s | 10 | 3 |
as | 11 | 4 |
qs | 12 | 5 |
w | 20 | 6 |
aw | 21 | 7 |
qw | 22 | 8 |
d | 100 | 9 |
按键 | 3进制编码 | 10进制 |
---|---|---|
a d | 101 | 10 |
q d | 102 | 11 |
sd | 110 | 12 |
asd | 111 | 13 |
qsd | 112 | 14 |
wd | 120 | 15 |
awd | 121 | 16 |
qwd | 122 | 17 |
e | 200 | 18 |
a e | 201 | 19 |
按键 | 3进制编码 | 10进制 |
---|---|---|
q e | 202 | 20 |
se | 210 | 21 |
ase | 211 | 22 |
qse | 212 | 23 |
we | 220 | 24 |
awe | 221 | 25 |
qwe | 222 | 26 |
观察这张表,除了什么都不按的情况之外,一共有 26 种按下状态的组合,刚刚好可以编码英文26个字母。
并击编码在线尝试
参考文献 / 相关阅读资料
语言
拼音
- 一位匠人的中州韵——专访Rime输入法做者佛振 - 尚码园
- 看到日文键盘布局,想简要介绍一下宫保拼音 - 知乎
- 双拼:一天内就能掌握的高效拼音输入法 - 知乎
- 宮保拼音 combo pinyin kbcon - YouTube