Estaba trabajando en una pregunta de matemáticas con un amigo mío, y decidimos escribir un guión que encuentre la respuesta. La pregunta original es la siguiente:
La diferencia de dos números naturales es 2010 y su máximo común denominador es 2014 veces menor que su mínimo común multiplicador. Encuentra todas las soluciones posibles.
Comenzamos a escribir el programa independientemente uno del otro, y cuando funcionó, decidimos desarrollarlo para obtener la menor cantidad de bytes que pudiéramos administrar. Terminamos con esta hermosa línea de código en un maravilloso 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 si alguien logra escribir un código más corto, que enumere los primeros 1 millón de i. Si eres lo suficientemente valiente como para competir, puedes usar cualquier idioma que desees, pero preferiríamos que Python 2 pudiera comparar tu código con el nuestro.
Se aplican las reglas habituales, ganan los bytes más cortos. Se aplica el código estándar de lagunas de golf. "Lagunas" estándar que ya no son divertidas
¡Que te diviertas!
Respuestas:
Mathematica, 8 bytes
Prueba de que 4 y 5092 son las únicas soluciones: el problema original se puede reescribir como
Escribamos x como 2 a 2 3 a 3 5 a 5 ... y x + 2010 como 2 b 2 3 b 3 5 b 5 ... Entonces la ecuación se convierte en
Desde 2014 = 2 × 19 × 53, tenemos
Así
Así
Solo hay 8 opciones posibles, y podríamos comprobar fácilmente que 4 y 5092 son las únicas soluciones enteras positivas.
Espera, escucho a gente gritar escapatoria estándar ...
Mathematica, 45 bytes
fuente
Pyth
2725Pruébalo en línea.
Esto usa su algoritmo de manera bastante ingenua ... Tal vez pueda encontrar algo mejor ...
Básicamente filtra los valores que no cumplen con el criterio de
range(10**6)
Gracias a @xnor por señalar en el chat que
gcd(x,x+2010)==gcd(x,2010)
fuente
Python 3, 84 bytes
FryAmTheEggman ya sugirió cómo hacer que su solución sea de 88 bytes, por lo que no publicaré eso. Pero pensé en mostrar cómo puedes obtener aún menos bytes en Python 3:
(Gracias por FryAmTheEggman por los consejos)
Esto no funciona en Python 2 porque
print
no es una función.No estoy seguro de si se nos permite, pero si podríamos usar en
9**9
lugar de10**6
eso sería otro byte.fuente
and
/or
... aunque no habría pensado en Python 3;) Más sobre el tema: Si el orden no importa, creo que configurarx=10**6
y hacerwhile x:x-=1;...
es un byte más corto.R, 75 caracteres
Con saltos de línea:
fuente
GolfScript (41 bytes)
Llama a los números
am
ybm
dóndegcd(a, b) = 1
y wlogb > a
. Entonces la diferencia esm(b-a) = 2010
, ylcm(am, bm) = abm = 2014m
asíab=2014
.Factores de 2014 son
y aquellos que tienen diferencias que se dividen en 2010 son
Como estoy operando en un lenguaje que no tiene GCD o LCM incorporado, creo que este análisis probablemente acorta el programa:
donde
44
estáfloor(sqrt(2014))
.Es posible acercarse bastante usando un bucle ingenuo:
fuente
Perl6
6158565452Una traducción bastante directa de su fuente da
gcd
es un infijo en Perl6.^10**6
es la abreviatura de0 ..^ 10**6
, donde las^
medias excluyen este número del rango.Por supuesto,
i gcd (i+2010)
es lo mismo,i gcd 2010
así que puedo guardar 3 caracteresSi uso en
$_
lugar dei
puedo guardar otro par de caracteres. (.say
es la abreviatura de$_.say
)Puedo guardar otro par de caracteres usando en
... && .say
lugar de.say if ...
, porque no necesito un espacio en ambos lados&&
como lo hago paraif
.Como hice las dos "optimizaciones" anteriores, puedo usar la forma del modificador de declaración de
for
, lo que significa que puedo eliminar{
y}
.Creo que es lo más corto posible sin usar un algoritmo diferente.
fuente
J 26 bytes
Esos malditos verbos de 2 bytes ... :)
fuente
Dyalog APL, 29 caracteres
fuente
PARI / GP, 42 bytes
Siento que hay una solución extremadamente elegante usando la
fordiv
construcción de GP, pero no podría competir con esta solución por su brevedad.fuente
Raqueta, 72 caracteres
fuente
λ
cuente como 1 byte.Haskell, 52 caracteres
Funciona en el entorno interactivo Haskell GHCi.
fuente