У меня есть небольшая программная проблема, которую я пытаюсь решить в Clojure.
Скажем, у меня есть список с целочисленными значениями (они также включают нули). Эти значения имеют сумму, которую я хочу уменьшить на определенное значение. Чтобы получить эту более низкую сумму, я хочу уменьшить значения в списке на соотношение.
Скажите, у меня есть следующий список: [0, 10, 30, 40, 20, 0]. Сумма равна 100, и я хочу уменьшить сумму до 90. Я хочу уменьшить значения по соотношению, поэтому новый список будет [0, 9, 27, 36, 18, 0].
Однако, это становится проблематичным, когда числа превращаются в дроби. Когда вы округляете числа (с округлением, полом или потолком), вы можете получить сумму, равную 1 или 2. Кажется, я не могу найти элегантного решения. Все, что я получаю, состоит в том, чтобы пройти все значения один раз, а затем вернуться, чтобы восстановить смещение. Есть идеи?
Редактировать
Чтобы прояснить поведение, которое я хочу увидеть, способ его округления не имеет большого значения для меня, если сумма верна, а соотношения чисел примерно одинаковы. Меня не волнует, является ли общая ошибка наименьшей или большинство округляется в меньшую сторону.
Дополнительные требования состоят в том, чтобы числам оставалось только оставаться равными или становиться меньше, числа должны быть> = 0, а итоговый список чисел должен быть целыми числами.