web-dev-qa-db-ja.com

入力に基づく関数からの特別な動作を含むリストとして結果を返す

入力に従っていくつかの結果を返すことができるアルゴリズムを実現したいと思います。

それらの値を渡します(変更可能、値は異なります)

b, c, a, li = 200, 30, 3 , [3,3]

アルゴリズム付きの関数に入れると、結果はリストとして返されます。

[x1, x2, x3, ...]

x1、xnは説明のためのものです。

コードのサンプル:

b, c, a, li = 200, 30, 3 , [1,1]

def func(b,c,a,li):
    for index, item in enumerate(li):
        if index == 0:
            if a %2 == 0:
                Result = []
                start= 0
                for num in range(a):
                    Result[:0]=[start+num*c]
                    Result[-1:]=[b-num*c]
            else:
                Result = []
                start= 0
                for num in range(a):
                    Result[:0]=[start+num*c]
                    Result[-1:]=[b-num*c]
    return Result


g = func(b,c,a,li)
print(g)

出力:

[60, 30, 140]

[0、100、200]のような出力が得られると期待しています。

私が達成したいのは以下の通りです:

たとえば上記の例では:

Forループ内関数は、最初に1であるリストの最初の値をチェックし、次にx1を配置して1であるリストの2番目の値を配置し、x2を配置します。残りは1です。これはx3、se figur、およびxnの値として配置する必要があります。 x1=b-b=0x2=bx3= x1 + b/(a-len(li)+1)として計算

enter image description here

偶数の別の例:

b, c, a, li = 300, 35, 4 , [2,2]

enter image description here

出力:

[ 0, 35, 265, 300]

奇数の別の例:

b, c, a, li = 400, 25, 5 , [2,2]

enter image description here

出力:

[ 0, 25, 200, 375, 400] 

他のいくつかの数字を使った別の例:

b, c, a, li = 350, 40, 3 , [4,2]

出力:

[ 0, 40, 350] 

パズルを解くアルゴリズムパターンを書くのは本当に難しいと思います。私は多くの助けに感謝します。ありがとう。

4
Pavel.D

質問が正しく理解できたことを願っています。私はテキストで提供されている例のみを使用しています。

主なメソッドはget_points()で、パラメータbcaliを受け入れ、計算されたリストを返します値:

from itertools import cycle

def get_points(b, c, a, li):
    num_points_left, num_points_right = li

    final_left = [*range(0, num_points_left * c, c)]
    final_right = [*range(b, b - num_points_right * c, -c)][::-1]
    final_center = []
    points_left = a - (len(final_left) + len(final_right))

    if points_left > 0:
        step = (final_right[0] - final_left[-1]) // (points_left+1)
        final_center = [final_left[-1] + step*i for i in range(1, points_left+1)]
    Elif points_left < 0:
        cycle_list = [lambda: final_left.pop() if len(final_left) > 1 else None,
                      lambda: final_right.pop(0) if len(final_right) > 1 else None]

        if len(final_left) > len(final_right):
            remove_cycle = cycle(cycle_list)
        else:
            remove_cycle = cycle(cycle_list[::-1])

        while len(final_left) + len(final_right) > a:
            next(remove_cycle)()

    return final_left + final_center + final_right

def test(b, c, a, li, expected):
    print('Testing parameters:', b, c, a, li)
    print('Expected:', expected)
    returned = get_points(b, c, a, li)
    print('Returned:', returned)

    if returned == expected:
        print('* PASSED! *')
    else:
        print('!!! Fail !!!')

test(400, 25, 5 , [2,2], [ 0, 25, 200, 375, 400])
test(200, 30, 3 , [1,1], [0, 100 ,200])
test(300, 35, 4 , [2,2], [ 0, 35, 265, 300])
test(350, 40, 3 , [4,2], [ 0, 40, 350])

プリント:

Testing parameters: 400 25 5 [2, 2]
Expected: [0, 25, 200, 375, 400]
Returned: [0, 25, 200, 375, 400]
* PASSED! *
Testing parameters: 200 30 3 [1, 1]
Expected: [0, 100, 200]
Returned: [0, 100, 200]
* PASSED! *
Testing parameters: 300 35 4 [2, 2]
Expected: [0, 35, 265, 300]
Returned: [0, 35, 265, 300]
* PASSED! *
Testing parameters: 350 40 3 [4, 2]
Expected: [0, 40, 350]
Returned: [0, 40, 350]
* PASSED! *
1
Andrej Kesely