Parlons des diviseurs ...
En laissant de côté les carrés parfaits (pendant un moment), tous les entiers positifs peuvent être exprimés comme le produit de 2 de leurs diviseurs. Exemple rapide pour 126
: Voici tous les diviseurs de126
Comme vous pouvez le voir, tous les diviseurs peuvent être jumelés. Voici ce que nous appellerons les paires de diviseurs :
[1, 126], [2, 63], [3, 42], [6, 21], [7, 18], [9, 14]
Pour ce défi, nous n'aurons besoin que de la dernière paire de cette liste (qui est la paire centrale de l'image):
[9,14]
Nous appellerons cette paire la paire de diviseurs MaxMin .
La différence de la paire de diviseurs MaxMin (DMDP) est la différence des deux éléments de la paire qui est [9,14]=5
un exemple de plus 544
. Les diviseurs sont:
[1, 2, 4, 8, 16, 17, 32 , 34, 68, 136, 272, 544]
et DMDP (544) = 15 car32-17=15
Et les carrés parfaits ? Tous les carrés parfaits ont DMDP = 0
Prenons par exemple 64
avec des diviseurs
{1, 2, 4, 8 , 16, 32, 64}
Comme vous pouvez le voir dans ce cas, la paire de diviseurs MaxMin est [8,8]
ce que DMDP=0
nous avons presque terminé.
Le défi
Étant donné un entier n>0
, affichez combien d'entiers inférieurs ou égaux à 10000
, ont DMDP inférieur à n
Cas de test
entrée -> sortie
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
C'est le code-golf . La réponse la plus courte en octets gagne .
10000
seconde entrée variable?Réponses:
JavaScript (ES7), 60 octets
Dépasse probablement votre limite de récursivité, vous pouvez donc préférer la version itérative pour 70 octets:
la source
Gelée , 13 octets
1 octet merci à Jonathan Allan.
Essayez-le en ligne!
la source
ÆDạ"Ṛ$Ṃ
vous fait économiser un octet de plusÆDạ:@¥⁸Ṃ
(j'avaisạ"ṚṂ
...ȷ4RÆDÇ€<⁸S
pour 15 - trop similaire - EDIT: hmm ou était-ce, pas:
impliqué ... qu'en pensez-vous?)Java 8,
151111110101 101 octets-10 octets grâce à @Nevay .
Explication:
Essayez-le ici.
la source
for(i=1,i+=Math.sqrt(x);--i>0;)if(...
pour enregistrer 1 octet.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
comme alternative pour l'utilisationMath.sqrt
, car c'est la deuxième fois que vous jouez cela dans mon code.R , 73
77octetsMerci à @Guiseppe pour les 4 octets
Essayez-le en ligne!
J'ai perdu la fonction vectorisation pour calculer le DMDP et utilise maintenant un sapply sur la fonction. Les vérités pour les éléments inférieurs à l'entrée sont additionnées pour le résultat.
la source
sum(sapply(1:1e4,function(x)min(abs((w=which(x%%1:x<1))-rev(w))))<scan())
c'est un peu plus courtMathematica, 64 octets
Essayez-le sur Wolfram Sandbox
Usage
Explication
Générez les listes de diviseurs, de
1
à10000
. (les listes de diviseurs sont triées automatiquement)Comptez les occurrences d'éléments
a
, tels que ...(input) + (left one of the middle element(s)) > (right one of the middle element(s))
S'il n'y a qu'un seul élément central, gauche = droite.la source
05AB1E ,
191817161512 octetsEssayez-le en ligne!
Explication
la source
MATL , 20 octets
Le code expire dans TIO. Voici un exemple exécuté avec le compilateur hors ligne:
la source
R , 91 octets
Adopte une approche (pire) différente pour calculer le DMDP que la solution de MickyT en utilisant l'indexation de tableaux et
diff
pour le calculer. Hélas.Essayez-le en ligne!
la source
Mathematica,
119115 octetsJ'ai finalement réussi à faire fonctionner cette chose et j'essaie depuis une demi-heure. ._.
Exemple d'exécution
la source
Cases
est4
octets plus court:Tr[1^Cases[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]]&
. Voir cette astuce .Count
est en fait encore plus court queCases
.Count[Last@#-First@#&/@(Take[Divisors@#,Round[{-.1,.1}+(1+Length@Divisors@#)/2]]&/@Range@10000),n_/;n<#]&
10^4
ou1*^4
est plus court que10000
, et/@Range@
est équivalent à~Array~
.Mathematica, 78 octets
la source
Cases
est4
octets plus court:Tr[1^Cases[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]]&
. Voir cette astuce .Count
est encore plus court:Count[Table[#2-#&@@Quantile[Divisors@i,{.5,.51}],{i,10^4}],s_/;s<#]&
Husk , 19 octets
Pas de lien TIO, car il arrive à expiration. Cette version utilise 100 au lieu de 10000 et se termine en quelques secondes.
Explication
Husk n'a pas encore de diviseurs intégrés ni de support pour la notation scientifique.
la source
Japt ,
251917 octetsEssaye-le
Explication
Saisie implicite d'entier
U
.Générez un tableau d'entiers (
õ
) de 1 à 100 (L
) au carré.Passez chacun par une fonction (où
X
est l'élément courant) qui génère un tableau des diviseurs (â
) deX
.Mappez sur ce tableau de diviseurs, où
Z
est l'élément actuel.Obtenez la différence absolue (
a
) deZ
etX
divisée parZ
.L'un des éléments (
d
) du tableau résultant est-il inférieur àU
?Comptez les éléments véridiques et sortez implicitement le résultat.
la source
Rubis, 62 octets
Essayez-le en ligne.
la source
TI-BASIC, 46 octets
Notez que TI-BASIC est un langage tokenisé. De plus, le E de la ligne 2 est un petit E majuscule, trouvé en appuyant sur 2ND +,.
Le résultat sera en D et Ans immédiatement après l'exécution du programme. S'il doit être affiché, l'ajout de deux octets supplémentaires (nouvelle ligne et
Ans
) suffirait.la source
Python 2 , 134 octets
Essayez-le en ligne!
Euh ... il faut faire beaucoup mieux.
la source
len(filter(lambda n:n<i,...))
parsum(n<i for n in ....)
Python 2 , 83 octets
Un peu lent, utilise 5 secondes par test
Essayez-le en ligne!
la source
PHP, 94 + 1 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
VB.NET (.NET 4.5)
116115 octetsExplication:
Une fonction qui prend
n
comme paramètre et renvoie le résultat.Commence à la racine carrée et recherche l'entier le plus proche qui se divise également (sera le plus petit des
MaxMin Divisor Pair
). Obtient ensuite le plus grand de la paire (i/s
), trouve la différence et compare avec l'entrée.Stratégies de golf utilisées:
Dim
est cher, donc moins je déclare de variables, mieux c'est.s
comme un type intégral, il jette au sol pour moi.^
comme exposant. Donc, alors qu'il10000
y a 5 caractères,10^4
c'est seulement 4.return
, la valeur de la variable de fonction sera renvoyée à la place. J'enregistre donc des caractères en ne déclarant pas de variable distincte et en n'utilisant pas de déclaration de retour.i
est supposéInteger
parce que j'ai attribué un littéral entier.A
est supposéObject
mais dès que j'ajoute un entier, il se comporte comme unInteger
.if
vérifier que la différence est satisfaisante, ajoutez-la directement au résultat en convertissant le booléen en un entier. Cependant, VB utilise-1
pourTrue
, donc soustrayez pour obtenir le signe correct.Mod
ne pas l'être0
. Prendre le module d'un nombre négatif dans VB.NET donnera un résultat négatif. Mais, tout est positif pour que je puisse enregistrer un octet en tournant<>
dans>
.Byte
pour le stocker, en économisant des octets dans la déclaration en utilisant un type nommé plus court.Essayez-le en ligne!
la source
C # (.NET Core) , 104 octets
Essayez-le en ligne!
la source