sfondo
In Francia, e probabilmente nel resto dell'Unione europea, tutti gli alimenti disponibili per la vendita devono elencare gli ingredienti che lo compongono sulla confezione, in ordine di percentuale decrescente in peso . Tuttavia, non è necessario indicare la percentuale esatta , a meno che l'ingrediente non sia evidenziato dal testo o da un'immagine sulla copertina.
Ad esempio, la mia salsa di pomodoro al basilico, che mostra solo alcuni grandi pomodori rossi e belle foglie di basilico sulla confezione, ha le seguenti indicazioni:
Ingredienti: pomodori 80%, cipolle a pezzi, basilico 1,4%, sale marino, aglio schiacciato, zucchero di canna crudo, olio extra vergine di oliva, pepe nero.
Sembra salato, ma ... quante cipolle mangerò , esattamente?
Sfida
Dato un elenco di percentuali di peso in ordine decrescente, eventualmente incompleto, viene visualizzato un elenco completo delle percentuali di peso minimo e massimo che è possibile trovare nella ricetta.
- È possibile scrivere una funzione o un programma completo.
- L' input può essere in qualsiasi forma ragionevole (matrice di numeri o elenco di stringhe, ad esempio). I valori frazionari devono essere supportati almeno con una cifra decimale. Una percentuale peso mancante può essere rappresentato in alcun modo coerente e inequivocabile (
0
,'?'
onull
, per esempio). Puoi presumere che l'input sarà sempre associato a una ricetta valida ([70]
e[∅, ∅, 50]
non sono validi, per esempio). - L' output può essere in qualsiasi forma ragionevole (un array per entrambe le percentuali di peso minimo e massimo, o un singolo elenco di doppietti, per esempio). Le percentuali minime e massime possono essere in qualsiasi ordine (
[min, max]
e[max, min]
sono entrambe accettabili). Le percentuali di peso esatte non devono essere elaborate in modo diverso rispetto ad altre percentuali e possono essere rappresentate da uguali valori minimi e massimi.
Si applicano le regole standard per il code-golf : mentre digiti il codice, il mio piatto di pasta si raffredda, quindi vince l'invio più breve.
Esempi
Poiché questo problema è più difficile di quanto possa sembrare a prima vista, ecco una risoluzione dettagliata di alcuni casi.
[40, ∅, ∅]
Chiamiamo rispettivamente x
e y
le due percentuali mancanti.
- Perché viene dopo il primo ingrediente al 40%,
x
non può essere superiore al 40% stesso.[40, [?, 40], [?, ?]]
- La somma delle due percentuali mancanti è sempre del 60%. Di conseguenza:
- Se
x
assume il suo valore massimo , quindiy
prende il suo valore minimo , che è quindi del 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Se
x
assume il suo valore minimo , quindiy
prende il suo valore massimo . Max
non può essere inferiore ay
, quindi in questo casox
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Se
[70, ∅, ∅, 5, ∅]
Chiamiamo, rispettivamente x
, y
e z
le tre percentuali mancanti.
- Le percentuali minima e massima per
z
sono necessariamente comprese tra 0% e 5%. Assumiamoz
= 0% per un momento. La somma delle due percentuali mancanti è sempre del 25%. Di conseguenza:[70, [?, ?], [?, ?], 5, [0, 5]]
- Se
y
assume il suo valore minimo , 5%, quindix
prende il suo valore massimo , che è quindi 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Se
y
prende il suo valore massimo , quindix
prende il suo valore minimo . Max
non può essere inferiore ay
, quindi in questo casox
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Se
- Verifichiamo che tutto va bene se assumiamo ora che
z
= 5%. La somma delle due percentuali mancanti è sempre del 20%. Di conseguenza:- Se
y
assume il suo valore minimo , 5%, quindix
prende il suo valore massimo , che è quindi 20% - 5% = 15%. Questo caso è già incluso negli intervalli calcolati in precedenza. - Se
y
prende il suo valore massimo , quindix
prende il suo valore minimo . Max
non può essere inferiore ay
, quindi in questo casox
=y
= 20% / 2 = 10%. Questo caso è già incluso nell'intervallo calcolato in precedenza pery
, ma non perx
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Se
Casi 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, ∅, ∅]
e [70, ∅, ∅, 5, ∅]
per rendere le cose un po 'più chiare. Una sfida dovrebbe essere chiara senza guardare i casi di test, che non è il caso in questo momento. Se lo capisco correttamente per [40, ∅, ∅]
: ne servono altri 60 per il 100%, divisi su questi due ∅
. Il primo ∅
deve essere 30 o superiore (altrimenti il secondo ∅
sarà sopra di esso, il che non dovrebbe essere possibile quando sono in ordine). Inoltre, non può essere sopra 40
, quindi il primo ∅
diventa [30,40]
e il secondo diventa [(100-40-40=)20, (100-40-30=)30]
.
[min,max]
/ [max,min]
o misto permesso?
[min,max]
ed [max,min]
è al limite accettabile, ma dal momento che non può portare a risultati ambigui, direi che va bene.
[70, 12, 11, 5, 2]
non funziona per il tuo secondo esempio? Se funziona, il minimo per x
sarebbe inferiore a 12.5
.