Votre défi, si vous choisissez de l'accepter, est, étant donné un entier K >= 1
, de trouver des entiers non négatifs A
et B
tels qu'au moins une des deux conditions suivantes soit vérifiée:
K = 2^A + 2^B
K = 2^A - 2^B
S'il n'existe pas tel A
et B
, votre programme peut se comporter de n'importe quelle façon. (Pour clarifier, A
et B
peut être égal.)
Cas de test
Il existe souvent plusieurs solutions à un certain nombre, mais en voici quelques-unes:
K => A, B
1 => 1, 0
15 => 4, 0 ; 16 - 1 = 15
16 => 5, 4 ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3 ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11 ; 17179869184 - 2048 = 17179867136
Le dernier cas de test, 17179867136
, doit être exécuté en moins de 10 secondes sur une machine relativement moderne. C'est un golf de code, donc le programme le plus court en octets gagne. Vous pouvez utiliser un programme complet ou une fonction.
16
, les deux5,4
et3,3
sont valides.A
-ilB
être négatif? (par exemple-1, -1
pour 1)Réponses:
Gelée ,
1110 octetsAppliquer l'astuce de twiddling de bits de la réponse Python par @xnor
Testez-le sur TryItOnline
Tous les cas de test sont également sur TryItOnline
Comment?
la source
Python 2, 43 octets
Dites ça
n==2^a ± 2^b
aveca>b
. Ensuite, le plus grand facteur de puissance de 2n
est2^b
, et nous pouvons le trouver en utilisant le bit-trick2^b = n&-n
. Cela nous permet de calculer2^b + n
, ce qui est égal2^a + 2 * 2^b
ou juste2^a
. L'un ou l'autre a la même longueur de bits quea
*. Ainsi, nous émettons les longueurs de bits den&-n
et(n&-n)+n
, calculées à partir des longueurs de leurs représentations binaires. Python 3 est un octet de plus pour les parens dansfor k in(n,0)]
.* Sauf
2^a + 2^b
qu'aveca==b+1
a une longueur de bit plus longue, mais c'est très bien car nous pouvons interpréter cela comme2^(a+1)-2^b
.la source
n=4
ou8
ou16
s'il vous plaît.f(2**n)
revient(n+1,n)
et2**(n+1)-2**n=2**n
il n'y a donc aucun problème.bin()
Python?0b
, d'où le-3
.JavaScript (ES6), 73 octets
Pour le cas de soustraction, le premier nombre est le nombre de chiffres dans la représentation binaire et le deuxième nombre est le nombre de zéros à droite. Pour le cas d'addition, on soustrait 1 du premier nombre. Si la représentation binaire est tous les 1 suivis de quelques 0 alors le cas d'addition est supposé sinon le cas de soustraction est supposé. Port de 36 octets de la version @ xnor qui ne fonctionne que pour B≤30 en JavaScript:
la source
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
Et les deux versions reviennent[34,11]
sur le dernier cas de test (j'utilise FF 48).Perl,
524932 octetsAncienne solution (49 octets)
Comprend +1 pour
-p
Donnez votre avis sur STDIN:
pow2.pl
Cependant, l'utilisation de l'algorithme de xnor et l'ajout d'une torsion donne 32 octets:
Juste le code:
Cela souffre d'une grave erreur d'arrondi car il
13/9 = 1.444...
est un peu au-dessus1/log 2 = 1.44269...
(log
lui-même a également une erreur d'arrondi mais qui est tellement plus petit que nous pouvons le conclure dans l'analyse du 13/9). Mais comme tout2**big - 2** small
est corrigé2** big
avant le journal, cela n'a pas d'importance et le calcul de2**big + 2 * 2**small
est tronqué, il est donc également sûr. Et de l'autre côté de la plage, il2**n+2**(n-1)
n'est pas suffisamment augmenté dans la plage[0,64]
(je ne peux pas correctement prendre en charge plus que la plage entière de toute façon en raison de l'utilisation de&
) pour conduire à un mauvais résultat (le multiplicateur1.5
serait cependant trop éloigné pour les grands nombres).la source
Brachylog , 23 octets
Essayez-le en ligne!
Ceci est beaucoup plus rapide que nécessaire, par exemple, il reste moins de 10 secondes sur TIO .
Explication
Il s'agit essentiellement d'une transcription directe de la formule sans optimisation:
la source
Python, 69 octets
Les tests sont sur idéone
Étant donné qu'une entrée non valide peut faire n'importe quoi, nous savons que si l'entrée a exactement 2 bits définis, c'est la somme de ces 2 puissances de 2, et sinon (si elle est valide), ce sera une série d'un certain nombre de bits (y compris la possibilité de seulement 1 bit) et sera la différence entre la prochaine puissance la plus élevée de 2 que le MSB et l'ensemble LSB.
la source
JAVA 7,
142,140, 134 octetsCeci est mon premier article sur PPCG! J'apprécierais vraiment les commentaires sur les astuces de golf
Merci à gelé pour avoir économisé 2 octets
UNGOLF
idéone
la source
40=2**3+2**5
, par exemple. En le regardant, je ne vois pas pourquoi, peut-être que j'ai fait une erreur de transcription ...1
au lieu de lui déclarer une variable?for(int i=-1,j;[...]
Mathematica,
5754 octetsEnregistré 3 octets grâce à LegionMammal978!
Imprime en fait toutes les 1 paires appropriées {a, b}.
2Log@#+1
est une limite supérieure pour la plus grandea
qui peut éventuellement apparaître lors de la représentation de l'entrée#
(la limite supérieure étroite est Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). Fonctionne presque instantanément sur l'entrée de test, et en moins d'un quart de seconde (sur mon nouvel ordinateur standard) sur des entrées à 100 chiffres.1 Laisser
a
démarrer à la valeur par défaut de 1 au lieu de 0 économise deux octets; il provoque la sortie {0,0} à manquer lorsque l'entrée est 2, mais trouve la sortie {2,1} dans ce cas, ce qui est assez bon.la source
If[Abs[2^a-#]==2^b,Print@{a,b}]
peut être remplacé parAbs[2^a-#]==2^b&&Print@{a,b}
pour économiser 3 octets.)MATL ,
2322 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Perl 6 , 41 octets
(Algorithme copié sans vergogne à partir de la réponse Perl 5 )
Explication:
Usage:
la source
PHP, 73 octets
J'aurais pu copier la solution Pyhton 2 de Jonathan pour 54 octets (+13 de surcharge),
mais je voulais trouver quelque chose de différent.
enregistrer dans un fichier, puis exécuter avec
php
ouphp-cgi
.imprimés
a
etb
séparés par un trait de soulignement, rien pour aucune solution.solution distinctive, 96 octets
imprimés
a
etb
séparés par un trait de soulignement; un seul soulignement pour aucune solution.Il vous indique même l'opération pour 11 octets supplémentaires: il
suffit de remplacer le premier trait de soulignement du code par
'-+'[!$m[2]]
.la source
PHP, 117 octets
Etuis version 4 étendue
la version courte réunit les cas 1 et 3 et fait une différence avec le cas 3 et dans les deux versions, le cas 4 ne donne aucune sortie.
la source