生成所有可能的速记键盘排列?

时间:2017-07-04 09:07:05

标签: keyboard permutation

提前道歉,因为我对这里发生的事情一无所知,但这似乎是要问的地方......

我希望从速记键盘中生成所有可能的单个同步笔画: https://en.wikipedia.org/wiki/Stenotype#Keyboard_layout

速记键盘包含23个键 - 主要22:

STKPWHRAO*EUFRPBLGTSDZ

如果没有包含AO * EU键,则在其位置使用连字符,因此此序列的所有排列也是必要的:

STKPWHR-FRPBLGTSDZ

第23个键是数字栏,它改变了一些键,因此这些键的排列虽然是单独的,但也会有所帮助:

#12K3W4RAT50*EU6R7B8G9SDZ
#12K3W4R-6R7B8G9SDZ

在单个同时按键中,任何按键将始终按上述顺序识别;他们要么被选中,要么被忽略了。例如,如果包含“Z”,它将始终是任何排列的最后一个键。我正在尝试生成所有可能的排列,包括单个键的排列。

键盘中间的连字符或星号有助于区分键盘两侧的键(S,T,P,R)。例如,对于单个按键,您可以在键盘左侧列出“T-”,在键盘右侧列出“-T”。键盘的整个左岸将是“STKPWHR-”;整个右岸都是“-FRPBLGTSDZ”。

我天真地假设有一种简单的方法可以在线生成这个,但是......我以前错了。从我能够找到的,主要的障碍似乎是按顺序保持角色。我可以轻松删除任何重复项,其中有四个序列中有许多重复项。

即使是涉及23个最多10个键的排列也是一个巨大的帮助;很难同时使用15个或更多的密钥。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我在Python中编写了一个脚本,它会像你想要的那样生成steno顺序的组合。一些说明:

  • 这类似于一些Plover代码,也是用Python编写的。
  • 此代码将生成具有不可能组合的和弦(除非您使用费城移位,例如-SD,-TZ,-TSD,-SDZ等)。
  • 我还包括数字栏输出。

有很多组合......用1到10个键的和弦我得到了1,698,159个结果。对于1到23,有8,388,606种可能的和弦。

Here are the possible chords with 1 to 10 keys(请注意,由于数据量很大,此页面会缓慢加载。)

以下是我用来生成此文件的脚本:

from itertools import combinations
steno_order = (
    '#', 'S-', 'T-', 'K-', 'P-', 'W-', 'H-', 'R-',
    'A', 'O', '*', 'E', 'U',
    '-F', '-R', '-P', '-B', '-L', '-G', '-T', '-S', '-D', '-Z',
)
steno_to_number ={
    'S-': '1-',
    'T-': '2-',
    'P-': '3-',
    'H-': '4-',
    'A': '5',
    'O': '0',
    '-F': '-6',
    '-P': '-7',
    '-L': '-8',
    '-T': '-9',
}

def combinations_of_steno_order(min_keys, max_keys):
    assert min_keys < max_keys, 'Chord size must increase'
    for i in range(min_keys, max_keys):
        for chord in combinations(steno_order, i):
            shortform = ''
            add_hyphen = True
            if chord[0] == '#':
                # Convert to numbers if number bar is pressed.
                chord = [steno_to_number.get(steno_key, steno_key) for steno_key in chord]
            for steno_key in chord:
                if steno_key == '#':
                    shortform += steno_key
                elif steno_key[-1] == '-':
                    # Left-hand
                    shortform += steno_key[0]
                elif steno_key[0] == '-':
                    # Right-hand
                    if add_hyphen:
                        shortform += '-'
                        add_hyphen = False
                    shortform += steno_key[1]
                else:
                    # Center key
                    add_hyphen = False
                    shortform += steno_key
            yield shortform

print('\n'.join(list(combinations_of_steno_order(1, 10))))