Возврат результата в виде списка со специальным поведением из функции на основе ввода - PullRequest
4 голосов
/ 22 июня 2019

Я хочу получить алгоритм, который позволяет возвращать некоторые результаты в соответствии с входными данными.

Я передаю эти значения (изменяемые, значения варьируются)

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, и помещает x2, остальные равны 1, его следует поместить как * 1029. Значения *, se figur и xn рассчитываются как x1=b-b=0, x2=b, x3= 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] 

Мне действительно трудно написать шаблон алгоритма, который решает головоломку. Я очень ценю любую помощь. Спасибо.

1 Ответ

1 голос
/ 27 июня 2019

Надеюсь, я правильно понял вопрос, я работаю только с примерами, приведенными в тексте.

Основной метод - get_points(), который принимает параметры b, c, a, li, как в вопросе, и возвращает список вычисленных значений:

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! *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...