Écrivez un programme qui vérifie si l'entier est une puissance de 2.
Exemple d'entrée:
8
Exemple de sortie:
Yes
Exemple d'entrée:
10
Exemple de sortie:
No
Règles:
Ne pas utiliser
+
, les-
opérations.Utilisez une sorte de flux d'entrée pour obtenir le nombre. L'entrée n'est pas censée être initialement stockée dans une variable.
Le code le plus court (en octets) gagne.
Vous pouvez utiliser n'importe quelle réponse véridique / fausse (par exemple, true
/ false
). Vous pouvez supposer que le nombre d'entrée est supérieur à 0
.
pred
fonction, lorsqu'elle est appliquée à un entier n, renvoie n - 1. Les fonctions telles que celle-ci, qui sont de légers déguisements autour de l'opérateur interdit, sont-elles également interdites?)
, ou la plupart des langages basés sur c »--
.Réponses:
GolfScript, 6 caractères, pas de diminutions
Voici une solution qui n'utilise la
x & (x-1)
méthode sous aucune forme. Il utilise à lax & (x/3)
place. ;-) Sorties0
si faux,1
si vrai.Explication:
~
évalue la chaîne d'entrée pour la transformer en nombre,.
le duplique (pour le suivant&
),3/
le divise par trois (tronquer),&
calcule l'ET au niveau du bit de la valeur divisée avec l'original, qui sera nul si et seulement si l'entrée est nulle ou une puissance de deux (c'est-à-dire a au plus un ensemble de bits), et!
nie logiquement cela, mappant zéro à une et toutes les autres valeurs à zéro.Remarques:
Selon les règles clarifiées, zéro n'est pas une entrée valide , donc ce code est OK, même s'il génère
1
si l'entrée est zéro.Si l'opérateur de décrémentation GolfScript
(
est autorisé, la solution à 5 caractères~.(&!
publiée par aditsu est suffisante. Cependant, cela semble aller à l' encontre de l'esprit des règles , sinon de la lettre.J'ai trouvé cette
x & (x/3)
astuce il y a des années sur la liste de diffusion Fun With Perl. (Je suis sûr que je ne suis pas le premier à le découvrir, mais je l'ai (ré) inventé indépendamment.) Voici un lien vers le message d'origine , y compris une preuve qu'il fonctionne réellement.la source
7/3 = 2 (0010)
, alors7 & 2 = 0111 & 0010 = 0010
quel est clairement le dernier bit qui n'est pas 1APL (7)
Oui, c'est 7 octets . Supposons pour le moment que j'utilise IBM codepage 907 au lieu d'Unicode, puis chaque caractère est un octet :)
c'est à dire
0 = mod(log(input(),2),1)
la source
Indeterminate
quand j'essaye.GolfScript, 11 (pour 1 (vrai) et 0 (faux))
Mettez le numéro sur la pile, puis exécutez.
GolfScript, 22 (pour Oui / Non)
J'adore comment convertir
1
/0
versYes
/No
prend autant de code que le défi lui-même: DAvertissement: EXTRÊMEMENT inefficace;) Cela fonctionne très bien pour les nombres jusqu'à 10000, mais une fois que vous atteignez ce niveau, vous commencez à remarquer un léger décalage.
Explication:
.,
: se transformen
enn 0..n
(.
doublon,,
plage 0..n){2\?}
: au pouvoir de 2%
: mappez "puissance de 2" sur "0..n" pour qu'il deviennen [1 2 4 8 16 ...]
?0>
: vérifie si le tableau contient le nombre (0 est supérieur à l'index)la source
.,{2\?}%?0<'YesNo'3/=
:; aussi je pense que vous trichez en demandant de "mettre le numéro sur la pile", vous devriez commencer par un~
.Mathematica 28
Pour les puissances entières de 2, le numérateur du log de base 2 sera 1 (ce qui signifie que le log est une fraction unitaire).
Ici, nous modifions légèrement la fonction pour afficher l'entrée présumée. Nous utilisons
#
à la place deInput[]
et ajoutons&
pour définir une fonction pure. Il renvoie la même réponse que celle qui serait renvoyée si l'utilisateur saisissait le numéro dans la fonction ci-dessus.Test de plusieurs numéros à la fois.
la source
Perl 6 (17 caractères)
Ce programme obtient une ligne de la
get
fonction STDIN , calcule le logarithme avec la base 2 dessus (log(2)
), et vérifie si le résultat se divise par 1 (%%1
, où%%
est divisé par l'opérateur). Pas aussi court que la solution GolfScript, mais je trouve cela acceptable (GolfScript gagne tout de toute façon), mais beaucoup plus rapide (même si Perl 6 est lent en ce moment).la source
+
et-
sont interdits pour ce défi, est que six & (x - 1)
est égal à0
, alorsx
est une puissance de 2.x&~(~0*x)
fonctionne toujours. Cela ne fait que 2 caractères de plus.Octave (
1523)EDIT: mis à jour en raison des exigences d'entrée de l'utilisateur;
Permet à l'utilisateur de saisir une valeur et de sortir 1 pour vrai, 0 pour faux.
Testé en Octave, devrait également fonctionner en Matlab.
la source
R,
1311Basé sur la solution Perl. Renvoie
FALSE
ouTRUE
.Le paramètre
i
représente la variable d'entrée.Une version alternative avec entrée utilisateur:
la source
GolfScript, 5
Sorties 1 pour vrai, 0 pour faux. Basé sur l'idée de user3142747:
Remarque:
(
est décrément, j'espère que cela ne compte pas comme-
:)Si c'est le cas (et les commentaires du PO suggèrent que cela pourrait le faire), veuillez vous référer à la solution d'Ilmari Karonen à la place.
Pour la sortie Y / N, ajoutez
'NY'1/=
à la fin (7 octets supplémentaires).la source
Python, 31
la source
bin(input()).rfind('1')<3
2==
parce que je pensais que cela devrait aussi fonctionner pour les nombres non positifs. Ce n'est explicitement pas requis par les règles, alors ...print bin(input()).count('1')<2
un total de 31 caractères, mais il est trop similaire au vôtre.C, 48
la source
*
a une priorité plus élevée que binaire&
, vous n'avez pas besoin des parens. Et si la valeur de retour est acceptée (juste demandée), elleexit(x&x*-1)
serait beaucoup plus courte.-
:x*-1
.-
est interdit.J'ai décidé d'utiliser une autre approche, basée sur le nombre d'habitants ou la somme latérale du nombre (le nombre de 1 bits). L'idée est que tous les pouvoirs de deux ont exactement un
1
bit, et aucun autre nombre n'en a. J'ai ajouté une version JavaScript parce que je l'ai trouvée amusante, même si elle ne gagnera certainement pas de compétition de golf.J,
1415 caractères (sorties 0 ou 1)JavaScript, 76 caractères (sorties vrai ou faux)
la source
Clip ,
987Lit un nombre depuis stdin.
Explication:
Pour commencer,
Z
=0
,W
=2
etO
= 1. Cela permet de placer deW
et àO
côté de l'autre, alors que l' utilisation2
et1
serait interprété comme le nombre 21 sans espace de séparation (un caractère supplémentaire non désiré). Dans Clip, la fonction modulo (%
) fonctionne sur des non-entiers, donc, pour savoir si une valeurv
est un entier, vous vérifiez siv
mod 1 = 0. En utilisant la syntaxe Clip, cela s'écrit=0%v1
. Cependant, comme les booléens sont stockés sous1
(ou quoi que ce soit d'autre) et0
, vérifier si quelque chose est égal à0
est simplement «ne pas le faire». Pour cela, Clip a l'!
opérateur. Dans mon code,v
c'estlnx2
.x
est une entrée de stdin,n
convertit une chaîne en nombre etlab
est la baseb
de log dea
. Le programme se traduit donc (de manière plus lisible) par0 = ((log base 2 of parseInt(readLine)) mod 1)
.Exemples:
les sorties
et
les sorties
Edit 1: remplacé
0
,1
et2
avecZ
,O
etW
.Edit 2: remplacé
=Z
par!
.Également:
Pyth , 5
Compresse encore plus la version Clip, car Pyth a Q pour une entrée déjà évaluée et une fonction log2 (a) au lieu d'un simple journal général (a, b).
la source
Javascript (37)
Script simple qui se divise simplement par 2 à plusieurs reprises et vérifie le reste.
la source
for
boucle (également 37 caractères)for(i=prompt();i>1;i/=2){}alert(i==1)
Mathématique (21)
Sans entrée, c'est un peu plus court
la source
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 caractèresComment cela fonctionne: vous prenez le logarithme à la base 2 en utilisant
l(prompt()) / l(2)
, et si ce résultat modulo 1 est égal à zéro, alors c'est une puissance de 2.Par exemple: après avoir pris le logarithme de 8 sur la base
2
, vous obtenez3
.3 modulo 1
est égal à 0, donc cela renvoie vrai.Après avoir pris le logarithme de 7 sur la base 2, vous obtenez
2.807354922057604
.2.807354922057604 modulo 1
est égal à0.807354922057604
, ce qui renvoie false.la source
Math.log
le fera déjà : "Chacune des fonctions d'objet Math suivantes applique l'opérateur abstrait ToNumber à chacun de ses arguments ..."JavaScript, 35
Fonctionne pour les octets.
Version à 46 caractères , fonctionne pour les nombres à 16 bits.
L'astuce fonctionne dans la plupart des langues dynamiques.
Explication: Convertissez le nombre en base 2, interprétez cette chaîne comme base 10, faites modulo 9 pour obtenir la somme des chiffres, qui doit être 1.
la source
0x2ff
qu'en est-il de la base 21111111111
?+1
,!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 caractères
Utilise la même méthode d'un ancien thread FWP que mon entrée GolfScript . Imprime
1
si l'entrée est une puissance de deux, et une ligne vide sinon.Doit être exécuté avec
perl -nE
; lesn
coûts un caractère supplémentaire , pour un total de 14 caractères. Alternativement, voici une version à 18 caractères qui n'a pas besoin den
:la source
python 3, 38
python, 32
Cependant, le code ne fonctionne pas dans toutes les versions.
Notez que la solution fonctionne également pour 0 (affichez False).
la source
==
par&
?Ruby - 17 caractères (quatrième essai)
Mon meilleur moment est une fusion de la réponse de @ steenslag avec la mienne. Voici mes précédentes tentatives.
Ruby - 19 caractères (troisième essai)
Ruby - 22 caractères (deuxième essai)
Ruby - 24 caractères (premier essai)
la source
K / Kona (
2417)Renvoie 1 si vrai et 0 si faux. Toute puissance de 2 a un seul bit égal à 1:
(cela affiche toutes les puissances de 2 (de 0 à 9) en binaire)
Je résume donc toutes les composantes de l'expression binaire de
x
et vois si elle est égale à 1; si ouix=2^n
, sinon non.... je savais que je pouvais le rendre plus petit
la source
C # (54 caractères)
la source
Int32
, pasToInt32
...int
au lieu deInt32
pour 2 caractères de moins.Rebmu (9 caractères)
Tester
Rebmu est un dialecte resserré de Rebol. Le code est essentiellement:
Alternative
14 caractères — Rebmu n'a pas de bit au niveau «ET» ET ~
À Rebol:
la source
GTB , 46 octets
la source
Python, 35
N'utilise pas seulement les opérations +/-, mais toutes les opérations mathématiques à part la conversion en forme binaire.
Autres trucs (intéressants, mais pas pour la compétition):
J'ai également une version regexp (61) :
(J'adore l'idée, mais la fonction d'importation et de correspondance la rend trop longue)
Et une version d'opérations au niveau du bit sympa mais ennuyeuse (31) :
(oui, c'est plus court, mais il utilise ~ -x pour décrémenter ce qui contient - opération)
la source
Python 2.7 (
30293937)EDIT: mis à jour en raison des exigences d'entrée de l'utilisateur;
Force brute, essayez de diviser jusqu'à = 1 (succès) ou <1 (échec)
la source
not a%2
peut être écrit commea%2==0
. Certes, ce serait plus long dans de nombreuses langues, mais pas en Python.a%2<1
.2.
suppression qui permettrait d'économiser un octet!Python (33)
la source
int(bin(input()*2)[3:])<1
fonctionne également à partir du shell python avec seulement 25 caractères.Rubis,
33,28, 25la source
APL (12 pour 0/1, 27 pour oui / non)
ou, si nous devons sortir du texte:
Lire en A. Former un vecteur 0..A, puis un vecteur 2 0 ..2 A (oui, c'est bien plus que nécessaire), puis un vecteur comparant A à chacun d'eux (résultant en un vecteur de 0 et au plus un 1), puis xor que (il n'y a pas d'opérateur xor dans APL, mais ≠ appliqué aux booléens agira comme un.) Nous avons maintenant 0 ou 1.
Pour obtenir OUI ou NON: multipliez le 0 ou 1 par 3, supprimez ce nombre de caractères de 'OUI NON', puis prenez les 3 premiers caractères de cela.
la source
C, 65 octets
la source
main(k){...
, en vous appuyant sur leint
typage implicite . C'est peut-être UB, mais c'est du golf de code. NE JAMAIS utiliser quelque chose comme ça dans la production, bien sûr.Haskell (
5250)la source