Introdução
Este é um dos meus quebra-cabeças matemáticos favoritos.
Dado um dígito (digamos 3) e o número de vezes para usá-lo (digamos 5), gere 10 expressões que resultam em 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10 usando apenas +, -, ×, ÷, ^ e √ (raiz) (colchetes são permitidos para agrupar operações).
Por exemplo:
(3^3 + 3)/(3 + 3) = (33 - 3)/(3 + 3) = 3 + 3/3 + 3/3 = 5
Observe que todas as opções acima usam cinco 3 e as operações matemáticas e resultam em 5. Você também pode usar um 3 antes de √ para indicar uma raiz do cubo. O mesmo vale para o uso de 4 antes de √ para denotar uma quarta raiz.
Observe também que dois 3 podem ser usados para formar 33 ou três 3 podem ser usados para formar 333 e assim por diante.
Desafio
- Você receberá dois números (ambos variando de 1 a 5) como argumento de função, STDIN ou argumento de linha de comando.
- O primeiro número indica qual dígito usar e o segundo número indica o número de vezes que esse dígito deve ser usado na expressão.
- Seu programa deve gerar uma matriz de tamanho 10 (ou 10 números separados por espaço), em que cada elemento indica se uma expressão matemática (usando apenas os operadores permitidos) resultante do
(index + 1)
número é possível ou não usando um valor de verdade / falsidade.
Por exemplo, se a entrada for
1 3
Então a saída deve ser
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1]
porque apenas 1, 2, 3 e 10 podem ser expressos usando três 1s.
Ponto
- Este é um código-golf, portanto o comprimento mínimo do código em bytes vence.
Bônus
Imprimir em tudo [-50]
Subtraia 50 da sua pontuação se os elementos da matriz de saída forem iguais ao número total de combinações plausíveis para obter o (index + 1)
valor em vez de valores verdadeiros ou falsos.
Por exemplo, se há apenas três possíveis combinações de cinco 3 de que resultam a 5, em seguida, a matriz de saída de 4 th entrada deve ser de 3.
Matemática Extrema [-100]
Subtraia 100 da sua pontuação se os elementos da matriz de saída contiverem pelo menos uma das expressões reais que resultam no (index + 1)
valor.
Por exemplo, se usando cinco de 3, 4 da matriz de saída th entrada pode ser qualquer um (3^3 + 3)/(3 + 3)
, (33 - 3)/(3 + 3)
ou3 + 3/3 + 3/3
Excesso de habilidades [-200]
Subtraia 200 da sua pontuação se os elementos da matriz de saída contiverem todas as combinações possíveis (separadas por |
). Este bônus é adicionado sobre o bônus Extreme Maths , para que você obtenha -300 no total.
Por exemplo, se usando cinco de 3, 4 da matriz de saída th elemento deve ser(3^3 + 3)/(3 + 3)|(33 - 3)/(3 + 3)|3 + 3/3 + 3/3
Nota: Quaisquer duas expressões para obter o mesmo resultado devem ser logicamente diferentes, com uma abordagem diferente em ambas.
Por exemplo, obter 5 usando cinco 3 3 + 3/3 + 3/3
é igual 3/3 + 3 + 3/3
ou 3/3 + 3/3 + 3
porque a mesma abordagem é adotada para cada um deles. (3^3 + 3)/(3 + 3)
e (33 - 3)/(3 + 3)
diferem, pois os 30 no numerador são alcançados por diferentes abordagens.
ATUALIZAÇÃO : Após analisar todas as respostas, verificou-se que todas as respostas apresentavam imperfeições devido a casos extremos de unários -
e √. Assim, a falta desses casos extremos foi considerada aceitável, na medida em que as respostas estejam completas.
Essa é uma pergunta difícil, mas interessante.
Feliz golfe!
fonte
1
segundos?Respostas:
Python 3 (imperfeito), 449 - 300 = 149
Sofre com as mesmas deficiências da solução da KSab : nenhum operador unário, totalmente entre parênteses, contém expressões equivalentes como
(1+1)+1
e1+(1+1)
. Eu eliminei duplicatas exatas passando os resultados paraset()
. A saída pode ser um pouco mais feia para salvar alguns bytes, mas eu gosto dessa maneira. Eu também não criei enésimas raízes, porque não parece que elas compram muito nesse problema.Isso levará alguns minutos para ser executado se o segundo argumento for 5. Teste chamando
m(digit, number)
:fonte
Python (imperfeito)
493474 - 300 = 174Há um número razoável de problemas com esta solução, primeiro que ela ignora qualquer expoente muito grande (qualquer um em que o expoente seja maior que 100). Na verdade, acho que isso não remove possibilidades de entradas menores ou iguais a 5, mas não tenho 100% de certeza.
Outra coisa é que ela não considera nenhuma raiz quadrada unária, pois seria complicada (qualquer solução com qualquer termo igual a 0 ou 1 produziria um número infinito de soluções). Também não considera nenhuma negação unária (o símbolo '-') pela mesma razão, bem como o fato de que não tenho certeza se a pergunta foi feita.
Também considerei quais critérios deveriam decidir se duas expressões eram equivalentes, mas não consegui encontrar uma maneira de defini-la rigorosamente de uma maneira que me pareceu intuitiva; portanto (pelo menos por enquanto) não implementei nada disso. Isso significa que ele produz muitos resultados e também usa parênteses de uma maneira bastante ingênua.
Em uma nota lateral, acho que isso pode incluir a linha de código mais longa que eu escrevi, especialmente antes de ter sido totalmente jogada no golfe.
Exemplo: ('v' representa '√')
fonte
L
:L=lambda D,N:[(int(str(D)*N),str(D)*N)]+[(o(u,v),"(%s%s%s)"%(s,c,t))for p in R(1,N)for u,s in L(D,p)for v,t in L(D,N-p)for c,o in[('+',F('a+b')),('-',F('a-b')),('*',F('a*b')),('/',F("1.*a/b if b else''")),('^',F("''if(a<0 and int(b)!=b)|(a and b<0)or b>100 else a**b")),('v',F("''if a==0 or(b<0 and int(1./a)!=(1./a))or(b or a<0)or(1./a)>100 else b**(1./a)"))]if o(u,v)!='']
0
, tentei negar a declaração e depois trocar as consequências. Também encontrei alguns lugares para usar|
e em&
vez deor
eand
. Ambos os truques poderia ser usado para encurtar a última chamada para F, mas que se poderia exigir algum Demorgan de e eu corri para fora de tempo bico; peval
- levei um bom tempo para descobrir sua segunda linha! Eu acho que eu tenho você na "linha mais longa", no entanto. ;) Concordo em ignorar grandes expoentes; na verdade, acho que qualquer expoente maior que 9 não será útil (exceto como não operacional quando a base for 1).3 = 33 √ (3 ^ 33)
. Na verdade, ao escrever isso, percebo que duas (provavelmente as únicas duas?) Combinações que minha resposta não tem4 = (4^4) √ (4 ^ (4^4))
e a expressão equivalente a5
s. É certo que as raízes parecem não acrescentar muito ao problema, pois a grande maioria delas é usada como não operacional em 0 ou 1, não operacional quando a raiz é 1 ou apenas para cancelar um poder.Python 3 -
349346Aqui está uma versão bastante não-destruída:
Para testar, recomendo mudar
(9)
para algo menor, pois esse é o número de múltiplas raízes quadradas consideradas, o que tem um enorme impacto no desempenho.Finalmente, isso me fez pensar, se o menos unário é realmente necessário em alguns casos ...
fonte
1 = 3^3 * 3^(-3)
, mas, mesmo considerando estes, duvido que haja números para os quais essa seja uma solução possível quando não houver outros.a**.5**%i
vez dea**(1/2**%i)
calcular as várias raízes quadradas.Mathematica - 246 caracteres (nenhum bônus reivindicado)
Explicação
A função
j
concatena dois números digitos.A função
z
obtém um resultador
, númeron
e lista de funçõesL
, cada uma delas operando com dois argumentos. Em seguida, aplica a lista de funções seqüencialmente aos argumentos[r,n]
usando recursão, até que a lista esteja vazia e, em seguida , retorna o resultado.A função
a
obtém um númeron
e um número de cópiast
. Ele cria todas as tuplas de comprimento (t-1) da lista de funções{Plus, f, Times, g, Power, h, j}
e envia cada tupla através da função z; em seguida, retorna uma lista de todos os números de 1 a 10 que foram criados.Exemplo de execução
a[2,3]
retornando{1, 2, 3, 6, 8}
.Limitações
Como a lista de funções é aplicada seqüencialmente, consumindo uma cópia do número a cada vez, ela pode perder algumas combinações. Por exemplo, ao operar com quatro pares, ele perderia 22/22 = 1 devido à sua incapacidade de avaliar a lista de funções fora de ordem. Obviamente, 2/2 * 2/2 = 1 cobre este caso.
fonte