Hintergrund
In Frankreich und wahrscheinlich auch in der übrigen Europäischen Union müssen zum Verkauf stehende Lebensmittel die Zutaten, aus denen sie bestehen, in absteigender Reihenfolge in Gewichtsprozent auf ihrer Verpackung vermerken . Der genaue Prozentsatz muss jedoch nicht angegeben werden, es sei denn, die Zutat wird durch den Text oder ein Bild auf dem Cover hervorgehoben.
Zum Beispiel hat meine Basilikum-Tomatensauce, die nur einige große rote Tomaten und schöne Basilikumblätter auf ihrer Verpackung zeigt, die folgenden Angaben:
Zutaten: Tomaten 80%, Zwiebeln in Stücken, Basilikum 1,4%, Meersalz, Knoblauchpüree, Rohrohrzucker, Olivenöl extra vergine, schwarzer Pfeffer.
Es klingt wohlschmeckend, aber… wie viel Zwiebeln esse ich genau?
Herausforderung
Bei einer Liste der Gewichtsprozente in absteigender Reihenfolge, die eventuell unvollständig ist, wird eine vollständige Liste der minimalen und maximalen Gewichtsprozente ausgegeben , die möglicherweise im Rezept enthalten sind.
- Sie können entweder eine Funktion oder ein vollständiges Programm schreiben.
- Die Eingabe kann in einer beliebigen vernünftigen Form erfolgen (z. B. ein Array von Zahlen oder eine Liste von Zeichenfolgen). Bruchwerte sollten mindestens bis zu einer Dezimalstelle unterstützt werden. Ein fehlender Gewichtsanteil kann in jede konsistenten und eindeutigen Weise (dargestellt werden
0
,'?'
odernull
, zum Beispiel). Sie können davon ausgehen, dass die Eingabe immer einem gültigen Rezept zugeordnet wird ([70]
und[∅, ∅, 50]
beispielsweise ungültig ist). - Die Ausgabe kann in jeder vernünftigen Form erfolgen (z. B. ein Array für den minimalen und den maximalen Gewichtsprozentsatz oder eine einzelne Liste von Dubletten). Der minimale und der maximale Prozentsatz können in beliebiger Reihenfolge angegeben werden (
[min, max]
und[max, min]
sind beide akzeptabel). Genaue Gewichtsprozente müssen nicht anders als andere Prozente verarbeitet werden und können durch gleiche Minimal- und Maximalwerte dargestellt werden.
Es gelten die Standardregeln für Code-Golf : Während Sie Ihren Code eingeben, kühlt sich mein Nudelgericht ab, sodass die kürzeste Einsendung gewinnt.
Beispiele
Da dieses Problem schwieriger ist, als es auf den ersten Blick erscheinen mag, finden Sie hier eine schrittweise Lösung für einige Fälle.
[40, ∅, ∅]
Nennen wir jeweils x
und y
die beiden fehlenden Prozentsätze.
- Da es nach der ersten Zutat zu 40% kommt,
x
kann es nicht höher als 40% sein.[40, [?, 40], [?, ?]]
- Die Summe der beiden fehlenden Prozentsätze beträgt immer 60%. Folglich :
- Wenn
x
sein nimmt Maximalwert, danny
nimmt ihren minimalen Wert, der somit beträgt 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Wenn
x
seine dauert minimal Wert, danny
nimmt seinen maximalen Wert. Aberx
kann nicht niedriger sein alsy
, so in diesem Fallx
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Wenn
[70, ∅, ∅, 5, ∅]
Nennen wir jeweils x
, y
und z
die drei fehlenden Prozente.
- Die minimalen und maximalen Prozentsätze für
z
liegen notwendigerweise zwischen 0% und 5%. Nehmen wirz
für einen Moment = 0% an. Die Summe der beiden fehlenden Prozentsätze beträgt immer 25%. Folglich :[70, [?, ?], [?, ?], 5, [0, 5]]
- Wenn
y
sein nimmt minimalen Wert, 5%, dannx
nimmt seinen Maximalwert, der somit 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Wenn
y
seine dauert maximal Wert, dannx
nimmt seinen minimalen Wert. Aberx
kann nicht niedriger sein alsy
, so in diesem Fallx
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Wenn
- Lassen Sie uns überprüfen, ob alles in Ordnung ist, wenn wir jetzt davon ausgehen, dass
z
= 5%. Die Summe der beiden fehlenden Prozentsätze beträgt immer 20%. Folglich :- Wenn
y
sein nimmt minimalen Wert, 5%, dannx
nimmt seinen Maximalwert, der somit 20% - 5% = 15%. Dieser Fall ist bereits in den zuvor berechneten Bereichen enthalten. - Wenn
y
seine dauert maximal Wert, dannx
nimmt seinen minimalen Wert. Aberx
kann nicht niedriger sein alsy
, so in diesem Fallx
=y
= 20% / 2 = 10%. Dieser Fall ist bereits in dem zuvor berechneten Bereich für enthalteny
, jedoch nicht fürx
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Wenn
Testfälle
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, ∅, ∅]
und [70, ∅, ∅, 5, ∅]
etwas deutlicher zu machen Dinge. Eine Herausforderung sollte klar sein, ohne die Testfälle zu betrachten, was im Moment nicht der Fall ist. Wenn ich es richtig verstehe für [40, ∅, ∅]
: 60 weitere sind für 100% notwendig, aufgeteilt auf diese beiden ∅
. Das erste ∅
muss 30 oder höher sein (sonst wird das zweite ∅
darüber sein, was nicht möglich sein sollte, wenn sie in Ordnung sind). Darüber hinaus kann es nicht über sein 40
, so dass der erste ∅
wird [30,40]
, und die zweite wird [(100-40-40=)20, (100-40-30=)30]
.
[min,max]
/ [max,min]
oder gemischt erlaubt?
[min,max]
und [max,min]
ist grenzwertig akzeptabel, aber da es nicht zu mehrdeutigen Ergebnissen führen kann, würde ich sagen, dass es in Ordnung ist.
[70, 12, 11, 5, 2]
bei deinem zweiten Beispiel nicht? Wenn es funktioniert, wäre das Minimum für x
weniger als 12.5
.