tło
We Francji i prawdopodobnie w pozostałej części Unii Europejskiej każda żywność dostępna do sprzedaży musi zawierać składniki, które składają się na jej opakowaniu, w procentach wagowych malejącej . Jednak dokładny procent nie musi być wskazany, chyba że składnik jest wyróżniony przez tekst lub obraz na okładce.
Na przykład mój sos pomidorowy z bazylią, zawierający tylko kilka dużych czerwonych pomidorów i piękne liście bazylii na opakowaniu, ma następujące wskazania:
Składniki: Pomidory 80%, cebula w kawałkach, bazylia 1,4%, sól morska, tłuczony czosnek, surowy cukier trzcinowy, oliwa z oliwek z pierwszego tłoczenia, czarny pieprz.
Brzmi pikantnie, ale… ile dokładnie zjem cebuli ?
Wyzwanie
Biorąc pod uwagę listę wartości procentowych masy w porządku malejącym, ostatecznie niekompletną, wypisz pełną listę minimalnych i maksymalnych wartości procentowych masy, jakie można znaleźć w przepisie.
- Możesz napisać funkcję lub pełny program.
- Dane wejściowe mogą mieć dowolną rozsądną formę (na przykład tablicę liczb lub listę ciągów znaków). Wartości ułamkowe powinny być obsługiwane co najmniej z jednym miejscem po przecinku. Brakująca Procent wagowy może być przedstawiona w każdej spójny i jednoznaczny sposób (
0,'?'lubnull, na przykład). Możesz założyć, że dane wejściowe zawsze będą powiązane z prawidłową recepturą ([70]i[∅, ∅, 50]na przykład są nieprawidłowe). - Dane wyjściowe mogą być w dowolnej rozsądnej formie (na przykład jedna tablica dla obu minimalnych i maksymalnych wartości procentowych masy lub pojedyncza lista dubletów). Minimalne i maksymalne wartości procentowe mogą być w dowolnej kolejności (
[min, max]i[max, min]obie są dopuszczalne). Dokładne procenty wagowe nie muszą być przetwarzane inaczej niż inne procenty i mogą być reprezentowane przez równe wartości minimalne i maksymalne.
Obowiązują standardowe zasady gry w golfa : podczas pisania kodu moje danie z makaronem ochładza się, więc wygrywa najkrótsze zgłoszenie.
Przykłady
Ponieważ ten problem jest trudniejszy, niż może się wydawać na pierwszy rzut oka, oto rozwiązanie kilku przypadków krok po kroku.
[40, ∅, ∅]
Zadzwońmy odpowiednio xi ydwa brakujące procenty.
- Ponieważ występuje po pierwszym składniku w 40%,
xnie może być wyższy niż 40% sam.[40, [?, 40], [?, ?]] - Suma dwóch brakujących wartości procentowych wynosi zawsze 60%. W konsekwencji :
- Jeśli
xprzyjmuje maksymalną wartość,yprzyjmuje minimalną wartość, która wynosi 60% - 40% = 20%.[40, [?, 40], [20, ?]] - Jeśli
xprzyjmuje minimalną wartość,yprzyjmuje maksymalną wartość. Alexnie może być niższy niży, więc w tym przypadkux=y= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Jeśli
[70, ∅, ∅, 5, ∅]
Nazwijmy odpowiednio x, ya ztrzy brakujące procenty.
- Minimalne i maksymalne wartości procentowe obowiązkowo
zwynoszą od 0% do 5%. Załóżmy przezzchwilę = 0%. Suma dwóch brakujących wartości procentowych wynosi zawsze 25%. W konsekwencji :[70, [?, ?], [?, ?], 5, [0, 5]]- Jeśli
yprzyjmuje minimalną wartość, 5%, toxprzyjmuje maksymalną wartość, która wynosi 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]] - Jeśli
yprzyjmuje maksymalną wartość,xprzyjmuje minimalną wartość. Alexnie może być niższy niży, więc w tym przypadkux=y= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Jeśli
- Sprawdźmy, czy wszystko jest w porządku, jeśli przyjmiemy, że teraz
z= 5%. Suma dwóch brakujących wartości procentowych wynosi zawsze 20%. W konsekwencji :- Jeśli
yprzyjmuje minimalną wartość, 5%, toxprzyjmuje maksymalną wartość, która wynosi 20% - 5% = 15%. Ten przypadek jest już uwzględniony w uprzednio obliczonych zakresach. - Jeśli
yprzyjmuje maksymalną wartość,xprzyjmuje minimalną wartość. Alexnie może być niższy niży, więc w tym przypadkux=y= 20% / 2 = 10%. Ten przypadek jest już uwzględniony w uprzednio obliczonym zakresie dlay, ale nie dlax.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Jeśli
Przypadki testowe
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, ∅, ∅]i [70, ∅, ∅, 5, ∅]dla uproszczenia. Wyzwanie powinno być jasne bez patrzenia na przypadki testowe, co obecnie nie jest prawdą. Jeśli dobrze to rozumiem, dla [40, ∅, ∅]: 100% jest potrzebne na 100%, podzielonych na te dwa ∅. Pierwszy ∅musi mieć 30 lub więcej (w przeciwnym razie drugi ∅będzie powyżej niego, co nie powinno być możliwe, gdy są w porządku). Ponadto nie może być wyżej 40, więc pierwszy ∅staje się [30,40], a drugi staje [(100-40-40=)20, (100-40-30=)30].
[min,max]/ [max,min]mieszane?
[min,max]i [max,min]jest dopuszczalne na granicy, ale ponieważ nie może prowadzić do niejednoznacznych wyników, powiedziałbym, że jest w porządku.
[70, 12, 11, 5, 2]nie działa na twoim drugim przykładzie? Jeśli to zadziała, minimum dla xbyłoby mniejsze niż 12.5.