Étant donné un entier N > 1
, affichez tous les autres nombres dont les décompositions principales ont les mêmes chiffres que la décomposition principale de N
.
Par exemple, si N = 117
, alors la sortie doit être [279, 939, 993, 3313, 3331]
, car
117 = 3 × 3 × 13
Par conséquent, les chiffres disponibles sont 1
, 3
, 3
et 3
et nous avons
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Ce sont les seuls autres nombres possibles, car une autre combinaison de ces chiffres donne des entiers non premiers, qui ne peuvent pas être le résultat d'une factorisation principale.
Si N
est l' un des 117
, 279
, 939
, 993
, 3313
ou3331
, la sortie contiendra les cinq autres chiffres: ils sont copains premiers facteurs.
Vous ne pouvez pas utiliser de zéros non significatifs pour obtenir des nombres premiers, par exemple pour N = 107
, son seul copain est 701
( 017
n'est pas pris en compte).
Entrées et sorties
Les copains d'entrée et de sortie doivent être pris et renvoyés dans la base décimale.
N
sera toujours strictement supérieur à1
.La sortie peut être formatée assez librement, tant qu'elle ne contient que les copains et les séparateurs / éléments syntaxiques de liste.
L'ordre de la sortie est sans importance.
Vous pouvez prendre l'entrée à travers
STDIN
, comme un argument de fonction ou quelque chose de similaire.Vous pouvez imprimer la sortie dans
STDOUT
, la renvoyer à partir d'une fonction ou quelque chose de similaire.
Cas de test
Votre programme devrait résoudre l'un des cas de test ci-dessous en moins d'une minute .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
Ç€=$
serait un peu plus rapide queÇ€=Ç
, compte tenu de la contrainte de temps.PowerShell v3 +, 450 octets
Finalement!
PowerShell ne dispose d'aucun élément intégré pour la vérification de la primalité, la factorisation ou les permutations, donc cela est complètement roulé à la main. J'ai travaillé sur un tas de trucs d'optimisation pour essayer de réduire la complexité du temps à quelque chose qui s'adaptera aux restrictions du défi, et je suis heureux de dire que j'ai finalement réussi -
Explication
Il se passe beaucoup de choses ici, donc je vais essayer de le décomposer.
La première ligne prend entrée
$n
et définit unfunction
,f
. Cette fonction utilise la division d'essai cumulative pour obtenir une liste des facteurs premiers. C'est assez rapide pour les petites entrées, mais il est évident que le bourbier diminue si l'entrée est grande. Heureusement, tous les cas de test sont petits, c'est donc suffisant.La ligne suivante obtient les
f
acteurs de$n
,-split
s à chaque chiffre en ignorant les résultats vides (cela est nécessaire en raison de la façon dont PowerShell fait la correspondance des expressions rationnelles et de la façon dont il déplace le pointeur à travers l'entrée et est un peu ennuyeux à des fins de golf), puissort
s les résultats Dans l'ordre croissant. Nous stockons ce tableau de chiffres dans$x
, et l'utilisons comme entrée d'un|?{...}
filtre pour extraire uniquement ceux qui sont eux-mêmes premiers. Ces premiers chiffres sont stockés dans$y
pour une utilisation ultérieure.Nous avons ensuite divisé
$x
en deux volets. Le premier (c'est-à-dire le plus petit) chiffre est stocké dans$a
, tandis que les autres sont transmis$b
. S'il$x
n'a qu'un seul chiffre, il$b
sera vide / nul. Nous devons ensuite refaire la conversion$a
en tableau, nous utilisons donc l'opérateur virgule comme pour le faire.Ensuite, nous devons construire toutes les permutations possibles des chiffres. Cela est nécessaire pour que nos tests de division sautent plus tard un tas de chiffres et accélèrent les choses dans l'ensemble.
Tant qu'il reste un élément
$b
, nous décollons le premier chiffre$z
et laissons le reste$b
. Ensuite, nous devons accumuler dans$a
le résultat de certains découpages et découpages de chaînes. Nous prenons$a+$y
comme concaténation de tableau, et pour chaque élément que nous construisons une nouvelle chaîne$c
, puis boucle à travers$c
l ».length
et insérer$z
dans toutes les positions, y compris préfixer$z$c
et annexant$c$z
, alorsselect
ing que les-u
éléments nique. C'est à nouveau concaténé avec le tableau$a
et réenregistré dans$a
. Oui, cela finit par se produire des choses loufoques, comme vous pouvez obtenir3333
une entrée117
, qui n'est pas en fait une permutation, mais cela est beaucoup plus court que d'essayer de les filtrer explicitement, garantit que nous obtenons chaque permutation, et n'est que très légèrement plus lent.Donc, a maintenant
$a
un tableau de toutes les permutations possibles (puis certaines) des chiffres du facteur. Nous devons redéfinir$x
pour être notre limite supérieure des résultats possibles|sort
en-des
insérant les chiffres dans l' ordre croissant et-join
en les regroupant. De toute évidence, aucune valeur de sortie ne peut être supérieure à ce nombre.Nous avons défini notre tableau d'aide
$l
pour être un tableau de valeurs que nous avons vu précédemment. Ensuite, nous retirons toutes les valeurs$a
(c'est-à-dire, ces permutations) qui sont premières, et entrons dans une boucle qui est le plus grand puits de temps de tout le programme ...Chaque itération, nous bouclons de
0
à notre limite supérieure$x
, incrémentant par l'élément courant$j
. Tant que la$i
valeur que nous considérons n'est pas un multiple d'une valeur précédente (c'est la0-notin($l|%{$i%$_})
section), c'est un candidat potentiel pour la sortie. Si nous prenons lesf
acteurs$i
,sort
eux, et ils-eq
uel$x
, puis ajoutez la valeur à la canalisation. À la fin de la boucle, nous ajoutons notre élément actuel$j
dans notre$l
tableau pour une utilisation la prochaine fois, car nous avons déjà pris en compte toutes ces valeurs.Enfin, nous nous attelons
|?{$_-ne$n}
à retirer ceux qui ne sont pas l'élément d'entrée. Ils sont tous laissés sur le pipeline et la sortie est implicite.Exemples
la source
CJam ,
2623 octetsEssayez-le en ligne
Explication
La concaténation de deux nombres donne toujours un résultat plus important que leur multiplication. Donc, le plus grand nombre que nous devons éventuellement considérer est le plus grand nombre que nous pouvons former à partir des chiffres de la factorisation principale de l'entrée, qui est juste tous les chiffres triés par ordre décroissant. Pour les nombres donnés, cette limite supérieure est facilement assez petite pour que nous puissions vérifier de manière exhaustive chaque nombre dans la plage pour savoir s'il s'agit d'un copain de facteur premier:
la source
05AB1E , 17 octets
Code:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
Pyth, 17
Suite de tests .
Utilise la même observation que celle du post de Martin .
Expansion:
la source
JavaScript (ES6),
163158 octetsEdit : Il a été précisé qu'un nombre premier tel que 23 devrait renvoyer [6] plutôt qu'un ensemble de résultats vide. 5 octets enregistrés en supprimant une règle désormais inutile qui empêchait - exprès - que cela se produise.
Le dernier cas de test est commenté afin que cet extrait de code s'exécute assez rapidement, bien qu'il devrait également se terminer en moins d'une minute.
la source
PHP 486 octets
pourrait probablement être plus court avec un algorithme qui n’est pas le cas dans le livre.
(mais j'aime le nombre d'octets actuel)
panne
la source
En fait, 27 octets
Cela utilise le même algorithme que Martin , Adnan , FryAmTheEggman et Dennis ont utilisé. Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Powershell, 147 octets (version CodeGolf)
Remarque: Le script résout les derniers cas de test de moins de 3 minutes sur mon ordinateur portable local. Voir la solution "performance" ci-dessous.
Script de test moins golfé:
Sortie:
Powershell, 215 octets (version "Performance")
Remarque: Je pense que les exigences de performances sont en conflit avec le principe GodeGolf. Mais puisqu'il y avait une règle
Your program should solve any of the test cases below in less than a minute
, j'ai fait deux changements pour satisfaire la règle:-split'(.)'-ne''
à la place, le code court|% t*y
;Chaque changement réduit de moitié le temps d'évaluation. Veuillez ne pas penser que j'ai utilisé toutes les fonctionnalités pour améliorer les performances. Ces derniers étaient suffisants pour satisfaire à la règle.
Script de test moins golfé:
Sortie:
la source
Japt, 18 octets
Essayez-le
la source