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 L
lado esquerdo e apenas o número N
no 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
L
não importa. - Você deve usar todos os números em
L
. - Apenas os operadores
+
,-
,*
,/
aparecerá naO
. O
pode ter mais operadores do que você precisa, mas pelo menos|L|-1
operadores- Você pode usar cada operador quantas vezes quiser até o valor em
O
. - Todas as quatro operações em
O
sã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
fonte
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./
≡div
), apenas ponto flutuante e erros de esperança de não arredondamento, ...?5+10+2*3+7*0+0...
Respostas:
Python 2.7 / 478 caracteres
A idéia principal é usar a forma postfix de uma expressão para pesquisar. Por exemplo,
2*(3+4)
no formato postfix será234+*
. Portanto, o problema passa a ser encontrar uma permutação parcial deL
+O
que é avaliada comoN
.A versão a seguir é a versão não destruída. A pilha
stk
parece[(5, '5'), (2, '5-3', (10, ((4+2)+(2*(4/2))))]
.fonte
P[opr](v1, v2)
. Eu nunca pensei em combinar lambdas e dicionários como este, embora pareça óbvio agora.