求算法生成这个数字表

Ana*_*Ana 6 python algorithm design-patterns

我正在寻找一种方法来生成以下系列数字,给出左侧的版本号.例如,给定"2",生成[6,18].这一系列的数字来自这里.

 V2  6  18
 V3  6  22
 V4  6  26
 V5  6  30
 V6  6  34
 V7  6  22  38
 V8  6  24  42
 V9  6  26  46
V10  6  28  50
V11  6  30  54
V12  6  32  58
V13  6  34  62
V14  6  26  46  66
V15  6  26  48  70
V16  6  26  50  74
V17  6  30  54  78
V18  6  30  56  82
V19  6  30  58  86
V20  6  34  62  90
V21  6  28  50  72   94
V22  6  26  50  74   98
V23  6  30  54  78  102
V24  6  28  54  80  106
V25  6  32  58  84  110
V26  6  30  58  86  114
V27  6  34  62  90  118
V28  6  26  50  74   98  122
V29  6  30  54  78  102  126
V30  6  26  52  78  104  130
V31  6  30  56  82  108  134
V32  6  34  60  86  112  138
V33  6  30  58  86  114  142
V34  6  34  62  90  118  146
V35  6  30  54  78  102  126  150
V36  6  24  50  76  102  128  154
V37  6  28  54  80  106  132  158
V38  6  32  58  84  110  136  162
V39  6  26  54  82  110  138  166
V40  6  30  58  86  114  142  170
Run Code Online (Sandbox Code Playgroud)

为了给出这些数字实际上是什么的上下文,这里引用了最初绘制它们的规范(ISO-18004):

对齐图案对称地定位在从符号的左上角到右下角的对角线的两侧.它们在时序图案和符号的相对侧之间尽可能均匀地间隔开,在时序图案和符号内部中的第一对准图案之间容纳任何不均匀的间隔.

因此,有一个原始方法/算法生成这些数字.

我已经提出了以下Python代码,它生成了正确的序列,但在if语句中表达了V32的"异常"条件.

import math

def pattern(ver):
    w = 21 + ((ver - 1) * 4)       # Width
    h = 6                          # First item
    t = (w - 1) - 6                # Last item
    r = t - h                      # Distance between first and last
    n = math.ceil(r/28)            # Number of items in list - 1

    if (w == 145):
        intervals = 26             # Anomaly
    else:
        intervals = math.ceil(r/n) # Ceiling to nearest multiple of 2
        intervals = intervals + (intervals % 2)

    xs = [t]
    for m in (n-1) * [intervals]: xs.append(xs[-1] - m)
    xs.append(h)
    return list(reversed(xs))

for n in range(2, 41):
    print("Version {:2d}: {}".format(n, pattern(n)))
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种不需要神奇分支和价值的算法.算法可能不存在,但我很有希望.