Eu estava trabalhando em uma pergunta de matemática com um amigo meu e decidimos escrever um script que encontrasse a resposta. A pergunta original é a seguinte:
A diferença de dois números naturais é 2010 e seu maior denominador comum é 2014 vezes menor que a menor multiplicação comum. Encontre todas as soluções possíveis.
Começamos a escrever o programa independentemente um do outro e, quando funcionou, decidimos aumentar o número de bytes que pudéssemos gerenciar. Acabamos com essa bela linha de código em maravilhosos 89 bytes.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Queríamos ver se alguém consegue escrever um pedaço de código mais curto, que enumere os primeiros 1 milhão de i's. Se você for corajoso o suficiente para competir, poderá usar qualquer idioma que desejar, mas preferimos o Python 2 para poder comparar seu código com o nosso.
Aplicam-se regras usuais, os bytes mais curtos vencem. Aplicam-se as brechas de golfe com código padrão. "Brechas" padrão que não são mais engraçadas
Diverta-se!
Respostas:
Mathematica, 8 bytes
Prova de que 4 e 5092 são as únicas soluções: O problema original pode ser reescrito como
Vamos escrever x como 2 a 2 3 a 3 5 a 5 … e x + 2010 como 2 b 2 3 b 3 5 b 5 … Então a equação se torna
Desde 2014 = 2 × 19 × 53, temos
portanto
portanto
Existem apenas 8 opções possíveis, e poderíamos facilmente verificar se 4 e 5092 são as únicas soluções inteiras positivas.
Espere, eu ouço pessoas gritando brecha padrão ...
Mathematica, 45 bytes
fonte
Pitão
2725Experimente online.
Isso usa seu algoritmo de forma bastante ingênua ... Talvez eu consiga criar algo melhor ...
Filtra basicamente valores que não atendem ao critério de
range(10**6)
Obrigado a @xnor por apontar no bate-papo que
gcd(x,x+2010)==gcd(x,2010)
fonte
Python 3, 84 bytes
O FryAmTheEggman já sugeriu como fazer sua solução 88 bytes, para que eu não publique isso. Mas pensei em mostrar como você pode obter ainda menos bytes no Python 3:
(Obrigado por FryAmTheEggman pelas dicas)
Isso não funciona no Python 2 porque
print
não é uma função.Não tenho certeza se somos permitidos, mas se pudéssemos usar em
9**9
vez10**6
disso, seria outro byte.fonte
and
/or
... não teria pensado no python 3;) Mais sobre o tópico: Se a ordem não importa, acho que definirx=10**6
e fazerwhile x:x-=1;...
é um byte mais curto.R, 75 caracteres
Com quebras de linha:
fonte
GolfScript (41 bytes)
Ligue para os números
am
ebm
wheregcd(a, b) = 1
e wlogb > a
. Então a diferença ém(b-a) = 2010
, elcm(am, bm) = abm = 2014m
assimab=2014
.Fatores de 2014 são
e aqueles que têm diferenças que se dividem em 2010 são
Como estou operando em um idioma que não possui GCD ou LCM embutido, acho que essa análise provavelmente reduz o programa:
onde
44
éfloor(sqrt(2014))
.É possível chegar bem perto usando um loop ingênuo:
fonte
Perl6
6158565452Uma tradução bastante direta da sua fonte fornece
gcd
é um infix op no Perl6.^10**6
é a abreviação de0 ..^ 10**6
, onde os^
meios excluem esse número do intervalo.Claro que
i gcd (i+2010)
é o mesmo quei gcd 2010
eu posso salvar 3 caracteresSe eu usar em
$_
vez dei
, posso salvar outro par de caracteres. (.say
é a abreviação de$_.say
)Posso salvar outros caracteres usando em
... && .say
vez de.say if ...
, porque não preciso de espaço nos dois lados,&&
como faço paraif
.Desde que eu fiz as duas "otimizações" anteriores, posso usar o modificador de declaração de
for
, o que significa que posso remover{
e}
.Eu acho que é o mais curto possível sem usar um algoritmo diferente.
fonte
J, 26 bytes
Esses malditos verbos de 2 bytes ... :)
fonte
Dyalog APL, 29 caracteres
fonte
PARI / GP, 42 bytes
Eu sinto que existe uma solução extremamente elegante usando a
fordiv
construção do GP, mas ela não poderia competir com essa solução por pura brevidade.fonte
Raquete, 72 caracteres
fonte
λ
conta como 1 byte.Haskell, 52 caracteres
Trabalha no ambiente interativo Haskell GHCi.
fonte