fundo
Na França, e provavelmente no resto da União Europeia, qualquer alimento disponível para venda deve listar os ingredientes que o compõem em sua embalagem, em ordem decrescente de porcentagem em peso . No entanto, a porcentagem exata não precisa ser indicada, a menos que o ingrediente seja destacado pelo texto ou uma imagem na capa.
Por exemplo, meu molho de tomate com manjericão, mostrando apenas grandes tomates vermelhos e lindas folhas de manjericão em sua embalagem, tem as seguintes indicações:
Ingredientes: Tomate 80%, cebola em pedaços, manjericão 1,4%, sal marinho, purê de alho, açúcar bruto de cana, azeite extra-virgem, pimenta do reino.
Parece saboroso, mas ... quantas cebolas vou comer exatamente?
Desafio
Dada uma lista de porcentagens de peso em ordem decrescente, eventualmente incompleta, produz uma lista completa das porcentagens de peso mínima e máxima que podem ser encontradas na receita.
- Você pode escrever uma função ou um programa completo.
- A entrada pode estar em qualquer forma razoável (matriz de números ou lista de cadeias, por exemplo). Os valores fracionários devem ser suportados pelo menos com uma casa decimal. Uma percentagem em peso em falta pode ser representado de qualquer maneira consistente e inequívoco (
0
,'?'
ounull
, por exemplo). Você pode assumir que a entrada sempre será associada a uma receita válida ([70]
e[∅, ∅, 50]
é inválida, por exemplo). - A saída pode estar em qualquer forma razoável (uma matriz para as porcentagens de peso mínima e máxima, ou uma única lista de dupletos, por exemplo). As porcentagens mínima e máxima podem estar em qualquer ordem (
[min, max]
e[max, min]
são aceitáveis). As porcentagens exatas de peso não precisam ser processadas diferentemente de outras porcentagens e podem ser representadas por valores mínimos e máximos iguais.
Aplicam -se regras padrão para o código-golfe : enquanto você digita seu código, meu prato de macarrão está esfriando, para que o menor envio seja vencido.
Exemplos
Como esse problema é mais difícil do que parece à primeira vista, aqui está uma resolução passo a passo de alguns casos.
[40, ∅, ∅]
Vamos chamar respectivamente x
e y
as duas porcentagens ausentes.
- Porque vem após o primeiro ingrediente em 40%,
x
não pode ser superior a 40% em si.[40, [?, 40], [?, ?]]
- A soma das duas porcentagens ausentes é sempre 60%. Consequentemente :
- Se
x
obtém seu valor máximo ,y
obtém seu valor mínimo , que é, portanto, de 60% a 40% = 20%.[40, [?, 40], [20, ?]]
- Se
x
assume seu valor mínimo ,y
assume seu valor máximo . Masx
não pode ser menor quey
, portanto, neste caso,x
=y
= 60% / 2 = 30%.[40, [30, 40], [20, 30]]
- Se
[70, ∅, ∅, 5, ∅]
Vamos ligar respectivamente x
, y
e z
as três porcentagens ausentes.
- As porcentagens mínima e máxima para
z
estão necessariamente entre 0% e 5%. Vamos assumirz
= 0% por um momento. A soma das duas porcentagens ausentes é sempre de 25%. Consequentemente :[70, [?, ?], [?, ?], 5, [0, 5]]
- Se
y
obtém seu valor mínimo , 5%,x
obtém seu valor máximo , que é, portanto, de 25% a 5% = 20%.[70, [?, 20], [5, ?], 5, [0, 5]]
- Se
y
assume seu valor máximo ,x
assume seu valor mínimo . Masx
não pode ser menor quey
, portanto, neste caso,x
=y
= 25% / 2 = 12,5%.[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- Se
- Vamos verificar se está tudo bem se assumirmos agora que
z
= 5%. A soma das duas porcentagens ausentes é sempre 20%. Consequentemente :- Se
y
obtém seu valor mínimo , 5%,x
obtém seu valor máximo , que é, portanto, 20% - 5% = 15%. Este caso já está incluído nos intervalos calculados anteriormente. - Se
y
assume seu valor máximo ,x
assume seu valor mínimo . Masx
não pode ser menor quey
, portanto, neste caso,x
=y
= 20% / 2 = 10%. Este caso já está incluído no intervalo calculado anteriormente paray
, mas não parax
.[70, [10, 20], [5, 12.5], 5, [0, 5]]
- Se
Casos de teste
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, ∅]
para tornar as coisas um pouco mais claras. Um desafio deve ser claro sem olhar para os casos de teste, o que não é o caso no momento. Se eu entendi corretamente para[40, ∅, ∅]
: são necessários mais 60 por 100%, divididos por esses dois∅
. O primeiro∅
deve ser 30 ou superior (caso contrário, o segundo∅
estará acima dele, o que não deve ser possível quando eles estão em ordem). Além disso, não pode estar acima40
, então o primeiro∅
se torna[30,40]
e o segundo se torna[(100-40-40=)20, (100-40-30=)30]
.[min,max]
/[max,min]
ou misturado permitido?[min,max]
e[max,min]
é limite aceitável, mas como não pode levar a resultados ambíguos, eu diria que está tudo bem.[70, 12, 11, 5, 2]
não funciona no seu segundo exemplo? Se funcionar, o mínimo parax
seria menor que12.5
.Respostas:
JavaScript (ES6), 252 bytes
Espera
0
por porcentagens ausentes. Retorna um par de valores mínimo e máximo para todas as entradas.Experimente online!
Quão?
Inicialização
Primeiro, substituímos cada valor na matriz de entrada a [] pelo maior intervalo possível.
Exemplos:
Função principal
A função principal é h () . Ele procura a primeira entrada que parece inconsistente quando tentamos minimizá-la ou maximizá-la. Se encontrar um, ele será atualizado para um valor que seja pelo menos temporariamente aceitável, considerando os outros intervalos.
Ele assume como entrada M = Math.max / I = 0 ou M = Math.min / I = 1 e define J como I XOR 1 .
Como h () foi escrito para oferecer suporte a passes minimizadores e maximizadores, o código é um pouco complicado de comentar. É por isso que focaremos apenas no passe maximizador, para o qual temos M = Math.max , I = 0 e J = 1 . Com esses parâmetros, o código lê da seguinte maneira:
Recursão
A função recursiva g () continua chamando h () até que a passagem minimizadora ou a maximização não leve a uma nova correção e, eventualmente, retorne o resultado final.
fonte
[38,0,10,0,0,0,0,0,0,0]
.