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 x
i y
dwa brakujące procenty.
- Ponieważ występuje po pierwszym składniku w 40%,
x
nie 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
x
przyjmuje maksymalną wartość,y
przyjmuje minimalną wartość, która wynosi 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Jeśli
x
przyjmuje minimalną wartość,y
przyjmuje maksymalną wartość. Alex
nie 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
, y
a z
trzy brakujące procenty.
- Minimalne i maksymalne wartości procentowe obowiązkowo
z
wynoszą od 0% do 5%. Załóżmy przezz
chwilę = 0%. Suma dwóch brakujących wartości procentowych wynosi zawsze 25%. W konsekwencji :[70, [?, ?], [?, ?], 5, [0, 5]]
- Jeśli
y
przyjmuje minimalną wartość, 5%, tox
przyjmuje maksymalną wartość, która wynosi 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Jeśli
y
przyjmuje maksymalną wartość,x
przyjmuje minimalną wartość. Alex
nie 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
y
przyjmuje minimalną wartość, 5%, tox
przyjmuje maksymalną wartość, która wynosi 20% - 5% = 15%. Ten przypadek jest już uwzględniony w uprzednio obliczonych zakresach. - Jeśli
y
przyjmuje maksymalną wartość,x
przyjmuje minimalną wartość. Alex
nie 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 x
byłoby mniejsze niż 12.5
.