Задний план
Во Франции и, вероятно, в остальной части Европейского Союза, любая пища, имеющаяся в наличии для продажи, должна перечислять ингредиенты, которые ее составляют, на упаковке в порядке убывания веса . Тем не менее, точный процент не должен быть указан, если ингредиент не выделен текстом или изображением на обложке.
Например, мой томатный соус с базиликом, на упаковке которого есть только несколько больших красных помидоров и красивые листья базилика, имеет следующие признаки:
Ингредиенты: помидоры 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
.Ответы:
JavaScript (ES6), 252 байта
Ожидания
0
для недостающих процентов. Возвращает пару минимальных и максимальных значений для всех записей.Попробуйте онлайн!
Как?
инициализация
Сначала мы заменим каждое значение во входном массиве a [] на максимально возможный диапазон.
Примеры:
Основная функция
Основная функция это h () . Он ищет первую запись, которая кажется непоследовательной, когда мы пытаемся минимизировать или максимизировать ее. Если он находит его, он обновляет его до значения, которое по крайней мере временно приемлемо, учитывая другие диапазоны.
Он принимает в качестве входных данных либо M = Math.max / I = 0, либо M = Math.min / I = 1 и определяет J как I XOR 1 .
Поскольку h () был написан для поддержки как минимизации, так и максимизации проходов, код немного сложно комментировать. Вот почему мы сосредоточимся только на максимальном проходе, для которого имеем M = Math.max , I = 0 и J = 1 . С этими параметрами код выглядит следующим образом:
Рекурсия
Рекурсивная функция g () продолжает вызывать h () до тех пор, пока ни минимизирующий, ни максимизирующий проход не приведут к новой коррекции и в конечном итоге не вернут окончательный результат.
источник
[38,0,10,0,0,0,0,0,0,0]
.