Vamos falar sobre divisores ...
Deixando quadrados perfeitos (por um momento), todos os números inteiros positivos podem ser expressos como o produto de 2 de seus divisores. Exemplo rápido para 126
: Aqui estão todos os divisores de126
Como você pode ver, todos os divisores podem ser emparelhados. Aqui está o que chamaremos de pares divisores :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]
Para esse desafio, precisaremos apenas do último par desta lista (que é o par central da figura):. Vamos
[9,14]
chamar esse par de Par MaxMin Divisor .
A diferença do par MaxMin divisor (DMDP) é a diferença dos dois elementos do par, que é [9,14]=5
mais um exemplo 544
. Os divisores são:
[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]
e DMDP (544) = 15 porque32-17=15
E os quadrados perfeitos ? Todos os quadrados perfeitos têm DMDP = 0
Vamos pegar, por exemplo, 64
com divisores
{1, 2, 4, 8 , 16, 32, 64}
Como você pode ver neste caso, o MaxMin Divisor Pair é o [8,8]
que DMDP=0
temos quase pronto.
O desafio
Dado um número inteiro n>0
, a saída quantas inteiros menor ou igual a 10000
, têm DMDP menos de n
Casos de teste
entrada -> saída
1->100 (those are all the perfect squares)
5->492
13->1201
369->6175
777->7264
2000->8478
5000->9440
9000->9888
10000->10000
20000->10000
Este é o código-golfe . A resposta mais curta em bytes vence .
10000
como um segundo variável?Respostas:
JavaScript (ES7), 60 bytes
Provavelmente excede seu limite de recursão, portanto, você pode preferir a versão iterativa para 70 bytes:
fonte
Gelatina , 13 bytes
1 byte graças a Jonathan Allan.
Experimente online!
fonte
ÆDạ"Ṛ$Ṃ
você economiza um byte sobreÆDạ:@¥⁸Ṃ
(eu tinhaạ"ṚṂ
...ȷ4RÆDÇ€<⁸S
para 15 - muito semelhantes - EDIT: hmm ou era, não:
envolvido ... o que você acha?)Java 8,
151111110101 bytes-10 bytes graças a @Nevay .
Explicação:
Experimente aqui.
fonte
for(i=1,i+=Math.sqrt(x);--i>0;)if(...
para salvar 1 byte.n->{int r=0,x=10000,i;for(;x-->0;r-=i-n>>-1)for(i=x;i-->1;)if(x>=i*i&x%i<1){i=x/i-i;break;}return r;}
x>=i*i
como alternativa para o usoMath.sqrt
, já que esta é a segunda vez que você joga isso no meu código.R , 73
77bytesObrigado a @Guiseppe pelos 4 bytes
Experimente online!
Perdeu a função vetorizar para calcular o DMDP e agora está usando um sapply sobre a função. As verdades para itens menores que a entrada são somadas para o resultado.
fonte
sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())
é um pouco mais curtoMathematica, 64 bytes
Experimente na Wolfram Sandbox
Uso
Explicação
Gere as listas de divisores, de
1
para10000
. (as listas de divisores são classificadas automaticamente)Contar as ocorrências de elementos
a
, de modo que ...(input) + (left one of the middle element(s)) > (right one of the middle element(s))
Se houver apenas um elemento do meio, esquerda = direita.fonte
05AB1E ,
191817161512 bytesExperimente online!
Explicação
fonte
MATL , 20 bytes
O código atinge o tempo limite no TIO. Aqui está um exemplo executado com o compilador offline:
fonte
R , 91 bytes
Adota uma abordagem (pior) diferente para calcular o DMDP do que a solução da MickyT usando indexação de matriz e
diff
calculá-la. Alas.Experimente online!
fonte
Mathematica,
119115 bytesEu finalmente tenho essa coisa trabalhando e eu tenho tentado durante a última meia hora. ._.
Exemplo de execução
fonte
Cases
é4
bytes mais curto:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&
. Veja esta dica .Count
é ainda mais curto queCases
.Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]&
10^4
ou1*^4
é menor que10000
e/@Range@
é equivalente a~Array~
.Mathematica, 78 bytes
fonte
Cases
é4
bytes mais curto:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&
. Veja esta dica .Count
é ainda mais curto:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]&
Casca , 19 bytes
Nenhum link TIO, pois o tempo limite é excedido. Esta versão usa 100 no lugar de 10000 e termina em alguns segundos.
Explicação
Husk ainda não possui divisores ou suporte para notação científica.
fonte
Japt ,
251917 bytesTeste-o
Explicação
Entrada implícita de número inteiro
U
.Gere uma matriz de números inteiros (
õ
) de 1 a 100 (L
) ao quadrado.Passe cada um por uma função (onde
X
está o elemento atual) que gera uma matriz dos divisores (â
) deX
.Mapeie essa matriz de divisores, onde
Z
está o elemento atual.Obtenha a diferença absoluta (
a
) deZ
eX
dividida porZ
.Algum dos elementos (
d
) na matriz resultante é menor queU
?Conte os elementos verdadeiros e produza implicitamente o resultado.
fonte
Ruby, 62 bytes
Experimente online.
fonte
TI-BASIC, 46 bytes
Observe que o TI-BASIC é um idioma tokenizado. Além disso, o E na linha 2 é um pequeno E maiúsculo, encontrado pressionando 2ND +,.
O resultado estará em D e Ans imediatamente após a execução do programa. Para que seja exibido,
Ans
basta adicionar mais dois bytes (nova linha e ).fonte
Python 2 , 134 bytes
Experimente online!
Eugh ... precisa fazer muito melhor.
fonte
len(filter(lambda n:n<i,...))
porsum(n<i for n in ....)
Python 2 , 83 bytes
Um pouco devagar, usa 5 segundos por caso de teste
Experimente online!
fonte
PHP, 94 + 1 bytes
Execute como pipe
-nR
ou experimente online .fonte
VB.NET (.NET 4.5)
116115 bytesExplicação:
Uma função que assume
n
como parâmetro e retorna o resultado.Inicia na raiz quadrada e procura o número inteiro mais próximo que divide uniformemente (será o menor do
MaxMin Divisor Pair
). Em seguida, obtém o maior do par (i/s
), encontra a diferença e compara com a entrada.Estratégias de golfe usadas:
Dim
é caro, então, quanto menos variáveis eu declarar, melhor.s
como um tipo integral, ele lança no chão para mim.^
como expoente. Então, enquanto10000
tem 5 caracteres,10^4
é apenas 4.return
, o valor da variável da função será retornado. Então, eu salvo os caracteres, não declarando uma variável separada e não usando uma instrução de retorno.i
é assumidoInteger
porque eu atribuí um literal inteiro.A
é assumido,Object
mas assim que adiciono um número inteiro, ele se comporta como umInteger
.if
verificar se a diferença é satisfatória, adicione-a diretamente ao resultado convertendo o booleano em um número inteiro. No entanto, o VB usa-1
paraTrue
, então subtraia para obter o sinal correto.Mod
não ser0
. Tomar o módulo de um número negativo no VB.NET dará um resultado negativo. Mas, tudo é positivo para que eu possa salvar um byte, transformando-o<>
em>
.Byte
armazenar isso, salvando bytes na declaração usando um tipo nomeado mais curto.Experimente online!
fonte
C # (.NET Core) , 104 bytes
Experimente online!
fonte