2017-05-13 6 views
1

私はロジックを真っ直ぐにして、Pythonを使ってやっています。最終的に、ImageJマクロ言語を使用してこの問題を解決する必要があります。「スネーク」カウンタを作成する

私は適切な用語を使用しているのかどうかはわかりませんが、「ヘビ」カウンターを作成したいと思います。

x = 1 
number = 12 
maxVal = 3 
minVal = 1 

for i in xrange(number): 
    %do something 
    x = incrementSnakeCounter(x, maxVal, minVal) 
    print("i = ", i) 
    print("x = ", x) 

「蛇」の部分は、次の反復でその数を繰り返しminValまでカウントダウン、次の反復でその値を繰り返して、プロセスを繰り返し、カウンターだけmaxValに上がる行っています。例えば

、上記

に私が発生するには、次のようにしたい:

i = 0 
x = 1 

i = 1 
x = 2 

i = 2 
x = 3 

i = 3 
x = 3 

i = 4 
x = 2 

i = 5 
x = 1 

i = 6 
x = 1 

i = 7 
x = 2 

i = 8 
x = 3 

i = 9 
x = 3 

i = 10 
x = 2 

i = 11 
x = 1 

答えて

1

ここでは愚かな数学的解決策があります:

def snake(low, high, x): 
    k = (high-low+1) 
    return k - int(abs(x % (2*k) + low - k - 0.5)) 

[snake.snake(1,3,x) for x in range(8)] 
[1, 2, 3, 3, 2, 1, 1, 2] 
+0

すばらしい解決策!これは私のアプリケーションでは完全に機能します。 ImageJマクロ言語では 'int'が利用できないので、' int'を 'floor'に置き換えるだけです。 – agf1997

1

Xは、ループ内の任意の所与の時点で増加または減少されるべきかどうかを決定する条件を追加します。あなたのincrementSnakeCounter内部次に

x = 1 
number = 12 
maxVal = 3 
minVal = 1 

for i in xrange(number): 
    %do something 
    if(xIsIncreasing) 
     x = incrementSnakeCounter(x, maxVal, minVal) 
    else 
     x = decrementSnakeCounter(x, maxVal, minVal) 
    print("i = ", i) 
    print("x = ", x) 

()falseにxIsIncreasingの値を変更すると、真のX == MAXVALとあなたのdecrementSnakeCounter内部の()は、x == MINVAL(あなたが確認するために、いくつかの作業を行う必要があるでしょう同じ値を2回続けているとしたら、今はその部分を解決する時間がありません)。

4

あなたはitertoolsにいくつかの有用なutilsのを見つけます:

from itertools import chain, cycle 

def snake(lower, upper): 
    return cycle(chain(range(lower, upper+1), range(upper, lower-1, -1))) 

> s = snake(1,3) 

> [next(s) for _ in range(10)] 
[1, 2, 3, 3, 2, 1, 1, 2, 3, 3] 
+0

これは良い解決策です。残念ながら、ImageJマクロ言語で実装する必要があります。私は、Pythonがイラストレーションのためだけのものであることを明確にすべきでした。 – agf1997

+1

最小値または最大値が変更された場合、これは機能しません。 –

+0

@ agf1997 imagej-macroはstackoverflowに独自のタグを持っています。だから申し訳ありません。私は、ロジックそのものは、どの言語や疑似コードでもピン止めするのが難しくあってはならないと思います。 – schwobaseggl

1

あなたは少しのカスタムジェネレータを書くことができます。その後

def snake(x, max_v=3, min_v=1): 
    cnt=0 
    sn=list(range(min_v, max_v+1,1))+list(range(max_v, min_v-1,-1)) 
    while cnt<x: 
     yield cnt, sn[cnt%len(sn)] 
     cnt+=1 

for i,x in snake(12): 
    print("i=",i) 
    print("x=",x) 
    print() 

キーを使用すると、[1, 2, 3, 3, 2, 1]と長さの剰余で繰り返し動作を取得することを、インデックスを繰り返したいパターンのリストを作成することです

印刷物:

i= 0 
x= 1 

i= 1 
x= 2 

i= 2 
x= 3 

i= 3 
x= 3 

i= 4 
x= 2 

i= 5 
x= 1 

i= 6 
x= 1 

i= 7 
x= 2 

i= 8 
x= 3 

i= 9 
x= 3 

i= 10 
x= 2 

i= 11 
x= 1 
関連する問題