Você recebe uma lista de números L = [17, 5, 9, 17, 59, 14], uma bolsa de operadores O = {+:7, -:3, *:5, /:1}e um número N = 569.
Tarefa
Emita uma equação que usa todos os números no Llado esquerdo e apenas o número Nno lado direito. Se isso não for possível, produza False. Solução de exemplo:
59*(17-5)-9*17+14 = 569
Limitações e esclarecimentos
- Você não pode concatenar números (
[13,37]não pode ser usado como1337) - Somente números naturais e zero aparecerão em
L. - A ordem
Lnão importa. - Você deve usar todos os números em
L. - Apenas os operadores
+,-,*,/aparecerá naO. Opode ter mais operadores do que você precisa, mas pelo menos|L|-1operadores- Você pode usar cada operador quantas vezes quiser até o valor em
O. - Todas as quatro operações em
Osão as operações matemáticas padrão; em particular,/é a divisão normal com frações exatas.
Pontos
- Quanto menos pontos, melhor
- Cada caractere do seu código fornece um ponto
Você deve fornecer uma versão não-golfe que seja fácil de ler.
fundo
Uma pergunta semelhante foi feita no Stack Overflow. Eu pensei que poderia ser um desafio interessante de código-golfe.
Complexidade computacional
Como Peter Taylor disse nos comentários, você pode resolver a soma do subconjunto com isso:
- Você tem uma instância da soma do subconjunto (portanto, um conjunto S de números inteiros e um número x)
- L: = S + [0, ..., 0] (| S | vezes um zero), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Agora resolva esta instância do meu problema
- A solução para a soma do subconjunto é o número de S que não é multiplicado por zero.
Se você encontrar um algoritmo que é melhor que O (2 ^ n), você prova que P = NP. Como P vs NP é um problema do prêmio do milênio e, portanto, vale US $ 1.000.000, é muito improvável que alguém encontre uma solução para isso. Então eu removi esta parte do ranking.
Casos de teste
As seguintes não são as únicas respostas válidas, existem outras soluções e são permitidas:
- (
[17,5,9,17,59,14],{+:7, -:3, *:5, /:1},569)
=>59 * (17-5)- 9 * 17 + 14 = 569 - (
[2,2],{'+':3, '-':3, '*':3, '/':3},1)
=>2/2 = 1 - (
[2,3,5,7,10,0,0,0,0,0,0,0],{'+':20, '-':20, '*':20, '/':20},16)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16 - (
[2,3,5,7,10,0,0,0,0,0,0,0],{'+':20, '-':20, '*':20, '/':20},15)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/≡ div), apenas ponto flutuante e erros de esperança de não arredondamento, ...?
5+10+2*3+7*0+0...
m = |L|? Se sim, como você pode esperar que o tempo de execução não dependa do tamanho dessa lista? Por exemplo[2,2],[+,+,...,+,/],1,. De fato, como n é O (m), você pode escrever tudo em termos de m.