Contexte
En France, et probablement dans le reste de l'Union européenne, tout aliment disponible à la vente doit énumérer les ingrédients qui le composent sur son emballage, en ordre décroissant de pourcentage en poids . Cependant, le pourcentage exact ne doit pas être indiqué, à moins que l'ingrédient ne soit mis en évidence par le texte ou une image sur l'enveloppe.
Par exemple, ma sauce tomate au basilic, ne montrant que quelques grosses tomates rouges et de belles feuilles de basilic sur son emballage, présente les indications suivantes:
Ingrédients: Tomates 80%, oignons en morceaux, basilic 1,4%, sel de mer, purée d'ail, sucre de canne brut, huile d'olive extra vierge, poivre noir.
Cela semble salé, mais… combien d'oignons vais-je manger exactement?
Défi
À partir d’une liste de pourcentages en poids par ordre décroissant, éventuellement incomplet, créez une liste complète des pourcentages en poids minimal et maximal pouvant être trouvés dans la recette.
- Vous pouvez écrire une fonction ou un programme complet.
- L' entrée peut être sous n'importe quelle forme raisonnable (tableau de nombres ou liste de chaînes, par exemple). Les valeurs fractionnelles doivent être prises en charge avec au moins une décimale. Un pourcentage de poids manquant peut être représenté en aucune façon cohérente et sans ambiguïté (
0
,'?'
ounull
, par exemple). Vous pouvez supposer que l'entrée sera toujours associée à une recette valide ([70]
et[∅, ∅, 50]
ne sera pas valide, par exemple). - La sortie peut être sous n'importe quelle forme raisonnable (un tableau pour les pourcentages de poids minimal et maximal, ou une liste unique de doublets, par exemple). Les pourcentages minimal et maximal peuvent être dans n'importe quel ordre (
[min, max]
et[max, min]
sont tous deux acceptables). Les pourcentages pondéraux exacts n'ont pas besoin d'être traités différemment des autres pourcentages et peuvent être représentés par des valeurs égales minimale et maximale.
Les règles standard pour le code-golf s'appliquent: pendant que vous tapez votre code, mon plat de pâtes refroidit, la soumission la plus courte gagne.
Exemples
Étant donné que ce problème est plus complexe qu'il n'y parait à première vue, voici une résolution étape par étape de quelques cas.
[40, ∅, ∅]
Appelons respectivement x
et y
les deux pourcentages manquants.
- Parce qu'il vient après le premier ingrédient à 40%,
x
il ne peut être supérieur à 40%.[40, [?, 40], [?, ?]]
- La somme des deux pourcentages manquants est toujours de 60%. Par conséquent :
- Si
x
prend sa valeur maximale ,y
prend alors sa valeur minimale , qui est donc de 60% à 40% = 20%.[40, [?, 40], [20, ?]]
- Si
x
prend sa valeur minimale ,y
prend alors sa valeur maximale . Maisx
ne peut pas être inférieur ày
, donc dans ce cas,x
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Si
[70, ∅, ∅, 5, ∅]
Appelons respectivement x
, y
et z
les trois pourcentages manquants.
- Les pourcentages minimal et maximal pour
z
sont nécessairement compris entre 0% et 5%. Supposonsz
un instant = 0%. La somme des deux pourcentages manquants est toujours de 25%. Par conséquent :[70, [?, ?], [?, ?], 5, [0, 5]]
- Si
y
prend sa valeur minimale , 5%,x
prend alors sa valeur maximale , qui est donc 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Si
y
prend sa valeur maximale ,x
prend alors sa valeur minimale . Maisx
ne peut pas être inférieur ày
, donc dans ce cas,x
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Si
- Vérifions que tout va bien si nous supposons maintenant que
z
= 5%. La somme des deux pourcentages manquants est toujours de 20%. Par conséquent :- Si
y
prend sa valeur minimale , 5%,x
prend alors sa valeur maximale , qui est donc 20% - 5% = 15%. Ce cas est déjà inclus dans les plages calculées précédemment. - Si
y
prend sa valeur maximale ,x
prend alors sa valeur minimale . Maisx
ne peut pas être inférieur ày
, donc dans ce cas,x
=y
= 20% / 2 = 10%. Ce cas est déjà inclus dans la plage précédemment calculée poury
, mais pas pourx
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Si
Cas de test
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, ∅, ∅]
et [70, ∅, ∅, 5, ∅]
pour rendre les choses un peu plus claires. Un défi devrait être clair sans regarder les cas de test, ce qui n'est pas le cas pour le moment. Si j'ai bien compris, il en [40, ∅, ∅]
faut 60 de plus pour 100%, répartis entre ces deux éléments ∅
. Le premier ∅
doit être supérieur ou égal à 30 (sinon le second ∅
sera au-dessus, ce qui ne devrait pas être possible quand ils sont en ordre). De plus, il ne peut pas être au 40
- dessus , alors le premier ∅
devient [30,40]
, et le second devient [(100-40-40=)20, (100-40-30=)30]
.
[min,max]
/ [max,min]
ou mixte autorisé?
[min,max]
et [max,min]
est à la limite acceptable, mais comme cela ne peut pas conduire à des résultats ambigus, je dirais que ça va.
[70, 12, 11, 5, 2]
fonctionne pas pour votre deuxième exemple? Si cela fonctionne, le minimum pour x
serait inférieur à 12.5
.