(Suivi de ma question sur l' échange de bits avec leurs voisins .)
Tâche
Étant donné un entier positif x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , imprimer l'entier obtenu en échangeant les exposants de cette factorisation pour chaque paire successive de nombres premiers, y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 dans l'OEIS. Il s'agit de code-golf , donc le programme le plus court (en octets) gagne!
Cas de test
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Réponses:
Gelée , 10 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Gelée,
171611 octets5 octets grâce à Dennis.
Essayez-le en ligne!
Explication
Version précédente de 16 octets
Essayez-le en ligne!
Explication
Version précédente de 17 octets:
Essayez-le en ligne!
Explication
la source
Mathematica,
7069 octetsUne fonction sans nom qui prend et retourne un entier. Il renvoie une erreur en entrée
1
mais calcule toujours le résultat correct.Explication
Comme d'habitude, en raison de tout le sucre syntaxique, l'ordre de lecture est un peu drôle. Un
&
sur les définit à droite une fonction sans nom et ses arguments sont désignés par#
,#2
,#3
, etc.Nous commençons par factoriser l'entrée. Cela donne une liste de paires,
{prime, exponent}
par exemple l'entrée12
donne{{2, 2}, {3, 1}}
. Un peu gênant,1
donne{{1, 1}}
.Cela applique la fonction de gauche à la liste des entiers au niveau 1, c'est-à-dire que la fonction est appelée pour chaque paire, en passant le premier et l'exposant en tant qu'arguments séparés, puis renvoie une liste des résultats. (Cela revient à mapper la fonction sur la liste, mais recevoir deux arguments distincts est plus pratique que recevoir une paire.)
Nous calculons le nombre de nombres premiers jusqu'à et y compris l'entrée (principale) à l'aide de la fonction intégrée
PrimePi
. Cela nous donne l'indice du premier.Le résultat est incrémenté, XOR avec
1
et décrémenté à nouveau. Ces swaps1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, c'est-à-dire tous les indices basés sur 1. Notez que l'entrée1
donnera0
pourPrimePi
laquelle est ensuite mappé-1
dans ce processus. Nous y reviendrons plus tard.Nous obtenons maintenant le n ème premier (où n est le résultat du calcul précédent), qui est le premier correctement échangé, et le portons à la puissance du premier original dans la factorisation de l'entrée. À ce stade
Prime[-1]
, une erreur sera lancée, mais elle se renverra sans évaluation. Dans ce cas, la puissance est1
telle que l'ensemble du processus jusqu'à présent donne{Prime[-1]}
une entrée1
et une liste de puissances principales correctes pour toutes les autres entrées.Ensuite, nous multiplions simplement tous les pouvoirs principaux.
1##&
est une astuce de golf standard pour laTimes
fonction. Voir cette astuce (section "Séquences d'arguments") pour savoir comment cela fonctionne.Enfin, nous devons prendre soin de la contribution
1
pour laquelle tout ce qui précède a aboutiPrime[-1]
. Nous pouvons facilement résoudre ce problème avec une simple règle de remplacement. N'oubliez pas quef@x
c'est court pourf[x]
. Nous voulons juste faire correspondre n'importe quelle expression de cette forme (puisque tous les autres résultats seront des entiers, c'est-à-dire des expressions atomiques), et le remplacer par un1
:Ici,
/.
est l'abréviation deReplaceAll
,_@_
est un modèle pour n'importe quoi de la formef[x]
(c'est-à-dire toute expression composée avec un seul enfant) et->1
dit "remplacer par1
".la source
Python 2,
149139 octets10 octets grâce à Dennis.
la source
input()
fonctionne en Python 2?eval(input())
Python 3.MATL , 17 octets
Essayez-le en ligne!
Explication
Cela n'utilise pas directement les exposants. Au lieu de cela, il échange chaque facteur premier (éventuellement répété) par le premier suivant ou le premier précédent.
la source
Julia, 64 octets
Essayez-le en ligne! Le dernier cas de test nécessite trop de mémoire pour TIO, mais je l'ai vérifié localement.
Comment ça fonctionne
Pour éviter l'entrée de casse spéciale 1 - le produit d'un dictionnaire vide n'est pas défini - nous multiplions l'entrée n par 2 et divisons le résultat final par sa paire 3 .
factor(2n)
donne tous les exposants positifs des facteurs premiers de 2n comme dictionnaire. Lors de l'itération sur le dictionnaire, nous obtiendrons des paires clé-valeur / exposant principal. La fonctionprod
prendra ces paires, appliquera la fonction anonymet->...
et retournera le produit des résultats.Pour chaque paire t = (p, e) ,
endof(~t[1])
ouendof(primes(t[1]))
renvoie k , le nombre de nombres premiers inférieurs ou égaux à p , ce qui signifie que p est le k ème premier.+1$1-1
incrémentera k , XOR k + 1 avec 1 et décrémentera le résultat. Si k est impair, k + 1 est pair, donc le XOR augmente et le résultat final est k + 1 . Si k est pair, k + 1 est impair, donc le XOR diminue et le résultat final est k - 1 .Enfin, nous calculons tous les nombres premiers inférieurs ou égaux à 3n avec
(~3n)
ouprimes(3n)
(le facteur premier le plus élevé de 2n est inférieur ou égal à n si n> 2 , et il y a toujours un premier entre n et 2n ), sélectionnez celui à l'indice k + 1 ou k - 1 , et élevez-le à la e e puissance avec^t[2]
.la source
Python 2,
1121091089594 octetsTestez-le sur Ideone .
Comment ça fonctionne
Lorsque f est appelé, il calcule d'abord 1 / n . Si le résultat n'est pas nul, n est 1 et f renvoie 1 .
Si n> 1 , ce qui suit se produit.
Si n n'est pas divisible par p [1] (initialement 2 ),
n%p[1]
donne une valeur vraie etest appelé.
Cette branche génère un nombre premier jusqu'à ce que l'avant-dernier divise également n . Pour ce faire, il utilise le corollaire suivant du théorème de Wilson .
À tout moment, m est égal à la factorielle de k - 1 (initialement 6 = 3! Et 4. À chaque itération, le résultat de
m*m%k*[k]
est ajouté à la liste des nombres premiers p . Par le corollaire,m*m%k
est 1 si k est premier et 0 sinon, ceci ajoute k à p si et seulement si k est un nombre premier.Si n est divisible par p [1] ,
n%p[1]
donne 0 etest exécuté.
Si p contient un nombre pair de nombres premiers,
len(p)*2%4
donnera 0 et le premier multiplicande prendra la valeur de p [0] . Si p contient un nombre impair de nombres premiers,len(p)*2%4
donnera 2 et le premier multiplicande prendra la valeur de p [2] .Dans les deux cas, c'est le nombre premier dont les exposants doivent être échangés avec celui de p [1] , nous divisons donc n par p [1] (en diminuant l'exposant par 1 ) et en multipliant le résultat
f(n/p[1])
par le nombre premier correspondant (augmentant l'exposant par 1 ).Notez que
f(n/p[1])
réinitialise k , m et p à leurs valeurs par défaut.f(n/p[1],k,m,p)
améliorerait l'efficacité, au prix de six octets supplémentaires.la source
Pyth, 25 octets
Suite de tests.
Explication
la source
Julia,
155131127 octetsIl s'agit d'une fonction anonyme qui accepte un entier et renvoie un entier. Pour l'appeler, affectez-le à une variable. Il nécessite une version Julia <0.5 car la fonctionnalité principale a été supprimée de Base en 0.5.
Non golfé:
Essayez-le en ligne! (Comprend tous les cas de test)
la source
En fait, 15 octets
Essayez-le en ligne!
Explication:
la source
05AB1E, 22 octets
Expliqué
Essayez-le en ligne
la source
J, 21 octets
Obtient les principaux exposants de n en tant que puissances principales avec des zéros. Ensuite, partitionnez-les en sous-listes non superposées de taille 2 tout en remplissant avec un zéro supplémentaire. Inversez ensuite chaque sous-liste et aplatissez-les dans une liste. Enfin, reconvertissez des exposants principaux en nombre.
Usage
Explication
la source