【问题标题】:Generate all possible permutations of stenography keyboard?生成速记键盘的所有可能排列?
【发布时间】:2017-07-04 09:07:04
【问题描述】:

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

我希望从速记键盘生成所有可能的单个同时笔划: 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 个或更多键。

非常感谢任何帮助!

【问题讨论】:

  • 您在寻找什么输出,包含所有组合的文本文件?您是否要考虑“不可能”的组合(允许-SD、-TZ 的费城转变?)或者您只是想要基于您可以与每一侧进行的组合数量的计数/统计数据以及类似的东西?跨度>

标签: keyboard permutation


【解决方案1】:

我用 Python 编写了一个脚本,它将生成您想要的速记顺序组合。一些注意事项:

  • 这类似于一些Plover 代码,也是用Python 编写的。
  • 此代码将生成具有不可能组合的和弦(除非您使用 Philly shift,例如 -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))))

【讨论】:

  • 这几乎是我一生中见过的最令人印象深刻的事情。我们可以通过这里的答案推荐骑士吗?为了回答您的问题,这是为了实际使用 - 基本上是作为尚未定义的任何单个笔划的备份。感激不尽!
  • ? 没问题布鲁斯。奖励答案的最佳方式是“接受”它。见:stackoverflow.com/help/someone-answers
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 2012-05-05
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多