Вот моя попытка по этому вопросу :) Самая сложная часть, которая реверсирует операцию сортировки и сопоставляет ее с результатами ... Если вам не нужно сохранять исходный порядок отношений, вы можете удалить часть последнего функция.
def scale_ratio(ratios: list) -> list:
sum_ = sum(ratios)
return [x/sum_ for x in ratios]
def ratio_breakdown_recursive(x: int, ratios: list) -> list:
top_ratio = ratios[0]
part = round(x*top_ratio)
if x <= part:
return [x]
x -= part
return [part] + ratio_breakdown_recursive(x, scale_ratio(ratios[1:]))
def ratio_breakdown(x: int, ratios: list) -> list:
sorted_ratio = sorted(ratios, reverse=True)
assert(round(sum(ratios)) == 1)
sorted_result = ratio_breakdown_recursive(x, sorted_ratio)
assert(sum(sorted_result) == x)
# Now, we have to reverse the sorting and add missing zeros
sorted_result += [0]*(len(ratios)-len(sorted_result))
numbered_ratios = [(r, i) for i, r in enumerate(ratios)]
sorted_numbered_ratios = sorted(numbered_ratios, reverse=True)
combined = zip(sorted_numbered_ratios, sorted_result)
combined_unsorted = sorted(combined, key=lambda x: x[0][1])
unsorted_results = [x[1] for x in combined_unsorted]
return unsorted_results
Результаты:
ratio_breakdown(7, [0.36, 0.44, 0.07, 0.07, 0.03, 0.03])
[3, 3, 1, 0, 0, 0]
ratio_breakdown(10, [0.55, 0.45])
[6, 4]
ratio_breakdown(16, [0.16, 0.47, 0.13, 0.24])
[2, 8, 2, 4]
EDIT: Это Python3.
Вы пытались решить эту проблему? Если у вас есть, отредактируйте свой вопрос, чтобы включить свой код и исследование, чтобы показать, что не сработало для вас. Если вы этого не сделали, сначала попытайтесь решить эту проблему, а затем опубликуйте код и исследуйте здесь. Это затрудняет ответ другим пользователям! – SuperBiasedMan
См. Этот [stackoverflow] (http://stackoverflow.com/questions/2356501/how-do-you-round-up-a-number-in-python) и этот [python math] (https: // docs. python.org/2/library/math.html) –
Я мог бы написать что-то, что после этого, как в первом примере, в конечном итоге с [6,5] будет измеряться, если в нем больше или меньше, а затем просто, если больше, удалите один из самого большого числа или, если меньше, добавьте в самый высокий коэффициент, который еще ничего не имеет. Однако мне было интересно, есть ли какой-то умный математический способ сделать это. – SecondLemon