Je travaillais sur une question mathématique avec un de mes amis, et nous avons décidé d'écrire un script qui trouve la réponse. La question initiale est la suivante:
La différence de deux nombres naturels est 2010 et leur plus grand dénominateur commun est 2014 fois plus petit que leur plus petit multiplicateur commun. Trouvez toutes les solutions possibles.
Nous avons commencé à écrire le programme indépendamment les uns des autres, et quand cela a fonctionné, nous avons décidé de le jouer pour obtenir le moins d'octets possible. Nous nous sommes retrouvés avec cette belle ligne de code à un merveilleux 89 octets.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Nous voulions voir si quelqu'un parvient à écrire un morceau de code plus court, qui énumère les 1 million de premiers i. Si vous êtes assez courageux pour concurrencer, vous pouvez utiliser n'importe quelle langue que vous aimez, mais nous préférerions que Python 2 puisse comparer votre code avec le nôtre.
Les règles habituelles s'appliquent, les octets les plus courts gagnent. Les failles de golf à code standard s'appliquent. Des "failles" standard qui ne sont plus drôles
S'amuser!
Réponses:
Mathematica, 8 octets
Preuve que 4 et 5092 sont les seules solutions: le problème d'origine peut être réécrit comme
Écrivons x comme 2 a 2 3 a 3 5 a 5 … et x + 2010 comme 2 b 2 3 b 3 5 b 5 … Alors l'équation devient
Depuis 2014 = 2 × 19 × 53, nous avons
Donc
Donc
Il n'y a que 8 choix possibles, et nous pourrions facilement vérifier que 4 et 5092 sont les seules solutions entières positives.
Attendez, j'entends des gens crier échappatoire standard…
Mathematica, 45 octets
la source
Pyth
2725Essayez-le en ligne.
Cela utilise votre algorithme assez naïvement ... Je pourrais peut-être trouver quelque chose de mieux ...
Filtre essentiellement les valeurs qui ne répondent pas au critère de
range(10**6)
Merci à @xnor d'avoir signalé dans le chat que
gcd(x,x+2010)==gcd(x,2010)
la source
Python 3, 84 octets
FryAmTheEggman a déjà suggéré comment rendre votre solution 88 octets donc je ne posterai pas cela. Mais je pensais montrer comment vous pouvez obtenir encore moins d'octets en Python 3:
(Merci pour FryAmTheEggman pour les conseils)
Cela ne fonctionne pas en Python 2 car ce
print
n'est pas une fonction.Je ne sais pas si nous sommes autorisés, mais si nous pouvions utiliser à la
9**9
place,10**6
ce serait un autre octet.la source
and
/or
... n'aurait pas pensé python 3 bien;) Plus sur le sujet: Si l' ordre n'a pas d' importance, je pense que la misex=10**6
et de fairewhile x:x-=1;...
est un octet plus courte.R, 75 caractères
Avec des sauts de ligne:
la source
GolfScript (41 octets)
Appelez les numéros
am
etbm
oùgcd(a, b) = 1
et wlogb > a
. Alors la différence estm(b-a) = 2010
, etlcm(am, bm) = abm = 2014m
ainsiab=2014
.Les facteurs de 2014 sont
et ceux qui ont des différences qui se divisent en 2010 sont
Comme je travaille dans une langue qui n'a pas de GCD ou LCM intégré, je pense que cette analyse raccourcit probablement le programme:
où
44
estfloor(sqrt(2014))
.Il est possible de se rapprocher assez en utilisant une boucle naïve:
la source
Perl6
6158565452Une traduction assez directe de votre source donne
gcd
est une infixation op en Perl6.^10**6
est l'abréviation de0 ..^ 10**6
, où les^
moyennes excluent ce nombre de la plage.Bien sûr,
i gcd (i+2010)
c'est la même chose quei gcd 2010
je peux enregistrer 3 caractèresSi j'utilise
$_
au lieu dei
je peux enregistrer un autre couple de caractères. (.say
est l'abréviation de$_.say
)Je peux enregistrer un autre couple de caractères en utilisant
... && .say
au lieu de.say if ...
, car je n'ai pas besoin d'espace des deux côtés&&
comme je le fais pourif
.Depuis que j'ai fait les deux "optimisations" précédentes, je peux utiliser le formulaire de modification d'instructions de
for
, ce qui signifie que je peux supprimer{
et}
.Je pense que c'est aussi court que possible sans utiliser un algorithme différent.
la source
J, 26 octets
Ces damnés verbes à 2 octets ... :)
la source
Dyalog APL, 29 caractères
la source
PARI / GP, 42 octets
Je pense qu'il existe une solution extrêmement élégante utilisant la
fordiv
construction de GP, mais elle ne pouvait pas rivaliser avec cette solution pour la brièveté.la source
Raquette, 72 caractères
la source
λ
compte comme 1 octet.Haskell, 52 caractères
Fonctionne dans l'environnement interactif Haskell GHCi.
la source