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 xe yle due percentuali mancanti.
- Perché viene dopo il primo ingrediente al 40%,
xnon può essere superiore al 40% stesso.[40, [?, 40], [?, ?]] - La somma delle due percentuali mancanti è sempre del 60%. Di conseguenza:
- Se
xassume il suo valore massimo , quindiyprende il suo valore minimo , che è quindi del 60% - 40% = 20%.[40, [?, 40], [20, ?]] - Se
xassume il suo valore minimo , quindiyprende il suo valore massimo . Maxnon può essere inferiore ay, quindi in questo casox=y= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Se
[70, ∅, ∅, 5, ∅]
Chiamiamo, rispettivamente x, ye zle tre percentuali mancanti.
- Le percentuali minima e massima per
zsono 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
yassume il suo valore minimo , 5%, quindixprende il suo valore massimo , che è quindi 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]] - Se
yprende il suo valore massimo , quindixprende il suo valore minimo . Maxnon 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
yassume il suo valore minimo , 5%, quindixprende il suo valore massimo , che è quindi 20% - 5% = 15%. Questo caso è già incluso negli intervalli calcolati in precedenza. - Se
yprende il suo valore massimo , quindixprende il suo valore minimo . Maxnon 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 xsarebbe inferiore a 12.5.