Un nombre Cullen est un nombre contenu dans la séquence générée à l'aide de la formule:
C (n) = (n * 2 ^ n) +1.
Ta tâche:
Écrivez un programme ou une fonction qui reçoit une entrée et génère une valeur de vérité / fausse selon que l'entrée est un nombre Cullen.
Contribution:
Un entier non négatif entre 0 et 10 ^ 9 (inclus).
Sortie:
Une valeur de vérité / fausse qui indique si l'entrée est un nombre Cullen.
Cas de test:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Notation:
C'est le code-golf , donc le score le plus bas en octets l'emporte.
code-golf
number
decision-problem
Gryphon - Rétablir Monica
la source
la source
n
semble être basé sur 0.Ḷ
ouR
dedans :-)Réponses:
Pyth,
65 octetsessayez-le en ligne
la source
Code machine x86_64 ( System V ABI ),
2827 octets-1 octet grâce à @Cody Gray, merci!
Un algorithme à temps constant!
Explication:
Soit y un entier et
x=y*2^y + 1
. Prenant des journaux, nous avonsy + log2(y) = log2(x-1)
doncy=log2(x-1)-log2(y)
. En rebranchant la valeur de y, nous obtenonsy=log2(x-1)-log2(log2(x-1)-log2(y))
. Faire cela une fois de plus, on obtient:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Supprimons les derniers termes (de l'ordre de
log2(log2(log2(log2(x))))
, cela devrait être sûr!), Et supposons quex-1≈x
nous obtenons:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Maintenant, en laissant
f(n) = floor(log2(n))
, il peut être vérifié manuellement quiy
peut être exactement récupéré par:,y=f(x)-f[f(x)-f(f(x))]
pour y <26 , et donc x ⩽ 10 ^ 9 , comme spécifié par le défi (1) .L'algorithme consiste alors simplement à calculer y étant donné x , et à vérifier que x == y * 2 ^ y + 1 . L'astuce est qu'elle
f(n)
peut simplement être implémentée en tantbsr
qu'instruction (bit-scan reverse), qui retourne l'index du premier 1 bit en n , ety*2^y
asy << y
.Code détaillé:
(1) En fait, cette égalité semble se maintenir pour des valeurs de y jusqu'à 50000.
la source
eax
vous permettrait d'éliminer lemovzbl
, en économisant 1 octet. Vous auriez besoin de faire le XOR avant lecmpl
afin qu'il n'encombre pas les drapeaux, bien sûr, mais c'est tout à fait bien car rien après cela ne dépendeax
. Ou, vous pouvez simplement décider que la méthode renvoie un booléen uniquement dans les 8 bits inférieurs, économisant les 3 octets!Gelée ,
76 octetsEssayez-le en ligne!
Prend l'entrée comme argument de ligne de commande. Si on donne un nombre Cullen C ( n ), les sorties n +1 (ce qui est vrai dans Jelly, étant un entier non nul; notez que nous avons n ≥0 parce que l'entrée est un entier, et les nombres Cullen avec n négatif ne sont jamais des entiers) . Si on lui donne un nombre non Cullen, renvoie 0, ce qui est falsey dans Jelly.
Explication
Fondamentalement, formez un tableau de nombres Cullen moins un, puis recherchez l'entrée moins un dedans. Si l'entrée est un nombre Cullen, nous le trouverons, sinon nous ne le ferons pas. Notez que le tableau est nécessairement suffisamment long pour atteindre l'entrée, car C ( n ) est toujours supérieur à n .
la source
JavaScript (ES6),
3735 octetsEnregistré 2 octets grâce à Neil
Démo
Afficher l'extrait de code
la source
x<n?f(n,k+1):x==n
marche?undefined+1===NaN
mais-~undefined===1
. Vous pouvez en savoir plus à ce sujet ici .Haskell, 28 octets
Essayez-le en ligne!
la source
Ohm , 8 octets
Essayez-le en ligne!
la source
PHP , 43 octets
Essayez-le en ligne!
la source
$argn
une variable spéciale? Le changer en$a
économiserait 6 octets: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/…$argn
est disponible si vous exécutez PHP à partir de la ligne de commande avec l'-R
option05AB1E , 7 octets
Essayez-le en ligne!
Explication:
la source
R ,
535146 octetsFonction anonyme. Vérifie si
x
est généré dans la séquence C (n) pour n dans [0, x].3 octets golfés par Giuseppe.
Essayez-le en ligne!
la source
x%in%...
au lieu deany(x==...)
; cela vous laissera tomber 4 octetslapply
simplement en vérifiant le vecteur et en utilisantscan
au lieu de prendre des arguments de fonction - j'obtiens la réponse de @giuseppe. Merci de l'avoir publié séparément pour que je puisse voir ce que je manque - j'apprends plus en essayant quelque chose par moi-même, même si je perds habituellement.C, C ++, Java, C #, D: 70 octets
En raison des similitudes entre toutes ces langues, ce code fonctionne pour chaque
la source
i=30;i--;)if(i<<i==n-1)
place dei=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 octets
Essayez-le en ligne!
la source
Python 2 , 36 octets
Essayez-le en ligne!
Sorties en ne plantant pas / plantant, comme actuellement autorisé par ce méta-consensus .
Python 2 , 42 octets
Essayez-le en ligne!
Sorties via code de sortie
la source
R , 26 octets
Essayez-le en ligne!
Une approche légèrement différente de l' autre réponse R ; lit à partir de
stdin
et puisque l'entrée est garantie entre 0 et 10 ^ 9, il suffit de vérifiern
entre 0 et 26.la source
scan()
. Bon travail.APL (Dyalog) , 9 octets
Pour couvrir le cas de n = 1, il nécessite
⎕IO←0
ce qui est par défaut sur de nombreux systèmes.Essayez-le en ligne!
⊢
[est] n (l'argument)∊
un membre de1
une+
plus⍳
les i ntegers 0… ( n -1)×
fois2
deux*
au pouvoir de⍳
les i ntegers 0… ( n -1)la source
⎕IO←0
non standard, car beaucoup l'ont en effet toujours réglé comme ça, sans spécification à chaque fois.⎕IO←0
.Python 2 , 32 octets
Essayez-le en ligne!
Crée la liste des nombres Cullen jusqu'à
10^9
, puis compte le nombre de fois que l'entrée y apparaît. Merci à Vincent d'avoir souligné aun<<n|1
lieu de(n<<n)+1
, économisant 2 octets.la source
n<<n|1
(n<<n
étant pair);)838860801
. Vous en avez besoinrange(26)
, car la gamme n'est pas inclusive.D, 65 octets
Il s'agit d'un portage de l'algorithme de @ HatsuPointerKun vers D (l'original était déjà du code D, mais c'est avec des astuces spécifiques à D)
Comment? (D astuces spécifiques)
Le système de modèles de D est plus court que celui de C ++ et peut déduire des types. Et D initialise également ses variables à la valeur par défaut lors de la déclaration.
la source
Mathematica, 30 octets
Fonction pure prenant un entier non négatif en entrée et retournant
True
ouFalse
. Si l'entrée estn
,(r=Range@#-1)
définit la variabler
à être{0, 1, ..., n-1}
, puisr2^r+1
calcule de manière vectorielle les premiersn
nombres Cullen.MemberQ[...,#]
vérifie ensuite s'iln
s'agit d'un élément de la liste.la source
Mathematica, 32 octets
la source
Excel VBA, 45 octets
Fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la cellule
[A1]
et les sorties dans la fenêtre immédiate VBEDoit être exécuté dans un module propre ou avoir des valeurs pour i, j être réinitialisé à la valeur par défaut de 0 entre les exécutions
Entrée sortie
E / S comme vu dans la fenêtre immédiate VBE
la source
Swi-Prolog, 69 octets
f(X)
réussit s'il peut trouver une valeur I où X = I * 2 ^ I + 1. L'indice de plage l'empêche de manquer d'espace de pile, mais il suffit pour la plage de nombres Cullen jusqu'à 10 ^ 9 dans la spécification de question.par exemple
la source
cQuents , 9 octets
Essayez-le en ligne!
Explication
la source
TI-BASIC, 17 octets
Explication
la source
QBIC , 24 octets
Explication
la source
k , 19 octets
Essayez-le en ligne. Truthy est un tableau contenant un nombre:
,3
ou,0
cetera. Falsey est un tableau vide:()
ou!0
selon votre interprète.la source
Java (OpenJDK 8) , 56 octets
Essayez-le en ligne!
la source
Pari / GP , 25 octets
Essayez-le en ligne!
la source