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żej40
, 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 dlax
byłoby mniejsze niż12.5
.Odpowiedzi:
JavaScript (ES6), 252 bajty
Oczekuje
0
brakujących wartości procentowych. Zwraca parę minimalnych i maksymalnych wartości dla wszystkich wpisów.Wypróbuj online!
W jaki sposób?
Inicjalizacja
Najpierw zamieniamy każdą wartość w tablicy wejściowej a [] na możliwie największy zakres.
Przykłady:
Główna funkcja
Główną funkcją jest h () . Poszukuje pierwszego wpisu, który wydaje się niespójny, gdy próbujemy go zminimalizować lub zmaksymalizować. Jeśli ją znajdzie, aktualizuje ją do wartości, która jest co najmniej tymczasowo dopuszczalna, biorąc pod uwagę inne zakresy.
Przyjmuje jako dane wejściowe M = Math.max / I = 0 lub M = Math.min / I = 1 i definiuje J jako I XOR 1 .
Ponieważ h () zostało napisane w celu obsługi zarówno minimalizacji, jak i maksymalizacji przejść, kod jest nieco trudny do skomentowania. Dlatego skupimy się tylko na przejściu maksymalizacyjnym, dla którego mamy M = Math.max , I = 0 i J = 1 . Przy tych parametrach kod brzmi następująco:
Rekurencja
Funkcja rekurencyjna g () ciągle wywołuje h (), dopóki przejście minimalizujące lub maksymalizujące nie prowadzi do nowej korekty i ostatecznie nie zwraca wyniku końcowego.
źródło
[38,0,10,0,0,0,0,0,0,0]
.