Hintergrund
Das Hamming-Gewicht einer Ganzzahl ist die Anzahl der Einsen in ihrer Binärdarstellung. Für diese Herausforderung werden Ganzzahlen mit 32 Bit dargestellt und sie sind vorzeichenlos.
Herausforderung
Geben Sie bei einer Ganzzahl zwischen 0 und 2 ^ 32-1 (nicht inklusive) eine andere Ganzzahl in demselben Bereich und mit demselben Hamming-Gewicht aus.
Beispiele
Input (Decimal) | Input (Binary) | Hamming weight | Possible output (Decimal)
46 | 0b0010 1110 | 4 | 15
12 | 0b0000 1100 | 2 | 3
1 | 0b0000 0001 | 1 | 2
3 | 0b0000 0011 | 2 | 6
2^31 | 0b1000....0 | 1 | 1
2^31+2 | 0b1000...10 | 2 | 3
2^32-5 | 0b1111..011 | 31 | 2^31-1
2^32-2 | 0b1111....0 | 31 | 2^31-1
0 | 0b0000 0000 | 0 | None (This case need not be handled)
2^32-1 | 0b1111....1 | 32 | None (This case need not be handled)
Wertung
Das ist Code-Golf , also gewinnt die Lösung mit den wenigsten Bytes in jeder Sprache.
2^31+2
, wiederhole ich, dass ich eine ungerade Zahl gesagt habe . Die fraglichen Antworten sind nur fehlgeschlagen, wenn sowohl das höchste als auch das niedrigste Bit vorhanden sind1
.Antworten:
x86-64-Assembly,
54 BytesEine Funktion, die die C-Aufrufkonvention verwendet und deren Argument bitweise um 1 Bit nach links dreht.
quelle
n << 1 | n >> 31
zu werden,rol
anstattror
(ein Byte zu speichern).Python, 20 Bytes
Bitweise Drehung um 1 Bit nach links.
quelle
MATL , 9 Bytes
Verschiebt die 32-stellige Binärdarstellung zirkular um einen Schritt nach rechts.
Probieren Sie es online!
quelle
Gelee ,
108 BytesVertauscht das niedrigstwertige gesetzte und nicht gesetzte Bit.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
35-31ByteSucht nach dem ersten Bitübergang (0 → 1 oder 1 → 0) und invertiert ihn.
Demo
Code-Snippet anzeigen
Bitrotation, 14 Bytes
Viel kürzer, aber weniger Spaß.
Demo
Code-Snippet anzeigen
quelle
f(2147483647)
ist-1073741825
und(n=>n>>>31|n<<1)(2147483647)
ist-2
.k
ist zunächst festgelegt,undefined
und wir nutzen die Tatsache, dass~undefined
gleich ist-1
.Gehirn-Flak , 78 Bytes
Probieren Sie es online!
Gibt 2n zurück, wenn n <2 ^ 31, andernfalls 2n + 1-2 ^ 32. Da Brain-Flak das Vorzeichen einer Zahl nicht schnell ermitteln kann, tritt bei TIO ein Timeout des Programms auf, wenn die Eingabe um mehr als 500000 von 2 ^ 31 abweicht.
Erläuterung
Schieben Sie zuerst -2 ^ 32 auf den Stapel:
Berechnen Sie dann die gewünschte Ausgabe:
quelle
dc, 10
Probieren Sie es online aus .
Dies ist eine arithmetische Implementierung einer 32-Bit-Rechtsdrehung:
quelle
Java 8,
1171729 Bytes+12 Bytes durch Ändern
int
auflong
, weilint
die maximale Größe ist2³¹-1
Durch das Erstellen eines Ports von @AndersKaseorgs erstaunlicher Python-Antwort werden100 bis89 Byte gespart .Probieren Sie es hier aus.
Ausgänge:
Alte Antwort (
117118 Bytes):+1 Byte durch Ändern
int
auflong
, daint
die maximale Größe ist2³¹-1
Probieren Sie es hier aus.
Ausgänge:
quelle
Mathematica, 29 Bytes
Probieren Sie es in der Wolfram Sandbox aus
Dreht rechnerisch nach links: Zuerst mit 2 multiplizieren, wodurch möglicherweise die Zahl außerhalb des Bereichs verschoben wird, dann die außerhalb des Bereichs liegende Ziffer mit abschneiden
Mod[...,2^32]
und mit wieder rechts addieren+Quotient[...,2^32]
.(Mathematica hat eine einzige Funktion, die den Modul und den Quotienten in einem Zug angibt, aber es
QuotientRemainder
ist eine Art Golf-Handicap.)quelle
APL, 12 Bytes
Wie?
quelle
05AB1E , 5 Bytes
Probieren Sie es online!
Erläuterung
Verwendet den Trick, um die Binärdarstellung zu drehen, die um 1 Bit von Anders Kaseorgs Python-Antwort übrig bleibt .
quelle
R,
4263 BytesMischt die Bits nach dem Zufallsprinzip, überprüft jedoch, ob nicht zufällig dieselbe Zahl zurückgegeben wird.
quelle
Leerzeichen ,
8180 Bytes(1 Byte gespart dank @ Ørjan Johansen, der mich daran erinnert, dass dup kürzer ist als Push 0)
Probieren Sie es online!
Implementiert grundsätzlich eine zyklische Rechts-Bitverschiebung unter Verwendung einer Ganzzahl-Arithmetik. Das Pushen einer großen Konstante ist in Whitespace teuer, daher sparen wir einige Bytes, indem wir 2 ^ 8 drücken und zweimal quadrieren. (Speichert 1 Byte über (2 ^ 16) ^ 2 und 10 Byte über das direkte Drücken von 2 ^ 32.)
Erläuterung
quelle
push 0
durch einendup
Ein-Befehl früher ersetzen .Python 2.7, 89 Bytes
Volles Programm:
Probieren Sie es online!
Vorschläge willkommen! :)
quelle
Pari / GP , 15 Bytes
Probieren Sie es online!
quelle
Japt , 5 Bytes
Bitweise Drehung, wie die meisten Antworten hier.
Versuch es
quelle
Perl 5
-p
, 39 BytesProbieren Sie es online!
quelle
Python 3 , 45 Bytes
Probieren Sie es online!
quelle
C ++ (GCC) ,
4539 Bytes-6 Bytes Danke an ceilingcat
Probieren Sie es online!
quelle