Path 1: 29 calls (0.71)

92 (11) 93 (4) 59 (3) 100 (2) 86 (2) 85 (2) 75 (1) 35 (1) 20 (1) 23 (1)

[1] (22) [1, 1] (6) [1, 3] (1)

[2] (20) [3, 3] (6) [3] (2) [1, 1] (1)

[92] (11) [93] (4) [59] (3) [50, 50] (2) [43, 43] (2) [43, 42] (2) [75] (1) [35] (1) [20] (1) [23] (1)

1def ratio_distribute(
2    total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4    """Distribute an integer total in to parts based on ratios.
5
6    Args:
7        total (int): The total to divide.
8        ratios (List[int]): A list of integer ratios.
9        minimums (List[int]): List of minimum values for each slot.
10
11    Returns:
12        List[int]: A list of integers guaranteed to sum to total.
13    """
14    if minimums:
15        ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16    total_ratio = sum(ratios)
17    assert total_ratio > 0, "Sum of ratios must be > 0"
18
19    total_remaining = total
20    distributed_total: List[int] = []
21    append = distributed_total.append
22    if minimums is None:
23        _minimums = [0] * len(ratios)
24    else:
25        _minimums = minimums
26    for ratio, minimum in zip(ratios, _minimums):
27        if total_ratio > 0:
28            distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29        else:
30            distributed = total_remaining
31        append(distributed)
32        total_ratio -= ratio
33        total_remaining -= distributed
34    return distributed_total
            

Path 2: 11 calls (0.27)

12 (2) 23 (2) 10 (2) 17 (1) 2 (1) 7 (1) 11 (1) 0 (1)

[22, 17, 5] (3) [5] (2) [1, 3] (2) [6, 6] (1) [20, 15, 3, 8] (1) [1] (1) [1, 1] (1)

None (11)

[23] (2) [9, 8] (1) [6, 5, 1] (1) [1, 1, 0] (1) [4, 3, 0] (1) [5, 4, 1, 1] (1) [10] (1) [5, 5] (1) [3, 9] (1) [0, 0] (1)

1def ratio_distribute(
2    total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4    """Distribute an integer total in to parts based on ratios.
5
6    Args:
7        total (int): The total to divide.
8        ratios (List[int]): A list of integer ratios.
9        minimums (List[int]): List of minimum values for each slot.
10
11    Returns:
12        List[int]: A list of integers guaranteed to sum to total.
13    """
14    if minimums:
15        ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16    total_ratio = sum(ratios)
17    assert total_ratio > 0, "Sum of ratios must be > 0"
18
19    total_remaining = total
20    distributed_total: List[int] = []
21    append = distributed_total.append
22    if minimums is None:
23        _minimums = [0] * len(ratios)
24    else:
25        _minimums = minimums
26    for ratio, minimum in zip(ratios, _minimums):
27        if total_ratio > 0:
28            distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29        else:
30            distributed = total_remaining
31        append(distributed)
32        total_ratio -= ratio
33        total_remaining -= distributed
34    return distributed_total
            

Path 3: 1 calls (0.02)

10 (1)

[1, 0] (1)

None (1)

[10, 0] (1)

1def ratio_distribute(
2    total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4    """Distribute an integer total in to parts based on ratios.
5
6    Args:
7        total (int): The total to divide.
8        ratios (List[int]): A list of integer ratios.
9        minimums (List[int]): List of minimum values for each slot.
10
11    Returns:
12        List[int]: A list of integers guaranteed to sum to total.
13    """
14    if minimums:
15        ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16    total_ratio = sum(ratios)
17    assert total_ratio > 0, "Sum of ratios must be > 0"
18
19    total_remaining = total
20    distributed_total: List[int] = []
21    append = distributed_total.append
22    if minimums is None:
23        _minimums = [0] * len(ratios)
24    else:
25        _minimums = minimums
26    for ratio, minimum in zip(ratios, _minimums):
27        if total_ratio > 0:
28            distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29        else:
30            distributed = total_remaining
31        append(distributed)
32        total_ratio -= ratio
33        total_remaining -= distributed
34    return distributed_total