Ceci est mon premier défi!
Contexte
Le nombre parfait est un entier positif, qui est égal à la somme de tous ses diviseurs, sauf lui-même.
Il en 6
est de même du nombre parfait, depuis 1 + 2 + 3 = 6
.
D'un autre côté 12
, non 1 + 2 + 3 + 4 + 6 = 16 != 12
.
Tâche
Votre tâche est simple, écrivez un programme qui, pour acquis n
, imprimera l'un de ces messages:
Je suis un nombre parfait, parce
d1 + d2 + ... + dm = s == n
que je ne suis pas un nombre parfait, parce qued1 + d2 + ... + dm = s [<>] n
Où
d1, ... dm
sont tous les diviseurs de n
sauf pour n
.
s
est la somme de tous les diviseurs d1, ..., dm
(encore une fois, sans n
).
[<>]
est <
(si s < n
) ou >
(si s > n
).
Exemples
Pour n
être 6
: "Je suis un nombre parfait, car 1 + 2 + 3 = 6 == 6"
Pour n
être 12
: "Je ne suis pas un nombre parfait, car 1 + 2 + 3 + 4 + 6 = 16> 12"
Pour n
être 13
: "Je ne suis pas un nombre parfait, car 1 = 1 <13"
Règles
n
n'est pas plus grand que la norme de votre langueint
.- Vous pouvez lire à
n
partir d'une entrée standard, d'arguments de ligne de commande ou d'un fichier. - Le message de sortie doit être imprimé sur la sortie standard et aucun caractère supplémentaire ne peut apparaître dans la sortie (il peut y avoir un espace de fin ou une nouvelle ligne)
- Vous ne pouvez pas utiliser de fonctions intégrées ou de bibliothèque qui résoudraient la tâche (ou sa partie principale) pour vous. Non
GetDivisors()
ou quelque chose comme ça. - Toutes les autres failles standard s'appliquent.
Gagnant
C'est le code-golf donc le code le plus court en octets gagne!
la source
=
et==
dans la même équation? Ça n'a aucun sens. Ce devrait être l'd1 + d2 + ... + dm = s = n
OMI.Réponses:
Pyth, 81 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Java,
255270 octets (toujours FF en base 17)Et une version plus lisible:
Auparavant, cela ne fonctionnait pas pour les nombres impairs, j'ai donc dû modifier quelques éléments. Au moins, j'ai de nouveau eu de la chance avec le nombre d'octets. :)
la source
R,
158163157153143141 octetsEncore de la place pour jouer au golf, je pense.
Modifier: remplacé
if(b<n)'<'else if(b>n)'>'else'=='
parc('<'[b<n],'>'[b>n],'=='[b==n])
. Lepaste(...)
est remplacé par unrbind(...)[-1]
. Merci @plannapus pour quelques octets supplémentaires.Non golfé
Essai
la source
+
connexion entre les diviseurs.rbind
tour brillant ! Vous pouvez enregistrer 2 octets supplémentaires si vous attribuez2:n-1
à une variable, par exemplea
:which(!n%%1:(n-1))
devient ainsia[!n%%a]
. (Le code complet étant alorsn=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
)Python 2,
183173170 170 octetsExemples:
Merci à xnor pour avoir économisé 13 octets!
la source
'=<>'[cmp(b,d)]
- rejoignez la révolution!b%i<1
pourb%i==0
. Pour['not ',''][int(d==b)]
, vous n'avez pas besoin deint
, car Python se convertira automatiquement. De plus, vous pouvez utiliser la mulitplication de chaînes"not "*(d!=b)
."=<>="[cmp(b,d)%3::3]
.Julia,
161157 octetsNon golfé:
la source
CJam, 90 octets
A titre de comparaison, l'impression d'un seul
=
peut être réalisée en 83 octets.Essayez-le en ligne dans le interpréteur CJam .
Comment ça marche
la source
Perl, 148 octets
Avec des sauts de ligne:
la source
'not '
et des'==','>','<'
déclarations et le passage de.
la,
(puisque rien n'est ajouté lorsqueprint
ing une liste). Déplacer également vos affectations en parens la première fois qu'elles sont utilisées enregistre un couple, et si vous changez légèrement la logiquegrep$a%_<1,1..($a=<>)-1
et$a!=($s=eval)&&'not '
vous devriez en raser un peu plus! J'espère que tout a du sens!Lua,
244231 octetsGolfé:
Non golfé:
la source
JavaScript (ES6), 146
À l'aide de chaînes de modèles, il fonctionne dans Firefox et le dernier Chrome.
la source
Ruby,
174160155136134128122 OctetsEnregistré 6 autres octets :)
Merci aux conseils pour jouer au golf à Ruby
la source
C #, 252 octets
la source
Hassium , 285 octets
Avertissement: Fonctionne uniquement avec la dernière version de Hassium en raison de problèmes avec les arguments de ligne de commande.
Version plus lisible:
}
la source
mono src/Hassium/bin/Debug/Hassium.exe t.hs 6
, dit-ilSystem.ArgumentException: The file 6 does not exist.
. 2. Cela ne fonctionne pas avec cette version , qui est la dernière validation avant la publication de ce défi. Veuillez ajouter un avertissement à votre réponse indiquant que votre soumission n'est pas en concurrence.@Dennis
à votre commentaire. Sinon, je ne suis pas informé de votre réponse.)MATLAB, 238
Ne sera jamais la plus courte de toutes les langues, mais voici ma tentative avec MATLAB:
Et ceci sous une forme légèrement plus lisible:
J'ai réussi à économiser 2 octets de plus en n'utilisant pas de fonction. Au lieu de cela, vous exécutez la ligne de code et il demande le nombre en entrée. Une fois exécuté, il affiche la sortie à la fin.
la source
Perl 6 , 138 octets
(Le décompte ignore les nouvelles lignes et les retraits, car ils ne sont pas nécessaires)
@d
est le tableau contenant les diviseurs.$s
détient la somme des diviseurs.$c
est la valeur de la comparaison entre l'entrée et la somme des diviseurs.(Efficace
$c
est l' un-1
,0
,1
mais est vraiment l' un desOrder::Less
,Order::Same
ouOrder::More
)Dans
'not 'x?$c
,?$c
dans ce cas, est effectivement le même queabs $c
, etx
est l'opérateur de répétition de chaîne.«> == <»
est l'abréviation de( '>', '==', '<' )
.Puisqu'il en
$c
a un-1,0,1
, nous devons le décaler d'un pour pouvoir l'utiliser pour indexer dans une liste.Techniquement, cela fonctionnera pour des nombres bien supérieurs à 2⁶⁴, mais cela prendra un temps excessif pour des nombres supérieurs à 2¹⁶.
la source
Pyth, 84 octets
Réponse invalide, car je refuse de mettre en œuvre
=
et==
dans la même équation.la source
Rubis, 164 octets
Tester
la source
Emacs Lisp, 302 octets
Version non golfée:
la source
Powershell, 164 octets
Quelques-unes des astuces PoSh courantes et moins courantes;
la source
awk, 150
Gaspillé quelques octets pour rendre cela correct pour l'entrée
1
. Je ne sais pas si cela est prévu.la source
05AB1E , 58 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
„I€Ü
est"I am"
,'€–
est"not"
et“€…íÀ‚³,ƒ«“
est"a perfect number, because"
.la source