Ihre Herausforderung besteht darin, bei einer bestimmten Ganzzahl K >= 1
nicht negative Ganzzahlen zu finden, A
und zwar B
so, dass mindestens eine der beiden folgenden Bedingungen zutrifft:
K = 2^A + 2^B
K = 2^A - 2^B
Wenn es ein solches A
und nicht gibt B
, kann sich Ihr Programm auf irgendeine Weise verhalten. (Zur Verdeutlichung A
und B
kann gleich sein.)
Testfälle
Es gibt oft mehrere Lösungen für eine Zahl, aber hier sind einige:
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
Der letzte Test Fall 17179867136
, muss in unter 10 Sekunden läuft auf jede relativ moderne Maschine. Dies ist ein Codegolf, also gewinnt das kürzeste Programm in Bytes. Sie können ein vollständiges Programm oder eine Funktion verwenden.
16
, beide5,4
und3,3
sind gültig.A
,B
negativ sein? (zB-1, -1
für 1)Antworten:
Jelly ,
11 bis10 BytesAnwenden des Bit-Twiddling-Tricks aus der Python-Antwort von @xnor
Testen Sie es bei TryItOnline
Alle Testfälle finden Sie auch bei TryItOnline
Wie?
quelle
Python 2, 43 Bytes
Sag das
n==2^a ± 2^b
mita>b
. Dann ist der größte Faktor dern
Zweierpotenz2^b
, und wir können ihn mit dem Bit-Trick finden2^b = n&-n
. Damit können wir berechnen2^b + n
, was entweder2^a + 2 * 2^b
oder nur gleich ist2^a
. Entweder hat man die gleiche Bitlänge wiea
*. Wir geben also die Bitlängen vonn&-n
und aus(n&-n)+n
, berechnet aus den Längen ihrer binären Darstellungen. Python 3 ist für parens in ein Byte längerfor k in(n,0)]
.* Außer das
2^a + 2^b
mita==b+1
einer längeren Bitlänge, aber das ist in Ordnung, weil wir das so interpretieren können2^(a+1)-2^b
.quelle
n=4
oder8
oder16
bitte.f(2**n)
kehrt zurück(n+1,n)
und2**(n+1)-2**n=2**n
es gibt kein Problem.bin()
in Python?0b
, daher der-3
.JavaScript (ES6), 73 Byte
Für den Subtraktionsfall ist die erste Zahl die Anzahl der Ziffern in der Binärdarstellung und die zweite Zahl die Anzahl der nachgestellten Nullen. Für den Additionsfall subtrahieren wir 1 von der ersten Zahl. Wenn die binäre Darstellung alle 1s gefolgt von einigen 0s ist, wird der Additionsfall angenommen, andernfalls wird der Subtraktionsfall angenommen. 36-Byte-Port von @ xnors Version, der nur für B≤30 in JavaScript funktioniert:
quelle
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
Und beide Versionen kehren[34,11]
zum letzten Testfall zurück (ich verwende FF 48).Perl,
524932 BytesAlte Lösung (49 Bytes)
Beinhaltet +1 für
-p
Geben Sie Input auf STDIN:
pow2.pl
Wenn Sie jedoch den Algorithmus von xnor verwenden und einen Twist hinzufügen, erhalten Sie 32 Bytes:
Nur der Code:
Dies leidet unter schwerwiegenden Rundungsfehlern, da sie
13/9 = 1.444...
weit darüber liegen1/log 2 = 1.44269...
(log
selbst hat sie einen Rundungsfehler, der jedoch so viel kleiner ist, dass wir ihn in der Analyse von 13/9 zusammenfassen können). Aber da jedes2**big - 2** small
korrigiert wird,2** big
bevor das Protokoll erstellt wird, spielt das keine Rolle und die Berechnung für2**big + 2 * 2**small
wird abgeschnitten, ist also auch sicher. Und auf der anderen Seite des Bereichs2**n+2**(n-1)
wird der Bereich nicht genug vergrößert[0,64]
(ich kann nicht richtig Unterstützung mehr als der ganzzahlige Bereich sowieso aufgrund der Verwendung von&
), um zu einem falschen Ergebnis zu führen (Multiplikator1.5
wäre jedoch für große Zahlen zu weit entfernt).quelle
Brachylog , 23 Bytes
Probieren Sie es online!
Dies ist viel schneller als erforderlich, z. B. bei TIO noch unter 10 Sekunden .
Erläuterung
Dies ist im Grunde eine direkte Transkription der Formel ohne Optimierung:
quelle
Python, 69 Bytes
Tests sind auf ideone
Da nicht gültige Eingaben alles können, wissen wir, dass wenn für die Eingabe genau 2 Bits gesetzt sind, dies die Summe dieser 2 Zweierpotenzen ist. Andernfalls wird (sofern gültig) eine Reihe von Bits (einschließlich) ausgeführt die Möglichkeit von nur 1 Bit) und wird die Differenz zwischen der nächsthöheren Potenz von 2 als dem MSB und dem LSB-Satz sein.
quelle
JAVA 7,
142,140, 134 BytesDies ist mein erster Beitrag zu PPCG! Ich würde mich sehr über Feedback zu Golftipps freuen.
Danke an frozen für das Sparen von 2 Bytes
UNGOLF
ideone
quelle
40=2**3+2**5
Zum Beispiel scheint es nicht zu funktionieren . Wenn ich es mir ansehe, kann ich nicht verstehen, warum nicht, vielleicht habe ich einen Transkriptionsfehler gemacht ...1
anstatt eine Variable dafür zu deklarieren?for(int i=-1,j;[...]
Mathematica,
5754 Bytes3 Bytes gespart dank LegionMammal978!
Druckt tatsächlich alle 1 passenden Paare aus {a, b}.
2Log@#+1
ist eine Obergrenze für die größtea
, die möglicherweise bei der Darstellung der Eingabe auftreten kann#
(die enge Obergrenze ist Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). Läuft fast augenblicklich auf dem Testeingang und in weniger als einer Viertelsekunde (auf meinem neuen, aber handelsüblichen Computer) auf 100-stelligen Eingängen.1 Wenn Sie
a
mit dem Standardwert 1 anstelle von 0 beginnen, werden zwei Bytes gespeichert. es führt dazu, dass die Ausgabe {0,0} verfehlt wird, wenn die Eingabe 2 ist, findet aber in diesem Fall die Ausgabe {2,1}, was gut genug ist.quelle
If[Abs[2^a-#]==2^b,Print@{a,b}]
Kann auch durch ersetzt werdenAbs[2^a-#]==2^b&&Print@{a,b}
, um 3 Bytes zu sparen.)MATL ,
2322 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Perl 6 , 41 Bytes
(Algorithmus schamlos aus der Perl 5-Antwort kopiert )
Erläuterung:
Verwendung:
quelle
PHP, 73 Bytes
Ich hätte Jonathans Pyhton 2-Lösung für 54 Bytes (+13 Overhead) kopieren können, wollte mir
aber etwas anderes einfallen lassen.
In Datei speichern, dann mit
php
oder ausführenphp-cgi
.druckt
a
undb
durch einen Unterstrich getrennt, alles für keine Lösung.unverwechselbare Lösung, 96 Bytes
druckt
a
undb
durch einen Unterstrich getrennt; Ein einziger Unterstrich für keine Lösung.Es sagt Ihnen sogar die Operation für 11 weitere Bytes:
Ersetzen Sie einfach den ersten Unterstrich im Code durch
'-+'[!$m[2]]
.quelle
PHP, 117 Bytes
Extended Version 4 Cases
die Kurzversion vereint Fall 1 und 3 und unterscheidet sich von Fall 3 und in beiden Versionen liefert Fall 4 keine Ausgabe.
quelle