Fondo
En Francia, y probablemente en el resto de la Unión Europea, cualquier alimento disponible para la venta debe incluir los ingredientes que lo componen en su envase, en orden descendente porcentual . Sin embargo, no es necesario indicar el porcentaje exacto , a menos que el ingrediente o la imagen en la cubierta resalten el ingrediente.
Por ejemplo, mi salsa de tomate con albahaca, que muestra solo algunos tomates rojos grandes y hermosas hojas de albahaca en su empaque, tiene las siguientes indicaciones:
Ingredientes: Tomates 80%, cebollas en trozos, albahaca 1.4%, sal marina, puré de ajo, azúcar de caña cruda, aceite de oliva virgen extra, pimienta negra.
Suena sabroso, pero ... ¿cuántas cebollas voy a comer exactamente?
Reto
Dada una lista de porcentajes de peso en orden descendente, eventualmente incompleta, genera una lista completa de los porcentajes de peso mínimo y máximo que posiblemente se pueden encontrar en la receta.
- Puede escribir una función o un programa completo.
- La entrada puede estar en cualquier forma razonable (matriz de números o lista de cadenas, por ejemplo). Los valores fraccionales deben ser compatibles al menos con un decimal. Un porcentaje en peso que faltan se puede representar de cualquier manera coherente e inequívoca (
0
,'?'
onull
, por ejemplo). Puede suponer que la entrada siempre estará asociada a una receta válida ([70]
y[∅, ∅, 50]
no es válida, por ejemplo). - El resultado puede tener cualquier forma razonable (una matriz para los porcentajes de peso mínimo y máximo, o una lista única de dobletes, por ejemplo). Los porcentajes mínimos y máximos pueden estar en cualquier orden (
[min, max]
y[max, min]
ambos son aceptables). Los porcentajes de peso exactos no necesitan ser procesados de manera diferente a otros porcentajes y pueden representarse con valores mínimos y máximos iguales.
Se aplican reglas estándar para el código de golf : mientras escribe su código, mi plato de pasta se enfría, por lo que gana la presentación más corta.
Ejemplos
Dado que este problema es más difícil de lo que parece a primera vista, aquí hay una resolución paso a paso de algunos casos.
[40, ∅, ∅]
Llamemos respectivamente x
y y
los dos porcentajes faltantes.
- Debido a que viene después del primer ingrediente al 40%,
x
no puede ser superior al 40% en sí mismo.[40, [?, 40], [?, ?]]
- La suma de los dos porcentajes que faltan es siempre del 60%. En consecuencia:
- Si
x
toma su valor máximo ,y
toma su valor mínimo , que es, por lo tanto, 60% - 40% = 20%.[40, [?, 40], [20, ?]]
- Si
x
toma su valor mínimo ,y
toma su valor máximo . Perox
no puede ser inferior ay
, por lo tanto, en este caso,x
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Si
[70, ∅, ∅, 5, ∅]
Llamemos respectivamente x
, y
y z
los tres porcentajes faltantes.
- Los porcentajes mínimos y máximos para
z
son necesariamente entre 0% y 5%. Supongamosz
= 0% por un momento. La suma de los dos porcentajes que faltan es siempre del 25%. En consecuencia:[70, [?, ?], [?, ?], 5, [0, 5]]
- Si
y
toma su valor mínimo , 5%,x
toma su valor máximo , que es, por lo tanto, 25% - 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Si
y
toma su máximo valor ,x
toma su valor mínimo . Perox
no puede ser inferior ay
, por lo tanto, en este caso,x
=y
= 25% / 2 = 12.5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Si
- Verifiquemos que todo esté bien si asumimos ahora que
z
= 5%. La suma de los dos porcentajes que faltan es siempre del 20%. En consecuencia:- Si
y
toma su valor mínimo , 5%,x
toma su valor máximo , que es por lo tanto 20% - 5% = 15%. Este caso ya está incluido en los rangos calculados previamente. - Si
y
toma su valor máximo ,x
toma su valor mínimo . Perox
no puede ser inferior ay
, así que en este caso,x
=y
= 20% / 2 = 10%. Este caso ya está incluido en el rango previamente calculado paray
, pero no parax
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Si
Casos de prueba
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, ∅, ∅]
y[70, ∅, ∅, 5, ∅]
con las cosas tienen un poco más claramente. Un desafío debe ser claro sin mirar los casos de prueba, que no es el caso en este momento. Si lo entiendo correctamente para[40, ∅, ∅]
: 60 más es necesario para el 100%, dividido entre estos dos∅
. El primero∅
tiene que ser 30 o superior (de lo contrario, el segundo∅
estará por encima, lo que no debería ser posible cuando estén en orden). Además, no puede estar arriba40
, por lo que el primero se∅
convierte[30,40]
y el segundo se convierte[(100-40-40=)20, (100-40-30=)30]
.[min,max]
/[max,min]
mixto permitido?[min,max]
y[max,min]
es casi aceptable, pero como no puede conducir a resultados ambiguos, diría que está bien.[70, 12, 11, 5, 2]
no funciona para su segundo ejemplo? Si funciona, el mínimo parax
sería menor que12.5
.Respuestas:
JavaScript (ES6), 252 bytes
Espera
0
porcentajes faltantes. Devuelve un par de valores mínimos y máximos para todas las entradas.Pruébalo en línea!
¿Cómo?
Inicialización
Primero reemplazamos cada valor en la matriz de entrada a [] con el rango más grande posible.
Ejemplos:
Función principal
La función principal es h () . Busca la primera entrada que parece ser inconsistente cuando tratamos de minimizarla o maximizarla. Si encuentra uno, lo actualiza a un valor que es al menos temporalmente aceptable, dados los otros rangos.
Toma como entrada M = Math.max / I = 0 o M = Math.min / I = 1 y define J como I XOR 1 .
Debido a que h () se escribió para admitir los pases de minimización y maximización, el código es un poco difícil de comentar. Es por eso que nos enfocaremos solo en el pase de maximización, para lo cual tenemos M = Math.max , I = 0 y J = 1 . Con estos parámetros, el código dice lo siguiente:
Recursividad
La función recursiva g () sigue llamando a h () hasta que ni el pase de minimización ni el de maximización conducen a una nueva corrección, y finalmente devuelve el resultado final.
fuente
[38,0,10,0,0,0,0,0,0,0]
.