Фон
У Франції, і, мабуть, у решті країн Європейського Союзу, будь-яка їжа, доступна для продажу, повинна перераховувати інгредієнти, що входять до складу упаковки, у ваговому відсотку за спаданням . Однак точний відсоток не потрібно вказувати, якщо інгредієнт не буде виділений текстом або зображенням на обкладинці.
Наприклад, мій томатний соус із базиліком, на його упаковці є лише великі червоні помідори та красиві листя базиліка, має такі ознаки:
Інгредієнти: Помідори 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.