2017-06-23 13 views
1

私は最初に位置x_min = 0にあるオブジェクト(行の中の点)を持っています。 d_tの各時刻に、オブジェクトはこの値のセットに従ってd_t単位を移動します。d_t = {1, 2, 3, 4, 5, 6}したがって、最初の後、オブジェクトは位置x1 = 0 + d_1 = 1になります。 2回目の後、オブジェクトは位置x2 = x1 + d_2 = 3になります。 3回目の後、オブジェクトは位置x3 = x2 + 3 = 6になります。 4回目の後、オブジェクトは位置x4 = x3 + 4 = 10になります。 5回目の後、オブジェクトは位置x5 = x4 + 5 = 15になり、6回目の後にオブジェクトは位置x6 = x5 + 6 = 21になります。Pythonで動くオブジェクトの位置の順序を見つけるには?

ただし、制限はx_max = 11です。したがって、オブジェクトはどの位置にもありませんx > x_maxまたはx < 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のシーケンスを取得します。

x_max,x_min、およびセットd_tと与えられたこのシーケンスを見つけるためのPythonコードを書いておきたいと思います。

私はそれをやろうとしていましたが、このコードから始めましたが、続行できませんでした。

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 
+1

だから、あなたの質問は正確には何ですか? –

+1

問題点は何ですか?十分に簡単だと思われる? –

+1

また、用語 "set"、つまり "set' d_t' "を使用しますが、' set'とはかなり異なる 'range'オブジェクトを使って作業しています。少なくとも、Pythonの文脈における 'set'という単語は、通常、' d_t = {1,2,3,4,5,6} 'によって作成される特定のデータ構造を意味しますが、これはあなたが使いたいものではありません。 –

答えて

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

。ちょっと違う方法で考えて、簡単に入手してください。

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] 
関連する問題