Фон
У Франції, і, мабуть, у решті країн Європейського Союзу, будь-яка їжа, доступна для продажу, повинна перераховувати інгредієнти, що входять до складу упаковки, у ваговому відсотку за спаданням . Однак точний відсоток не потрібно вказувати, якщо інгредієнт не буде виділений текстом або зображенням на обкладинці.
Наприклад, мій томатний соус із базиліком, на його упаковці є лише великі червоні помідори та красиві листя базиліка, має такі ознаки:
Інгредієнти: Помідори 80%, цибуля на шматочках, базилік 1,4%, морська сіль, часникове пюре, сирий тростинний цукор, оливкова олія надзвичайної олії, чорний перець.
Це звучить пікантно, але… скільки цибулі я точно з’їв ?
Виклик
Враховуючи перелік вагових відсотків у порядку зменшення, з часом неповний, виведіть повний перелік мінімальних і максимальних відсоткових відсотків, які, можливо, можна знайти в рецепті.
- Ви можете написати або функцію, або повну програму.
- Введення даних може бути в будь-якій розумній формі (наприклад, масив чисел або список рядків). Дробові значення повинні підтримуватися принаймні до одного десяткового знака. Відсутній ваговій відсоток може бути представлений в будь-якому послідовному і недвозначному способі (
0
,'?'
абоnull
, наприклад). Можна припустити, що введення завжди буде пов’язане з дійсним рецептом ([70]
і[∅, ∅, 50]
недійсним, наприклад). - Вихід може бути в будь-якому розумному формі (один масив для обох з мінімального і максимального процентного ваги, або один список дублетів, наприклад). Мінімальний і максимальний відсотки можуть бути в будь-якому порядку (
[min, max]
і[max, min]
обидва прийнятні). Точні відсоткові ваги не потрібно обробляти інакше, ніж інші відсотки, і можуть бути представлені рівними мінімальними та максимальними значеннями.
Застосовуються стандартні правила для коду-гольфу : поки ви вводите код, моє блюдо з макаронами охолоджується, тому виграє найкоротше подання.
Приклади
Оскільки ця проблема важче, ніж може здатися на перший погляд, ось покрокове вирішення кількох випадків.
[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
.