Задний план
Во Франции и, вероятно, в остальной части Европейского Союза, любая пища, имеющаяся в наличии для продажи, должна перечислять ингредиенты, которые ее составляют, на упаковке в порядке убывания веса . Тем не менее, точный процент не должен быть указан, если ингредиент не выделен текстом или изображением на обложке.
Например, мой томатный соус с базиликом, на упаковке которого есть только несколько больших красных помидоров и красивые листья базилика, имеет следующие признаки:
Ингредиенты: помидоры 80%, лук кусочками, базилик 1,4%, морская соль, пюре из чеснока, тростниковый сахар-сырец, оливковое масло первого отжима, черный перец.
Это звучит несладко, но ... сколько я буду есть , точно?
Вызов
Учитывая список весовых процентов в порядке убывания, в конечном итоге неполный, выведите полный список минимального и максимального весовых процентов, которые могут быть найдены в рецепте.
- Вы можете написать либо функцию, либо полную программу.
- Вход может быть в любой разумной форме (массив чисел или список строк, например). Дробные значения должны поддерживаться как минимум с одним десятичным знаком. Отсутствующий весовой процент может быть представлен в любом последовательном и недвусмысленном способе (
0
,'?'
илиnull
, к примеру). Вы можете предположить, что входные данные всегда будут связаны с действительным рецептом ([70]
и[∅, ∅, 50]
, например, неверны). - Выход может быть в любой разумной форме (один массив для обоих из минимального и максимального процентного веса, или один список дублетов, например). Минимальный и максимальный проценты могут быть в любом порядке (
[min, max]
и[max, min]
оба приемлемы). Точные весовые проценты не должны обрабатываться иначе, чем другие проценты, и могут быть представлены равными минимальными и максимальными значениями.
Применяются стандартные правила для code-golf : пока вы набираете код, мое блюдо с пастой охлаждается, поэтому выигрывает самое короткое представление.
Примеры
Поскольку эта проблема сложнее, чем может показаться на первый взгляд, здесь приведено пошаговое решение нескольких случаев.
[40, ∅, ∅]
Давайте назовем соответственно x
и y
два пропущенных процента.
- Потому что он идет после первого ингредиента на 40%,
x
не может быть выше, чем 40%.[40, [?, 40], [?, ?]]
- Сумма двух пропущенных процентов всегда составляет 60%. Следовательно :
- Если
x
принимает его максимальное значение, тоy
принимает его минимальное значение, которое поэтому составляет 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Если
x
принимает минимальное значение, тоy
принимает максимальное значение. Ноx
не может быть нижеy
, поэтому в этом случаеx
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Если
[70, ∅, ∅, 5, ∅]
Давайте назовем соответственно x
, y
и z
три недостающие проценты.
- Минимальный и максимальный проценты для
z
обязательно находятся между 0% и 5%. Давайте предположимz
= 0% на мгновение. Сумма двух пропущенных процентов всегда составляет 25%. Следовательно :[70, [?, ?], [?, ?], 5, [0, 5]]
- Если
y
принимает минимальное значение 5%, тоx
принимает максимальное значение, которое, следовательно, составляет 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Если
y
принимает его максимальное значение, тоx
принимает его минимальное значение. Ноx
не может быть нижеy
, поэтому в этом случаеx
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Если
- Давайте проверим, что все в порядке, если предположить, что
z
= 5%. Сумма двух пропущенных процентов всегда составляет 20%. Следовательно :- Если
y
принимает минимальное значение 5%, тоx
принимает максимальное значение, которое, следовательно, составляет 20% - 5% = 15%. Этот случай уже включен в ранее рассчитанные диапазоны. - Если
y
принимает максимальное значение, тоx
принимает минимальное значение. Ноx
не может быть нижеy
, поэтому в этом случаеx
=y
= 20% / 2 = 10%. Этот случай уже включен в ранее рассчитанный диапазон дляy
, но не дляx
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Если
Контрольные примеры
Input: [∅]
Output: [100]
Input: [70, 30]
Output: [70, 30]
Input: [70, ∅, ∅]
Output: [70, [15, 30], [0, 15]]
Input: [40, ∅, ∅]
Output: [40, [30, 40], [20, 30]]
Input: [∅, ∅, 10]
Output: [[45, 80], [10, 45], 10]
Input: [70, ∅, ∅, ∅]
Output: [70, [10, 30], [0, 15], [0, 10]]
Input: [70, ∅, ∅, 5, ∅]
Output: [70, [10, 20], [5, 12.5], 5, [0, 5]]
Input: [30, ∅, ∅, ∅, 10, ∅, ∅, 5, ∅, ∅]
Output: [30, [10, 25], [10, 17.5], [10, 15], 10, [5, 10], [5, 10], 5, [0, 5], [0, 5]]
[40, ∅, ∅]
и [70, ∅, ∅, 5, ∅]
сделать вещи немного яснее. Задача должна быть ясной, не глядя на контрольные примеры, а сейчас это не так. Если я правильно понимаю [40, ∅, ∅]
: для 100% необходимо еще 60, разделенное на эти два ∅
. Первое ∅
должно быть 30 или выше (в противном случае второе ∅
будет выше него, что не должно быть возможно, когда они в порядке). Кроме того, оно не может быть выше 40
, поэтому первое ∅
становится [30,40]
, а второе становится [(100-40-40=)20, (100-40-30=)30]
.
[min,max]
/ [max,min]
или смешанно разрешено?
[min,max]
и [max,min]
является пограничным приемлемым, но так как она не может привести к неоднозначным результатам, я бы сказал , что это нормально.
[70, 12, 11, 5, 2]
не работает ваш второй пример? Если это работает, минимум для x
будет меньше, чем 12.5
.