Seu trabalho é converter decimais de volta na soma das raízes quadradas dos números inteiros. O resultado deve ter uma precisão de pelo menos 6 dígitos decimais significativos.
Entrada :
Um número indicando o número de raízes quadradas e um decimal indicando o número a ser aproximado.
Exemplo de entrada:
2 3.414213562373095
Saída : números inteiros separados por espaços que, quando somados e adicionados ao quadrado, têm aproximadamente o decimal original com precisão de pelo menos 6 dígitos decimais significativos.
Zeros não são permitidos na solução.
Se houver várias soluções, você precisará imprimir apenas uma.
Exemplo de saída (em qualquer ordem):
4 2
Isso funciona porque Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095
.
Isso é código de golfe. O código mais curto (com bônus opcional) vence!
Sempre haverá uma solução, mas -10 se o seu programa imprimir "Não" quando não houver solução com números inteiros. Além disso, -10 se o seu programa imprimir todas as soluções (separadas por novas linhas ou ponto-e-vírgula ou o que for) em vez de apenas uma.
Casos de teste:
3 7.923668178593959 --> 6 7 8
2 2.8284271247461903 --> 2 2
5 5.0 --> 1 1 1 1 1
5 13.0 --> 4 4 9 9 9 --> 81 1 1 1 1 --> 36 9 4 1 1 etc. [print any, but print all for the "all solutions bonus"]
E sim, seu programa precisa terminar em um tempo finito usando memória finita em qualquer máquina razoável. Não pode simplesmente funcionar "em teoria", é preciso ser capaz de testá-lo.
fonte
6 7 8
segundo bônus?Respostas:
Python 3, 90 - 10 = 80
(Muito obrigado ao @xnor por dicas, especialmente a reestruturação do loop for em um tempo)
Uma simples tentativa recursiva. Começa com o número alvo e subtrai raízes quadradas continuamente até atingir 0 ou menos. A função
S
pode ser chamada comoS(2,3.414213562373095)
(o segundo argumento é considerado positivo).O programa não apenas imprime todas as soluções, imprime todas as permutações de soluções (um pouco estranhas, eu sei). Aqui está a saída do último caso: Pastebin .
Um pequeno ajuste fornece uma solução de 98 - 10 = 88 que não imprime permutações, tornando-a mais eficiente:
E apenas por diversão, este 99 - 10 = 89 é o mais eficiente possível (ao contrário dos outros, ele não empurra a pilha
S(1,1000)
:Observe que, embora tenhamos um argumento padrão mutável, isso nunca causa um problema se executarmos novamente a função, pois
n+[i]
cria uma nova lista.Prova de correção
Para terminar em um loop infinito, precisamos atingir um ponto em que x <0 e 0,1 + x 2 > 1 . Isto é satisfeito fazendo x <-0,948 ... .
Mas observe que começamos do positivo x e x está sempre diminuindo, portanto, para atingir x <-0,948 ... devemos ter x '- i 0,5 <-0,948 ... para alguns x'> -0,948 .. . antes x e número inteiro positivo i . Para que o loop while seja executado, também devemos ter 0,1 + x ' 2 > i .
Reorganizando, obtemos x ' 2 + 1,889x' + 0,948 <i <0,1 + x ' 2 , as partes externas implicando que x' <-0,447 . Mas se -0.948 <x '<-0.447 , nenhum número inteiro positivo i pode ajustar a lacuna na desigualdade acima.
Portanto, nunca terminaremos em um loop infinito.
fonte
abs
comx*x<1e-12
.while
circuito funciona para substituir ofor
:while.1+x*x>i:S(x-i**.5,n+[i]);i+=1
, tendo iniciadoi=1
nos parâmetros de função. A idéia é evitar a necessidade de converter paraint
s. O.1
é para lidar com imprecisões de flutuação; Eu acho que é seguro contra loops infinitos.N
agora, com um argumento de função, é mais curto recuarN-1
e verificar quando, emN==0
vez delen(n)==N
..1
é seguro; Posso conversar com você, se quiser.ECLiPSe Prolog - 118 (138-20)
Eu usei a seguinte implementação do Prolog: http://eclipseclp.org/
Essa é uma abordagem muito ingênua e exponencial. A listagem de todas as soluções possíveis leva tempo para cobrir todas as combinações ( editar : o intervalo de números inteiros visitados agora diminui a cada etapa, o que remove muitas combinações inúteis).
Segue uma transcrição de uma sessão de teste. Por padrão, o ambiente tenta encontrar todas as soluções possíveis (-10) e imprime "Não" quando não consegue fazê-lo (-10).
Como o Sp3000 observou corretamente no comentário, ele também imprime "Sim" quando obtém êxito. Isso certamente significa que posso remover mais 10 pontos ;-)
(Editar) Em relação ao desempenho, é bastante bom, pelo menos em comparação com outros (veja, por exemplo, este comentário de FryAmTheEggman ). Primeiro, se você deseja imprimir todos os resultados, adicione o seguinte predicado:
Consulte http://pastebin.com/ugjfEHpw para obter o caso (5,13.0), que termina em 0,24 segundos e encontra 495 soluções (mas talvez eu esteja faltando algumas soluções, não sei).
fonte
Erlang,
305-10302-10Esta função retorna a string "No" ou uma string com valores separados por espaços. (Ineficientemente) processa todos os valores possíveis que os codificam em um número inteiro grande e começam com valores mais altos. 0 não são permitidos na solução e 0 codificado representa todos. Erro ao quadrado.
Exemplo:
Por favor, seja paciente,
f(5,13.0)
pois o espaço de pesquisa de funções é 13 ^ 10. Pode ser feito mais rápido com 2 bytes adicionais.fonte
Python
32:173159 - 10 = 149Explicação: Cada solução tem o formato x_1 x_2 ... x_n com 1 <= x_1 <= x ^ 2 em que x é a soma de destino. Portanto, podemos codificar cada solução como um número inteiro na base x ^ 2. O loop while itera sobre todas as possibilidades (x ^ 2) ^ n. Então eu converto o número inteiro de volta e testo a soma. Bem direto.
Ele encontra todas as soluções, mas o último caso de teste leva muito tempo.
fonte
JavaScript (ES6) 162 (172 - 10)
173Editar Um pouco mais curto, um pouco mais lento.
Como uma função com 2 parâmetros, imprima para o console javascript. Isso imprime todas as soluções sem repetições (as tuplas de soluções já são geradas e classificadas).
Eu me importava mais com o tempo do que com a contagem de caracteres, para que ele fosse facilmente testado em um console do navegador dentro do prazo padrão do javascript.
(Atualização de fevereiro de 2016) Hora atual do último caso de teste: cerca de 1
150 segundos. Requisitos de memória: insignificante.Versão ES 5 Qualquer navegador
Snippet de teste que deve ser executado em qualquer navegador recente
( Editar ) Abaixo estão os resultados no meu PC quando publiquei esta resposta há 15 meses. Eu tentei hoje e é 100 vezes mais rápido no mesmo PC, apenas com uma versão alfa de 64 bits do Firefox (e o Chrome fica muito atrás)! - hora atual com o Firefox 40 Alpha de 64 bits: ~ 2 s, Chrome 48: ~ 29 s
Saída (no meu PC - o último número é o tempo de execução em milissegundos)
fonte
Matemática - 76 - 20 = 56
Exemplos
fonte
No
? Além disso, a saída não é separada por espaço. Além disso, você não pode usar emTr@
vez dePlus@@
? E você pode salvar alguns caracteres alterandoSelect
paraCases
, a função no final de um padrão, e criandof
uma função pura sem nome.Haskell,
8780 - 10 = 70Este é um algoritmo recursivo semelhante ao programa Python 3 do @ Sp3000. Consiste em uma função infix
#
que retorna uma lista de todas as permutações de todas as soluções.Com uma pontuação de
102 9992 - 10 = 82 , podemos imprimir cada solução apenas uma vez, classificada:fonte
Pitão
55 5447-20 = 27Experimente online.
Desavergonhadamente empresta o comentário de xnor ;)
Isso ficará sem memória em qualquer computador são, mesmo para um valor parecido
5,5.0
. Define uma função,,g
que pode ser chamada comog 3 7.923668178593959
.Esse programa python 3 usa essencialmente o mesmo algoritmo (simplesmente não imprime "Não" no final, o que pode ser feito atribuindo uma variável a todos os resultados e depois escrevendo
print(K if K else "No")
), mas usa um gerador, portanto receba um erro de memória (ainda levará muito tempo, mas eu o fiz imprimir conforme encontra os valores):Isso deu exatamente os mesmos resultados que o @ Sp3000 obteve. Além disso, isso levou vários dias para terminar (eu não cronometrei, mas cerca de 72 horas).
fonte
Python 3 -
157174169 - 10 = 159Edit1: alterado o formato de saída para números inteiros separados por espaço, em vez de separados por vírgula. Obrigado pela dica de remover os aparelhos ao redor (n, x).
Edit2: Obrigado pelas dicas de golfe! Posso cortar outros 9 caracteres se eu apenas usar um teste == em vez de testar a igualdade aproximada dentro de 1e-6, mas isso invalidaria soluções aproximadas, se houver alguma.
Usa ferramentas para gerar todas as combinações possíveis possíveis, espero que com eficiência :)
Não encontrei uma maneira de adicionar a impressão "Não" com eficiência, sempre parece ter mais de 10 caracteres extras.
fonte
n,x
.SyntaxError
s quando tento aeval
linha ... #from itertools import*
salva 1, remove o espaçoz**.5for
economiza 1 e remove o[]
insum(z**.5for z in c)
saves 2 e removendo o()
inif(...)
saves 1. #n,x=input()
seriam mais compactos?Scala (397 bytes - 10)
Se não houver permutações, este programa não imprime nada.
fonte