我有一个最初位于x_min = 0
的对象(一行中的一个点)。每次d_t
,对象都会根据这组值d_t
移动d_t = {1, 2, 3, 4, 5, 6}
个单位。因此,在第一次之后,对象将位于x1 = 0 + d_1 = 1
位置。第二次之后,对象将位于x2 = x1 + d_2 = 3
位置。第三次之后,对象将位于x3 = x2 + 3 = 6
位置。第四次之后,对象将位于x4 = x3 + 4 = 10
位置。第五次之后,对象将位于x5 = x4 + 5 = 15
位置,第六次之后,对象将位于x6 = x5 + 6 = 21
位置。
但是,x_max = 11
有限制。因此,该对象不能处于任何位置x > x_max
或x < x_min
。因此,必须更正位置x5
和x6
。
在到达x5
之前,该对象位于x4 = 10
,并且将在下次移动5
单位。自x_max = 11
起,对象可以进一步移动1
单位,然后必须向后移动4
单位。因此,它将位于x5 = 10 + 1 - 4 = 7 < x_max
位置。现在,该对象将向后移动6
个单位。因此,x6 = 7 - 6 = 1 > x_min
。
最后,我们得到位置0, 1, 3, 6, 10, 7, 1
的序列。
我想编写一个Python代码来查找此序列,给定x_max
,x_min
和集合d_t
。
我试图这样做,我从这段代码开始,但未能继续。
x_min = 0
x_max = 11
x = x_min
for d_t in range(1, 7):
if d_t + x <= x_max:
x = x + d_t
else:
x = 2 * x_max - x - d_t
答案 0 :(得分:2)
import operator
def positions(xMin, xMax, dx):
pos = xMin
yield pos
ops = [operator.add, operator.sub]
direction = 0
for d in dx:
pos = ops[direction](pos, d)
if xMin <= pos <= xMax:
yield pos
continue
direction = (direction+1)%2
pos = ops[direction]([xMin, xMax][pos>xMax], [xMin-pos, pos-xMax][pos>xMax])
yield pos
输出:
>>> print(*positions(0, 11, [1,2,3,4,5,6]))
0 1 3 6 10 7 1
答案 1 :(得分:1)
无论立方体移动什么。只是以不同的方式思考并使其更容易获得。
d_t = {1, 2, 3, 4, 5, 6}
XX=[]
x_min = 0
x_max = 11
x = x_min
for d_t in range(1, 7):
x += d_t
XX.append(x)
LL=list(range(1,12))+sorted(list(range(1,11)), key=int, reverse=True)
[LL[i-1] for i in XX]
Out[17]: [1, 3, 6, 10, 7, 1]
答案 2 :(得分:1)
您需要有一些方法来跟踪您的方向。在下面的代码中,我使用sign
。当sign
为+1时,我们前进,当它为-1时,我们会后退。当我们查看xmax
或更低xmin
时,我们需要撤消sign
。
xmin, xmax = 0, 11
d_t = [1, 2, 3, 4, 5, 6, 7, 8]
x = xmin
sign = 1
for d in d_t:
x += sign * d
if x > xmax:
x = 2 * xmax - x
sign = -sign
if x < xmin:
x = 2 * xmin - x
sign = -sign
print(d, x)
<强>输出强>
1 1
2 3
3 6
4 10
5 7
6 1
7 6
8 8