Définitions
- Un carré parfait est un entier qui peut être exprimé comme le carré d'un autre entier. Par exemple,
36
est un carré parfait parce que6^2 = 36
. - Un nombre sans carrés est un entier qui n'est divisible par aucun carré parfait, sauf par
1
. Par exemple,10
est un numéro sans carré. Cependant, ce12
n’est pas un nombre sans carrés, car12
est divisible par4
et4
est un carré parfait.
Tâche
n
Si le nombre entier est positif , indiquez le plus grand nombre carré qui se divise n
.
Testcases
n output
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 2
9 3
10 10
11 11
12 6
13 13
14 14
15 15
16 2
17 17
18 6
19 19
20 10
21 21
22 22
23 23
24 6
25 5
26 26
27 3
28 14
29 29
30 30
31 31
32 2
33 33
34 34
35 35
36 6
37 37
38 38
39 39
40 10
41 41
42 42
43 43
44 22
45 15
46 46
47 47
48 6
49 7
50 10
Notation
C'est du code-golf . La réponse la plus courte en octets l'emporte.
Les failles standard s'appliquent.
Référence
code-golf
math
arithmetic
number-theory
Fuite Nun
la source
la source
Réponses:
05AB1E , 2 octets
Essayez-le en ligne!
Comment ça marche
la source
Brachylog , 3 octets
Essayez-le en ligne!
Une réponse très originale ...
Explication
la source
JavaScript (ES6),
55545046 octetsCitant OEIS :
a (n) est le plus petit diviseur u de n tel que n se divise u ^ n
Mise en oeuvre mise à jour:
a (n) est le plus petit
diviseur u de nentier entier u tel que n se divise u ^ nla source
MATL ,
64 octets2 octets enregistrés avec l'aide de @LeakyNun
Essayez-le en ligne!
Explication
Considérez l'entrée
48
.la source
Gelée , 4 octets
Essayez-le en ligne!
la source
CJam , 8 octets
Pourquoi chaque opération dans ce programme doit être de 2 octets -_-
Essayez-le en ligne!
la source
Retina ,
363028 octetsEntrée et sortie en unaire .
Essayez-le en ligne! (Inclut un en-tête et un pied de page pour la conversion décimale <-> unaire et l'exécution simultanée de plusieurs scénarios de test.)
Explication
L'idée est de faire correspondre l'entrée avec un carré multiplié par un facteur. La regex de base pour faire correspondre un carré utilise une référence en avant pour faire correspondre les sommes d'entiers impairs consécutifs:
Puisque nous ne voulons pas faire correspondre les carrés parfaits, mais les nombres qui sont divisibles par un carré, nous le remplaçons
1
par une référence arrière:Alors maintenant, le groupe extérieur
1
sera utilisé n fois, où n 2 est le plus grand carré qui divise l’entrée et le groupe2
stocke le facteur restant. Ce que nous voulons, c'est diviser l'entier par n pour supprimer le carré. Le résultat peut être exprimé comme le nombre d'itérations de groupe1
fois2
, mais c'est un peu difficile à faire. Retina$*
sera probablement bientôt amélioré pour prendre un jeton sans caractère comme argument de droite, auquel cas nous pourrions simplement le remplacer par$#1$*$2
, mais cela ne fonctionne pas encore.Au lieu de cela, nous décomposons les nombres impairs différemment. Revenons à l'exemple plus simple d'associer des carrés parfaits à
(^1|11\1)+$
. Au lieu d'avoir un compteur\1
initialisé à 1 et incrémenté de 2 à chaque itération, nous aurons deux compteurs. L'un est initialisé à 0 et l'autre à 1 , et ils sont tous deux incrémentés de 1 à chaque itération. Nous avons donc décomposé les nombres impairs 2n + 1 en (n) + (n + 1) . L'avantage est que nous allons nous retrouver avec n dans l'un des groupes. Dans sa forme la plus simple, cela ressemble à ceci:Où
\2
est n et\3
est n + 1 . Cependant, nous pouvons le faire un peu plus efficacement en remarquant que le n + 1 d'une itération est égal au n de la prochaine itération, nous pouvons donc économiser sur un1
ici:Nous devons maintenant revenir à l’utilisation d’un facteur initial au lieu de
1
faire correspondre les entrées divisées par un carré parfait:Il ne nous reste plus qu'à remplacer tout cela
$3
à la fin, qui stocke le facteur initial multiplié par le nombre d'étapes, ce qui supprime un facteur du carré de l'entrée.Cela se fait de manière répétée
+
au tout début du programme, pour prendre en compte les entrées qui contiennent des puissances plus élevées que les carrés.la source
Octave, 27 octets
Approche similaire aux autres réponses. La différence est la suivante: les fonctions ont des noms beaucoup plus longs. Je crois que le code s’explique vraiment: prend
prod
launique
première placefactor
d’un nombre.la source
Wolfram Language,
2928 octets-1 Merci à @Martin Ender ♦
Explication:
la source
Times@@(#&@@@FactorInteger@#)&
Most
le laisse comme une liste. Vous devezFirst
obtenir la valeur.Python , 37 octets
Essayez-le en ligne!
Le plus grand diviseur de carrés
n
est le plus petit nombrer
avec tousn
les facteurs premiers de. Nous pouvons vérifier cela commer**n%n==0
, puisquer**n
faire desn
copies de chaque facteur premier der
, et est divisible parn
seulement si chacun desn
facteurs premiers de est représenté.Le
1>>r**n%n
est équivalent àint(r**n%n==0)
. SiTrue
peut être utilisé la sortie 1, il est 2 octets plus court à faire.la source
Mathématiques , 40 octets
Essayez-le en ligne!
la source
Times@@#&@@Transpose@FactorInteger@#&
enregistre 3 octets (#&@@
c'est une astuce standard[[1]]
et dans de tels cas, il est souvent possible de sauver des octets supplémentaires entre parenthèses).Thread
au lieu deTranspose
. Dans Mathematica, il existe également un opérateur 3 octets pourTranspose
, mais je ne sais pas si Mathics le prend en charge.#&@@(1##&@@FactorInteger@#)&
évite le besoin deTranspose
tout à fait. (1##&@@
est justeTimes@@
déguisé, ce qui fonctionne très bien sur les paires ordonnées cédées parFactorInteger
; et'#&@@
estFirst@
déguisé.)Alice , 4 octets
Essayez-le en ligne!
Entrée et sortie sont donnés comme le point de code d'un caractère (fonctionne pour tous les points de code Unicode valides).
Explication
Eh bien, Alice a une
D
définition intégrée dont la définition est "Facteurs premiers dédupliqués". En d’autres termes, tant qu’une valeur est divisible par une partie de p 2 pour un nombre premier p , divisez cette valeur par p . Cela se trouve être exactement la fonction requise dans ce défi. Le reste ne fait qu'entrer, sortir, terminer le programme.La raison pour laquelle cela a été ajouté à Alice n'a en réalité rien à voir avec cette séquence entière. J'essayais de coller à un thème d'association de diviseurs avec des sous-chaînes et de facteurs premiers avec des caractères. Et j'avais besoin d'une fonction qui va avec "caractères de déduplication" (ce qui est beaucoup plus utile en général, car cela vous permet de traiter les chaînes comme des ensembles, en particulier lorsqu'elles sont utilisées avec les différents opérateurs multisets).
la source
Haskell , 31 octets
Essayez-le en ligne!
la source
Pyke , 3 octets
Essayez-le en ligne!
la source
Prolog (SWI) ,
8439 octetsEssayez-le en ligne!
Adaptation de l'idée de la réponse Haskell de @ xnor à Prolog.
la source
PHP, 70 octets
Essayez-le en ligne!
la source
Pyth,
8 à6 octets* -2 octets grâce à @LeakyNun
Serait 3 si Pyth avait un construit pour les produits de listes ...
Essayez le!
la source
*F+1{P
place.C,
6550 octetsMerci à @ Ørjan Johansen d’avoir supprimé le besoin de
r
. Grâce à cela et à d'autres trucs sales, j'ai pu supprimer 15 octets!while
est parti et remplacé par un||
index.<=
aurait du être<
tout au long.<=
tourné à<
en déplaçant l'incrément à obtenirn%(++d*d)
(doit être bien défini en raison de la priorité de l'opérateur).Code d'origine:
la source
r
et en utilisant plutôtwhile(n%(d*d)<1)n/=d;
.++d*d
n'est absolument pas bien défini par les normes C - il s'agit d'un cas classique de comportement explicitement non défini. Mais nous allons par implémentations ici, de toute façon.d++<n
, ce qui est bien défini, toujours fonctionner? Je pense que l'ancienne version est allée jusqu'àn+1
(sans danger).d++<n
raison, pour une raison quelconque, je ne l'avais pas vu lorsque j'ai réécrit le code.Axiome, 89 octets
test et résultats
c'est la fonction non-factor ()
mais ce n'est que 125 octets
la source
R, 52 octets
lit
n
de stdin. Nécessite l'gmp
installation de la bibliothèque (pour que TIO ne fonctionne pas). Utilise la même approche que beaucoup des réponses ci-dessus, mais il se bloque sur une entrée de1
, carfactorize(1)
renvoie un vecteur vide de classebigz
, ce qui bloqueunique
, hélas.la source
En fait , 2 octets
Essayez-le en ligne!
Explication:
la source
Pari/GP, 28 bytes
Try it online!
la source
Pyt, 3 bytes
Explanation:
la source