Il existe un nombre plutôt curieux qui apparaît parfois dans les problèmes de mathématiques ou les énigmes. Le pseudofactoriel (N) est le plus petit commun multiple des nombres 1 à N; en d'autres termes, c'est le nombre le plus bas qui contient tous les nombres de 1 à N en tant que facteurs.
Par exemple, pseudofactorial (7) = 3 * 4 * 5 * 7, ce qui correspond à 7! sauf que 2 et 6 ont été supprimés car ils sont contenus dans d'autres termes.
Ecrivez un programme pour calculer pseudofactoriel (N) et, comme toujours, le code le plus court gagne.
Voici une courte liste pour votre usage. Vous trouverez plus de cas de test dans l’OEIS sous A003418 .
Factorielle:
- 1
- 2
- 6
- 24
- 120
- 720
- 5040
Pseudofactorial:
- 1
- 2
- 6
- 12
- 60
- 60
- 420
code-golf
math
number-theory
factorial
Tony Ruth
la source
la source
2
et6
ont été retirés de la liste des multiples. Pouvez-vous s'il vous plaît clarifier les règles?Réponses:
Dyalog APL , 3 octets
Bat APL Jelly ‽
⍳
1 si argument∧/
LCM à traversla source
Gelée , 4 octets
Essayez-le en ligne!ou vérifier tous les cas de test .
Comment ça marche
la source
C (avec x86), 52 octets
Vérifie les nombres à partir de 1. Pour chaque nombre, divisez-le par tous les nombres de n à 1 et additionnez les autres. S'arrête quand la somme est 0.
Usage:
Il n’est pas évident de savoir comment il renvoie une valeur (il n’existe pas
return
énoncé).La convention d'appel pour x86 indique que la fonction doit renvoyer sa valeur dans le
eax
registre. De manière pratique, l’instruction de divisionidiv
attend son entrée danseax
et produit le résultat danseax
(quotient) etedx
(reste). La dernière itération est diviséek
par1
,eax
elle contiendra donc la bonne valeur lorsque la fonction sera fermée.Cela ne fonctionne que lorsque l'optimisation est activée (en mode débogage, elle est affichée
421
).la source
int
par défaut (y compris la valeur de retour). Cela fonctionne pour les arguments de fonction s'ils sont déclarés en utilisant la syntaxe dite "à l'ancienne". La déclaration avec des types explicitement définis seraitint d(n,k,b,t) int n,k,b,t; {...}
cdecl
etstdcall
utilisent la même méthode pour la valeur de retour, donc je suppose que celax86
suffitHaskell, 20 octets
Exemple d'utilisation:
map f [1..7]
->[1,2,6,12,60,60,420]
.Le
lcm
truc à Haskell.la source
Python + SymPy, 45 octets
Assez explicite.
Python 2,
5754 octetsTestez-le sur Ideone .
Comment ça marche
L'entrée est stockée dans les variables i et r .
exec
exécute le code suivant r fois.Bien que i varie de r à 1 , nous ajoutons la valeur initiale de r (stockée dans t ) autant de fois que nécessaire pour que r se crée un multiple de i . Le résultat est évidemment un multiple de t .
La valeur finale de r est donc un multiple de tous les entiers compris dans l'intervalle [1, ..., n] , où n est l'entrée.
la source
exec
astuces, il existe une solution de 78 octets:from fractions import*;lambda n:reduce(lambda x,y:x*y/gcd(x,y),range(1,n+1),1)
Utilise le fait quelcm(x,y) = x*y/gcd(x,y)
.Python, 46 octets
Vous recherchez le multiple
c
deg(n-1)
directement. Je pensais auparavant que cette méthode trouverait à tort que 0 est un multiple de quoi que ce soit, mais que leor
court-circuit soit(c%n<1)*c
ignoréc==0
, car 0 correspond à Falsey.50 octets:
Comme la solution de Dennis , mais comme une fonction récursive. Après avoir calculé
g(n-1)
, cherche le plus petit multiplei*n
den
qui est aussi un multiple deg(n-1)
. Vraiment lent.Merci à Dennis pour 4 octets en regardant des multiples de
n
au lieu deg(n-1)
.la source
J, 9 octets
Approche directe. Crée la plage de nombres
[0, ..., n-1]
, puis en ajoute un à chacun et la réduit à l'aide du LCM.Usage
la source
MATL , 4 octets
Essayez-le en ligne!
Explication
la source
Mathematica, 13 octets
la source
LCM
etRange
avec@*
?LCM
opère élément par élément sur une liste, qui serait passéeRange
, ce qui veut dire que ceci renverrait simplement le lcm ( x ) pour x de 1 à n . En outre, il manque un élément&
qui fermerait la fonction anonyme. Quelque chose commeLCM@@Range@#&
pour 13 octets fonctionnerait.Julia, 11 octets
Essayez-le en ligne!
la source
Pyth - 8 octets
Vérifie tous les nombres jusqu'à ce qu'il en trouve un qui soit divisible par
[1..N]
.Suite de test .
la source
Octave, 27 octets
Crée une fonction anonyme pouvant être appelée
ans(N)
.Démo en ligne
Explication
Cette solution crée une liste de tous les nombres entre
1
andx
(1:x
), les convertit en tableau de cellules avecnum2cell
. Ensuite, l'{:}
indexation crée une liste séparée par des virgules qui est transmise àlcm
plusieurs arguments d'entrée pour calculer le plus petit commun multiple. Un 1 est toujours passé en tant que premier argumentlcm
carlcm
il nécessite toujours au moins deux arguments en entrée.la source
lcm
dans Octave accepte plus de 2 entrées! IntéressantMATLAB, 49 octets
la source
bsxfun
Perl 6 , 13 octets
Bloc de code anonyme qui crée une plage de 1 à l'entrée (incluse), puis réduit celle-ci avec
&infix:<lcm>
.Exemple:
la source
JavaScript (ES6),
9288807469 octets:Merci @ConorOBrien et @Neil
la source
b?g(b,a%b):a
enregistre un octet.y*++i/g(y,i)
enregistre quelques octets supplémentaires.05AB1E, 20 octets
Explication
Essayez-le en ligne
la source
Minkolang 0,15 , 12 octets
J'ai deux solutions de 12 octets et les ai incluses toutes les deux.
Essayez-le ici!
Explication
À peu près aussi simple que possible.
Essayez-le ici!
Explication
Une troisième solution peut en être dérivée: supprimer un
1
et ajouter und
après le courantd
. Dans les deux cas, le nombre supplémentaire est nécessaire car la boucle for s'exécute une fois de trop et que l'exécuter une fois de moins prend deux octets (1-
juste avant le[
).la source
Ruby, 25 octets
Ruby, 25 octets
la source
g=
.Langue GameMaker, 60 octets
Basé sur la logique de la réponse d'Anatolyg.
la source
PHP,
615248 octetsenregistré 9 octets grâce à @ user59178, 4 octets en fusionnant les boucles.
La récursion en PHP est volumineuse à cause du
function
mot clé; donc j'utilise l'itération.Et avec quelques "petits" tricks, j'ai même maintenant battu le JS d'Arnauld .
prend en entrée l'argument de la ligne de commande. Courir avec
-r
.panne
non-golfé
C'est en fait deux boucles en une:
Note: copié de ma réponse sur le duplicata
la source
Japt, 10 octets
Pas de LCM intégré.
L'essayer
la source
Pyke, 3 octets, sans compétition
Essayez-le ici!
la source
Hoon , 67 octets
Créez la liste
[1..n]
, repliez-la sur lcm. Malheureusement, Hoon stdlib ne dispose pas d'un logiciel pré-construit que je peux utiliser: /la source
, 7 caractères / 9 octets
Try it here (ES6 only).
Juste un LCM de compris allant de 1 à entrée.
la source
AWK, 42 octets
Utilisation en ligne de commande:
Je n'ai pas vu de
AWK
solution et un duplicata de la question vient d'être posté hier, alors j'ai pensé jeter cela ensemble. La résolution est plutôt lente pour19
ou plus grande sur ma boîte, mais cela fonctionne.la source
CQIB ,
3532 octetsCela m'a amené ici.
Explication:
Voici une version qui arrête de tester
q
quandb
ne pas le diviser proprement. En outre, l'ordre d'essaib
est contreq
est inversée dans l'hypothèse que la hausseb
's seront plus difficiles à diviser par (prendre2
,3
,4
par exemple: si%2=0
,%4
pourrait être!0
. Réciproquement pas tant ...).la source
Axiome, 35 octets
code de test et résultats
Je viens de faire la solution de Trouver le plus petit entier positif qui a tous les entiers de 1 à n comme facteurs parce que vous dites qu'il est en double je le poste ici
la source
Pari / GP , 14 octets
Essayez-le en ligne!
la source
8ème , 23 octets
Code
Ce code laisse pseudofactorial résultant sur TOS
Usage et exemple
Ou plus clairement
la source