Hablemos de divisores ...
Dejando a un lado los cuadrados perfectos (por un momento), todos los enteros positivos se pueden expresar como el producto de 2 de sus divisores. Ejemplo rápido de 126
: Aquí están todos los divisores de126
Como puede ver, todos los divisores se pueden emparejar. Esto es lo que llamaremos los pares divisores :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]
Para este desafío, solo necesitaremos el último par de esta lista (que es el par central de la imagen):
[9,14]
llamaremos a este par el par divisor MaxMin .
La diferencia de MaxMin Divisor Pair (DMDP) es la diferencia de los dos elementos del par, que es [9,14]=5
un ejemplo más 544
. Los divisores son:
[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]
y DMDP (544) = 15 porque32-17=15
¿Qué pasa con los cuadrados perfectos ? Todos los cuadrados perfectos tienen DMDP = 0
Tomemos por ejemplo 64
con divisores
{1, 2, 4, 8 , 16, 32, 64}
Como puede ver en este caso, el par divisor MaxMin es el [8,8]
que DMDP=0
casi hemos terminado.
El reto
Dado un número entero n>0
, genere cuántos enteros menores o iguales que 10000
, tienen DMDP menor que n
Casos de prueba
entrada -> salida
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 es el código de golf. La respuesta más corta en bytes gana .
10000
como segunda variable?Respuestas:
JavaScript (ES7), 60 bytes
Probablemente exceda su límite de recursión, por lo que puede preferir la versión iterativa para 70 bytes:
fuente
Jalea , 13 bytes
1 byte gracias a Jonathan Allan.
Pruébalo en línea!
fuente
ÆDạ"Ṛ$Ṃ
te ahorra un byteÆDạ:@¥⁸Ṃ
(teníaạ"ṚṂ
...ȷ4RÆDÇ€<⁸S
por 15 - demasiado similar - EDITAR: hmm o no, no:
involucrado ... ¿qué piensas?)Java 8,
151111110101 bytes-10 bytes gracias a @Nevay .
Explicación:
Pruébalo aquí
fuente
for(i=1,i+=Math.sqrt(x);--i>0;)if(...
para guardar 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 usarMath.sqrt
, ya que esta es la segunda vez que juegas eso en mi código.R , 73
77bytesGracias a @Guiseppe por los 4 bytes
Pruébalo en línea!
Perdí la función vectorizar para calcular el DMDP y ahora está usando una aplicación sobre la función. Las verdades para los elementos que son menores que la entrada se suman para el resultado.
fuente
sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())
es un poco más cortoMathematica, 64 bytes
Pruébalo en Wolfram Sandbox
Uso
Explicación
Genere las listas de divisores, desde
1
hasta10000
. (las listas de divisores se ordenan automáticamente)Cuente las ocurrencias de elementos
a
, de modo que ...(input) + (left one of the middle element(s)) > (right one of the middle element(s))
Si solo hay un elemento central, izquierda = derecha.fuente
05AB1E ,
191817161512 bytesPruébalo en línea!
Explicación
fuente
MATL , 20 bytes
El código agota el tiempo de espera en TIO. Aquí hay un ejemplo ejecutado con el compilador fuera de línea:
fuente
R , 91 bytes
Adopta un enfoque diferente (peor) para calcular el DMDP que la solución de MickyT mediante el uso de indexación de matriz y
diff
para calcularlo. Pobre de mí.Pruébalo en línea!
fuente
Mathematica,
119115bytesMe finalmente conseguí esta cosa de trabajo y he estado tratando durante la última media hora. ._.
Ejecución de ejemplo
fuente
Cases
es4
bytes más corto:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&
. Mira este consejo .Count
es incluso más corto queCases
.Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]&
10^4
o1*^4
es más corto que10000
, y/@Range@
es equivalente a~Array~
.Mathematica, 78 bytes
fuente
Cases
es4
bytes más corto:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&
. Mira este consejo .Count
es aún más corto:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]&
Casco , 19 bytes
No hay enlace TIO, ya que se agota el tiempo de espera. Esta versión usa 100 en lugar de 10000 y termina en un par de segundos.
Explicación
Husk no tiene divisores incorporados o soporte para notación científica todavía.
fuente
Japt ,
251917 bytesPruébalo
Explicación
Entrada implícita de entero
U
.Genere una matriz de enteros (
õ
) de 1 a 100 (L
) al cuadrado.Pase cada uno a través de una función (donde
X
está el elemento actual) que genera una matriz de los divisores (â
) deX
.Mapa sobre ese conjunto de divisores, donde
Z
está el elemento actual.Obtenga la diferencia absoluta (
a
) deZ
yX
dividida porZ
.¿Alguno de los elementos (
d
) en la matriz resultante es menor queU
?Cuente los elementos de verdad y genere implícitamente el resultado.
fuente
Ruby, 62 bytes
Pruébalo en línea.
fuente
TI-BASIC, 46 bytes
Tenga en cuenta que TI-BASIC es un lenguaje tokenizado. Además, la E en la línea 2 es una E pequeña mayúscula, que se encuentra presionando 2ND +,.
El resultado estará en D y Ans inmediatamente después de la ejecución del programa. Si se va a mostrar,
Ans
sería suficiente agregar dos bytes más (nueva línea y ).fuente
Python 2 , 134 bytes
Pruébalo en línea!
Eugh ... necesito hacerlo mucho mejor.
fuente
len(filter(lambda n:n<i,...))
consum(n<i for n in ....)
Python 2 , 83 bytes
Un poco lento, usa 5 segundos por caso de prueba
Pruébalo en línea!
fuente
PHP, 94 + 1 bytes
Ejecutar como tubería
-nR
o probarlo en línea .fuente
VB.NET (.NET 4.5)
116115bytesExplicación:
Una función que toma
n
como parámetro y devuelve el resultado.Comienza en la raíz cuadrada y busca el número entero más cercano que se divide de manera uniforme (será el más pequeño de los
MaxMin Divisor Pair
). Luego obtiene el mayor del par (i/s
), encuentra la diferencia y compara con la entrada.Estrategias de golf utilizadas:
Dim
es caro, por lo que cuantas menos variables declaro mejor.s
como un tipo integral, se echa al suelo por mí.^
como exponente. Entonces, si bien10000
tiene 5 caracteres,10^4
solo tiene 4.return
, se devolverá el valor de la variable de función. Así que guardo los caracteres al no declarar una variable separada y al no usar una declaración de retorno.i
se suponeInteger
porque asigné un literal entero.A
se supone,Object
pero tan pronto como agrego un número entero, se comporta como unInteger
.if
comprobar que la diferencia es satisfactoria, agréguela directamente al resultado convirtiendo el valor booleano en un entero. Sin embargo, VB usa-1
forTrue
, así que resta para obtener el signo correcto.Mod
no serlo0
. Tomar el módulo de un número negativo en VB.NET dará un resultado negativo. Pero, todo es positivo, así que puedo guardar un byte convirtiéndome<>
en>
.Byte
para almacenar eso, guardando bytes en la declaración usando un tipo con nombre más corto.Pruébalo en línea!
fuente
C # (.NET Core) , 104 bytes
Pruébalo en línea!
fuente