Ceci est une version du défi récent. Ce nombre est-il une puissance entière de -2? avec un ensemble différent de critères conçus pour mettre en évidence la nature intéressante du problème et rendre le défi plus difficile. J'y ai réfléchi ici .
Le défi merveilleusement énoncé par Toby dans la question connexe est le suivant:
Il existe des moyens intelligents pour déterminer si un entier est une puissance exacte de 2. Ce n'est plus un problème intéressant, alors déterminons si un entier donné est une puissance exacte de -2 . Par exemple:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Règles:
- Un entier est de 64 bits, signé, complément à deux. Il s'agit du seul type de données avec lequel vous pouvez travailler.
- Vous ne pouvez utiliser que les opérations suivantes. Chacune de ces opérations compte pour une opération.
n << k
,n >> k
: Décalage gauche / droiten
park
bits. Le bit de signe est étendu dans le décalage à droite.n >>> k
: Décalage à droite mais sans étendre le bit de signe. Les 0 sont décalés.a & b
,a | b
,a ^ b
: Bitwise ET, OU, XOR.a + b
,a - b
,a * b
: Ajouter, soustraire, multiplier.~b
: Inversion au niveau du bit.-b
: Négation du complément à deux.a / b
,a % b
: Diviser (quotient entier, arrondi vers 0) et modulo.- Le module des nombres négatifs utilise les règles spécifiées en C99 :
(a/b) * b + a%b
doit être égala
. Il en5 % -3
est de même2
et-5 % 3
est-2
: 5 / 3
est1
,5 % 3
est2
, comme 1 * 3 + 2 = 5.-5 / 3
est-1
,-5 % 3
est-2
, comme -1 * 3 + -2 = -5.5 / -3
est-1
,5 % -3
est2
, comme -1 * -3 + 2 = 5.-5 / -3
est1
,-5 % -3
est-2
, comme 1 * -3 + -2 = -5.- Notez que l'
//
opérateur de division de plancher de Python ne satisfait pas ici la propriété de "division vers 0" de la division et que l'%
opérateur de Python ne satisfait pas non plus aux exigences.
- Le module des nombres négatifs utilise les règles spécifiées en C99 :
- Les affectations ne comptent pas comme une opération. Comme en C, les affectations sont évaluées à la valeur du côté gauche après l'affectation:
a = (b = a + 5)
définitb
sura + 5
, puis définita
surb
et compte comme une opération. - Les affectations composées peuvent être utilisées comme des
a += b
moyensa = a + b
et comptent comme une opération.
- Vous pouvez utiliser des constantes entières, elles ne comptent pour rien.
- Les parenthèses pour spécifier l'ordre des opérations sont acceptables.
- Vous pouvez déclarer des fonctions. Les déclarations de fonction peuvent être dans n'importe quel style qui vous convient, mais notez que les entiers 64 bits sont le seul type de données valide. Les déclarations de fonction ne comptent pas comme des opérations, mais un appel de fonction compte comme un. En outre, pour être clair: les fonctions peuvent contenir plusieurs
return
instructions et lesreturn
s de n'importe quel point sont autorisés. Lereturn
lui-même ne compte pas comme une opération. - Vous pouvez déclarer des variables sans frais.
- Vous pouvez utiliser des
while
boucles, mais vous ne pouvez pas utiliserif
oufor
. Les opérateurs utilisés dans lawhile
condition comptent pour votre score.while
les boucles s'exécutent tant que leur condition est évaluée à une valeur non nulle (un 0 "véridique" dans les langues qui ont ce concept n'est pas un résultat valide). Le retour anticipé étant autorisé, vous êtes autorisé à utiliserbreak
aussi bien - Le débordement / sous-dépassement est autorisé et aucun serrage de valeur ne sera effectué. Il est traité comme si l'opération s'est réellement déroulée correctement et a ensuite été tronqué à 64 bits.
Critères de pointage / de victoire:
Votre code doit produire une valeur non nulle si l'entrée est une puissance de -2 et zéro sinon.
C'est le golf à code atomique . Votre score est le nombre total d'opérations présentes dans votre code (tel que défini ci-dessus), et non le nombre total d'opérations exécutées au moment de l'exécution. Le code suivant:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Contient 5 opérations: deux dans la fonction et trois appels de fonction.
Peu importe la façon dont vous présentez votre résultat, utilisez ce qui est pratique dans votre langage, que ce soit finalement le stockage du résultat dans une variable, le retour d'une fonction, ou autre.
Le gagnant est le poste qui est manifestement correct (fournissez une preuve occasionnelle ou formelle si nécessaire) et qui a le score le plus bas comme décrit ci-dessus.
Bonus en mode très difficile!
Pour avoir une chance de gagner absolument rien, sauf la capacité potentielle d'impressionner les gens lors des fêtes, soumettez une réponse sans utiliser de while
boucles! Si suffisamment de ceux-ci sont soumis, je peux même envisager de diviser les groupes gagnants en deux catégories (avec et sans boucles).
Remarque: Si vous souhaitez fournir une solution dans une langue qui ne prend en charge que les entiers 32 bits, vous pouvez le faire, à condition de justifier suffisamment qu'elle sera toujours correcte pour les entiers 64 bits dans une explication.
Aussi: Certaines fonctionnalités spécifiques à une langue peuvent être autorisées sans frais si elles n'échappent pas aux règles mais sont nécessaires pour contraindre votre langue à se comporter conformément aux règles ci-dessus . Par exemple (artificiel), je permettrai une comparaison libre non égale à 0 dans les while
boucles, lorsqu'elle est appliquée à la condition dans son ensemble, comme solution de contournement pour une langue qui a des «vrais» 0. Des tentatives claires de tirer parti de ces types de choses ne sont pas autorisées - par exemple, le concept de valeurs "véridiques" 0 ou "non définies" n'existe pas dans le jeu de règles ci-dessus, et il est donc possible de ne pas s'y fier.
m ^= s
c'est toujours impressionnant, et je pense que ce serait tout à fait OK de faire la substitution pour l'améliorer encore plus.
while
et break
non if
? if (x) { ... }
est équivalent à while (x) { ... break; }
.
break
et les retours précoces sont la partie regrettable) et c'est une longue histoire et une leçon apprise dans les règles pour les défis futurs. Il y a toujours la version "bonus"! :)
if
et for
sont refusés? int x=condition; while (x) { ... x=0; }
est gratuit, juste plus de code. Même chose avec c style for
.