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)
我正在寻找一种不需要神奇分支和价值的算法.算法可能不存在,但我很有希望.