Hintergrund
In der Mathematik ist bekannt, dass Ganzzahlen in eine Eins-zu-Eins-Entsprechung mit Paaren von Ganzzahlen gesetzt werden können. Es gibt viele Möglichkeiten, dies zu tun, und in dieser Herausforderung implementieren Sie eine davon und ihre inverse Operation.
Die Aufgabe
Ihre Eingabe ist eine positive Ganzzahl n > 0
. Es ist bekannt, dass es eindeutige nicht negative ganze Zahlen gibt, a, b ≥ 0
so dass . Ihre Ausgabe ist die "gespiegelte Version" der positiven Ganzzahl .n == 2a * (2*b + 1)
n
2b * (2*a + 1)
Sie können davon ausgehen, dass die Eingabe und Ausgabe in den Standard-Integer-Datentyp ohne Vorzeichen Ihrer Sprache passen.
Regeln und Wertung
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese sind im Format angegeben in <-> out
, da die zu implementierende Funktion eine eigene Umkehrung ist: Wenn Sie die Ausgabe darauf zurückführen, sollten Sie die ursprüngliche Eingabe erhalten.
1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren. Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
quelle
Antworten:
Jelly ,
171615 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Pyth,
1615 Bytes1 Byte danke an Dennis
Testsuite
Erläuterung:
quelle
MATL , 22 Bytes
Probieren Sie es online!
Erläuterung
quelle
Q
für1+
(dies wurde kürzlich eingeführt) undq
für verwenden1-
. Das spart auch Platz (mit dem manH
sowieso sparen könnte ). Siehe hierPython 2, 39 Bytes
n & -n
gibt die größte Potenz von 2, die sich teiltn
. Es funktioniert, weil in Zweierkomplementarithmetik-n == ~n + 1
. Wennn
hat k Nullen, wird ihr Komplement nehmen verursachen , es zu haben k Hinter diejenigen. Wenn Sie dann 1 hinzufügen, werden alle nachgestellten Einsen in Nullen geändert, und das 2 ^ k- Bit wird von 0 auf 1 geändert. Es-n
endet also mit einer 1, gefolgt von k 0 (genau wien
), währendn
an allen höheren Stellen das entgegengesetzte Bit von vorhanden ist .quelle
n&-n
funktioniert? Ich sehe, was dieser Trick tun, aber nicht wie :(n&-n
gibt die höchste Potenz von 2 zurück, die sich teiltn
.n & -n
.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100
, aber es sind zwei Zeichen hinter der besten Lösung.n
.MATL , 25
26BytesDies verwendet die aktuelle Version (10.2.1) der Sprache / des Compilers.
Probieren Sie es online!
Erläuterung
Ziemlich unkompliziert, basierend auf roher Gewalt. Versucht alle Kombinationen von a und b , wählt die entsprechende aus und führt die erforderliche Berechnung durch.
quelle
Julia, 41 Bytes
Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Wir definieren
a
als 1 + den Exponenten von 2 in der Primfaktorisierung vonn
. Dafactor
kehrt einDict
, können wir verwenden ,get
mit einem Standardwert von 0 , falls die Primfaktorzerlegung enthält keine 2. Wir Verschiebung nach rechts Bitn
durcha
, und auf diese Leistung 2 nehmen. Wir multiplizieren das mit2a-1
, um das Ergebnis zu erhalten.quelle
Perl 5, 40 Bytes
38 Bytes plus 2 für
-p
-p
liest die STDIN in die Variable ein$_
.$i++,$_/=2until$_%2
Inkremente$i
(die bei 0 beginnen) und halbieren,$_
bis$_
mod 2 ungleich Null ist. Danach$_
ist der ungerade Faktor der ursprünglichen Zahl und$i
der Exponent von 2.$_=2*$i+1<<$_/2-.5
- Die rechte Seite von=
ist nur die Formel für die gesuchte Zahl: {1 mehr als der doppelte Exponent von 2} mal {2 hoch dem halben ungeraden Faktor minus der Hälfte}}. "Times {2 to the power of…}" wird jedoch als "bitweise nach links verschoben von…" gewertet. Und diese rechte Seite ist zugeordnet$_
.Und
-p
druckt$_
.quelle
C 49 Bytes
quelle
JavaScript ES6,
3633 BytesMeines Wissens wird das
Math.clz32
kürzer sein als herumzuspielentoString(2).length
.Bearbeiten: 3 Bytes dank @ user81655 gespeichert.
quelle
n&-n
eine Variablen=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, aber ich brauche esn
wieder ...PARI / GP , 38 Bytes
Beachten Sie, dass
>>
und\
haben die gleiche Priorität und sind berechnet von links nach rechts, so dass der letzte Teil sein kann ,n>>k\2
als vielmehr(n>>k)\2
. Die ungolfed Version würdek
lexikalisch machen mitmy
:quelle