如何在Python中查找移动对象的位置序列?

时间:2017-06-23 19:28:22

标签: python algorithm

我有一个最初位于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_maxx < x_min。因此,必须更正位置x5x6

在到达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_maxx_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

3 个答案:

答案 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