Was ist die umgekehrte (binäre) Bitnummer?


33

Sie erhalten also eine POSITIVE Basis 10 (Dezimalzahl). Ihre Aufgabe ist es, die Binärziffern umzukehren und diese Basis-10-Zahl zurückzugeben.

Beispiele:

1 => 1 (1 => 1)
2 => 1 (10 => 01)
3 => 3 (11 => 11)
4 => 1 (100 => 001)
5 => 5 (101 => 101)
6 => 3 (110 => 011)
7 => 7 (111 => 111)
8 => 1 (1000 => 0001)
9 => 9 (1001 => 1001)
10 => 5 (1010 => 0101)

Dies ist eine Herausforderung, daher gewinnt die Lösung, die die wenigsten Bytes verwendet.

Dies ist A030101 im OEIS.


2
Bedeutet "Umkehren der Bits" das Umkehren der Binärziffern? Manchmal kann es auch bedeuten, jedes Bit zu invertieren .
ETHproductions

Ja. Entschuldigung für die Unklarheit.
juniorRubyist

Dies und das sind sehr ähnlich.
Geobits


1
"base 10" Gibt es einen bestimmten Grund warum?
CalculatorFeline

Antworten:


20

Python , 29 Bytes

lambda n:int(bin(n)[:1:-1],2)

Probieren Sie es online!

Dies ist eine anonyme, unbenannte Funktion, die das Ergebnis zurückgibt.


Zuerst bin(n)wandelt das Argument in eine binäre Zeichenfolge. Normalerweise würden wir dies mit der Slice-Notation umkehren [::-1]. Dies liest den String mit einem Schritt von -1 , dh rückwärts. Binären Zeichenfolgen in Python wird jedoch ein vorangestellt 0b, und daher geben wir das zweite Argument des Slicings als 1 an . Dadurch wird Python angewiesen, rückwärts zu lesen und am Index 1 zu enden , sodass die Indizes 1 und 0 nicht gelesen werden .

Nachdem wir nun die rückwärts gerichtete Binärzeichenfolge haben, übergeben wir sie int(...)mit dem zweiten Argument als 2 . Dadurch wird die Zeichenfolge als Ganzzahl zur Basis 2 gelesen, die dann implizit vom Lambda-Ausdruck zurückgegeben wird.


2
Schlage dich um 9 Sekunden.
mbomb007


6
@ mbomb007 meine antwort ist also ungültig, weil du 9 sekunden vor hand auf den post button geklickt hast? Nur weil wir zur gleichen Zeit das gleiche Golfspiel erreichen, müssen wir keine Antworten löschen. Wenn überhaupt, beschuldigen Sie die 0-Mühe-Frage.
FlipTack

3
Nicht ungültig, aber definitiv sinnlos. Wenn ich langsamer gewesen wäre, würde ich einfach meinen löschen und einen Kommentar zu dem schnelleren posten, auf den ich auch gekommen bin.
mbomb007

1
@steenbergh Wen interessiert das? Gleicher Code, gleiche Punktzahl.
mbomb007


13

JavaScript (ES6), 30 28 Bytes

2 Bytes dank @Arnauld eingespart

f=(n,q)=>n?f(n>>1,q*2|n%2):q

Dies berechnet im Grunde genommen bitweise die Umkehrung: Wir beginnen mit q = 0 ; während n positiv ist, multiplizieren wir q mit 2, trennen das letzte Bit von n mit n>>1und addieren es zu q mit |n%2. Wenn n 0 erreicht, wurde die Zahl erfolgreich umgekehrt und wir geben q zurück .

Dank der langen integrierten Namen von JS sind für die Lösung dieser Herausforderung auf einfache Weise 44 Byte erforderlich:

n=>+[...n.toString(2),'0b'].reverse().join``

Wenn Sie eine Rekursion und eine Zeichenfolge verwenden, können Sie eine 32-Byte-Lösung erhalten, die dasselbe bewirkt:

f=(n,q='0b')=>n?f(n>>1,q+n%2):+q

f=(n,q)=>n?f(n>>1,q*2|n%2):qfast funktioniert. Aber leider nicht für n=0.
Arnauld

@Arnauld OP hat noch nicht geantwortet, ob der Eingang immer positiv sein wird, aber wenn ja, muss 0 nicht behandelt werden.
FlipTack

Dies ist ein spätes Follow-up, aber es ist bekannt, dass der Input immer positiv ist.
Arnauld

@ Arnauld Danke!
ETHproductions

10

Java 8, 53 47 46 45 Bytes

  • -4 Bytes dank Titus
  • -1 Byte dank Kevin Cruijssen

Dies ist ein Lambda-Ausdruck, der das gleiche Prinzip wie die Antwort der ETH hat (obwohl die Rekursion in Java zu ausführlich gewesen wäre, also schleifen wir stattdessen):

x->{int t=0;for(;x>0;x/=2)t+=t+x%2;return t;}

Probieren Sie es online!

Dies kann mit zugewiesen IntFunction<Integer> f = ...und dann mit aufgerufen werden f.apply(num). Erweitert, ungolfed und kommentiert sieht es so aus:

x -> { 
    int t = 0;           // Initialize result holder   
    while (x > 0) {      // While there are bits left in input:
        t <<= 1;         //   Add a 0 bit at the end of result
        t += x%2;        //   Set it to the last bit of x
        x >>= 1;         //   Hack off the last bit of x
    }              
    return t;            // Return the final result
};

1
Sparen Sie 3 Bytes mit t*2anstelle von (t<<1)einem weiteren, indem Sie diese Berechnung von Schleifenkopf zu Schleifenkörper verschieben. Können Sie xstatt x>0für die Bedingung verwenden?
Titus

2
@Titus nicht ohne explizite Besetzung eines Booleschen, aber danke für die anderen Tipps! Auch gerade realisiert, dass x>>=1durch ersetzt werden kann, x/=2da es sich automatisch um eine Ganzzahlteilung handelt.
FlipTack

45 Bytes (geändert t=t*2+in t+=t+.)
Kevin Cruijssen

@ KevinCruijssen schön!
FlipTack

9

J, 6 Bytes

|.&.#:

|. umkehren

&. unter

#: Basis 2




7

Labyrinth, 23 Bytes

?_";:_2
  :   %
 @/2_"!

Nun, das ist umständlich ... dies gibt die umgekehrte BINARY-Nummer zurück ... Vielen Dank an @Martin Ender, dass er sowohl auf meinen Fehler als auch auf meinen ID 10T-Fehler hingewiesen hat. Das funktioniert also nicht, ich muss eine andere Lösung finden.


1
Willkommen bei PPCG und schönen ersten Beitrag! Nur eine Herausforderung in einer Sprache wie Labyrinth zu meistern, kann sehr schwierig sein. Normalerweise stellen wir der ersten Zeile einer Antwort ein oder zwei Hashes # Labyrinth, 89 bytes
voran

1
Haben Sie versehentlich ein führendes Leerzeichen aus der zweiten Reihe weggelassen? So wie es aussieht, würde das Programm einfach in der ersten Zeile hin und her springen, da _sich diese an den Kreuzungen befinden.
Martin Ender

Leider ist mir gerade aufgefallen, dass dies unabhängig davon nicht gültig ist, da die Abfrage nach der Basis-10-Darstellung der umgekehrten Zahl fragt, nicht nach ihrer binären Darstellung.
Martin Ender

6

C 48 44 43 42 Bytes

-1 Byte dank Gurka und -1 Byte dank Anatolyg:

r;f(n){for(r=n&1;n/=2;r+=r+n%2);return r;}

Vorherige 44-Byte-Lösung:

r;f(n){r=n&1;while(n/=2)r=2*r+n%2;return r;}

Vorherige 48-Byte-Lösung:

r;f(n){r=0;while(n)r=2*(r+n%2),n/=2;return r/2;}

Ungolfed und Nutzung:

r;
f(n){
 for(
  r=n&1;
  n/=2;
  r+=r+n%2
 );
 return r;}
}


main() {
#define P(x) printf("%d %d\n",x,f(x))
P(1);
P(2);
P(3);
P(4);
P(5);
P(6);
P(7);
P(8);
P(9);
P(10);
}

Ist hier nicht rschon auf Null initialisiert r;f(n){r=0;, zB r=0;ist das nicht nötig? Auch kleiner Tippfehler: "Vorherige 48- Byte-Lösung"
Simon

1
@gurka Die Funktion sollte wiederverwendbar sein.
Karl Napf

1
Ich denke, dass forSchleifen immer mindestens so kurz wie whileSchleifen sind und oft kürzer.
anatolyg

@anatolyg so etwas wie: r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}? 1 Byte kürzer, aber ich bin mir nicht sicher, ob es ein gültiges C (C99) ist.
Simon

Ja; auch wiederum =in +=, um es kürzer und verschleierte
anatolyg

5

Ruby, 29 28 Bytes

->n{("%b"%n).reverse.to_i 2}

"% b"% n formatiert die Eingabe n als Binärzeichenfolge, kehrt sie um und konvertiert sie dann zurück in eine Zahl

Verwendung / Testfälle:

m=->n{("%b"%n).reverse.to_i 2}
m[1] #=> 1
m[2] #=> 1
m[3] #=> 3
m[4] #=> 1
m[5] #=> 5
m[6] #=> 3
m[7] #=> 7
m[8] #=> 1
m[9] #=> 9
m[10] #=> 5

@Titus Ich denke du verstehst die Antwort falsch. 2ist die Basis, in die er konvertiert, und nist die Eingabe. ->args{return value}ist die rubinrote Lambda-Syntax
Cyoce

Können Sie die Klammern entfernen .to_i(2)?
Cyoce

@Cyoce sicher genug, danke.
Alexis Andersen


4

Java (OpenJDK) , 63 Byte

a->a.valueOf(new StringBuffer(a.toString(a,2)).reverse()+"",2);

Probieren Sie es online!

Danke an Poke für -12 Bytes und an Cyoce für -8 Bytes!


Obwohl REPL-Einreichungen zulässig sind, folgen sie der Regel, dass keine Eingabe in vordefinierten Variablen (wie ain diesem Kontext) möglich ist
FlipTack

@FlipTack Ups. Es war ursprünglich eine Funktion, bevor ich mich erinnerte, dass die Replik existierte
Pavel

1
Auch in Zukunft verwenden, printanstatt printlnzum Golfen :)
FlipTack

1
StringBufferspeichert ein Byte mehr alsStringBuilder
Poke

1
Könnten Sie +""anstelle von tun .toString()?
Cyoce

3

Perl 6 , 19 Bytes

{:2(.base(2).flip)}

Wo ist der Eingang?
Titus

Dies ist eine Funktion, die einen einzelnen Parameter akzeptiert $_. Es wird nicht namentlich erwähnt, aber die baseMethode wird darauf aufgerufen.
Sean

2
@Titus In Perl 6 ist ein Block eine Art Code, dh ein aufrufbares Objekt. Das obige ist ein Ausdruck, den Sie einer Variablen wie einer Funktion oder Lambda in einer anderen Sprache zuordnen oder direkt aufrufen können - {:2(.base(2).flip)}(10)bei der REPL wird 5 ausgegeben. Damit erfüllt es die Standard-Code-Golf-Kriterien für eine Funktion.
Hobbs

3

Haskell, 36 Bytes

0!b=b
a!b=div a 2!(b+b+mod a 2)
(!0)

Gleicher Algorithmus (und Länge!) Wie die JavaScript- Antwort von ETHproductions .



3

PHP, 33 Bytes

<?=bindec(strrev(decbin($argn)));

In base2 konvertieren, String umkehren, in dezimal konvertieren. In Datei speichern und als Pipe mit ausführen-F .

keine eingebauten:

iterativ 41 Bytes

for(;$n=&$argn;$n>>=1)$r+=$r+$n%2;echo$r;

Während die Eingabe gesetzte Bits hat, platzieren Sie ein Bit von der Eingabe und verschieben Sie es zur Ausgabe. Als Rohr mit laufen lassen-nR .

rekursiv, 52 Bytes

function r($n,$r=0){return$n?r($n>>1,$r*2+$n%2):$r;}

@ JörgHülsermann Die 44 Bytes haben $r+=$r. Aber ich kann mich eigentlich nicht erinnern, warum ich das in den Vordergrund gestellt habe.
Titus




2

Scala, 40 Bytes

i=>BigInt(BigInt(i)toString 2 reverse,2)

Verwendung:

val f:(Int=>Any)=i=>BigInt(BigInt(i)toString 2 reverse,2)
f(10) //returns 5

Erläuterung:

i =>          // create an anonymous function with a parameter i
  BigInt(       //return a BigInt contructed from
    BigInt(i)     //i converted to a BigInt
    toString 2    //converted to a binary string
    reverse       //revered
    ,           
    2             //interpreted as a binary string
  )




1

Batch, 62 Bytes

@set/an=%1/2,r=%2+%1%%2
@if %n% gtr 0 %0 %n% %r%*2
@echo %r%

Erläuterung: %1Enthält im ersten Durchgang den Eingabeparameter, solange dieser %2leer ist. Wir bewerten daher nals die Hälfte von %1und rals +%1Modulo 2 (der %Operator muss verdoppelt werden, um es zu zitieren). Wenn nnicht Null, rufen wir uns als rekursiv übergebenen Schwanz auf nund ein Ausdruck, der beim nächsten Durchgang ausgewertet wird, verdoppelt sich rjedes Mal.


1

C # 98 Bytes

using System.Linq;using b=System.Convert;a=>b.ToInt64(string.Concat(b.ToString(a,2).Reverse()),2);

1

R, 55 Bytes

sum(2^((length(y<-rev(miscFuncs::bin(scan()))):1)-1)*y)

Liest die Eingabe von stdin und verwendet folglich die binFunktion aus dem miscFuncsPaket, um von dezimal in einen binären Vektor zu konvertieren.


1

Aufdringlich , 19 Bytes

Keine eingebaute Basisumwandlung!

$&2%v2/;FL:vK2*;OS#

Probieren Sie es online!

Pushy hat zwei Stapel, und diese Antwort macht ausgiebig davon Gebrauch.

Dieses Programm besteht aus zwei Teilen. Zuerst wird $&2%v2/;F, wandelt die Zahl in ihrer umgekehrten Binärdarstellung:

            \ Implicit: Input is an integer on main stack.
$      ;    \ While i != 0:
 &2%v       \   Put i % 2 on auxiliary stack
     2/     \   i = i // 2 (integer division)
        F   \ Swap stacks (so result is on main stack)

In dem Beispiel 10 würden die Stapel bei jeder Iteration folgendermaßen aussehen:

1: [10]
2: []

1: [5]
2: [0]

1: [2]
2: [0, 1]

1: [1]
2: [0, 1, 0]

1: [0]
2: [0, 1, 0, 1]

Wir können sehen, dass nach der letzten Iteration 0, 1, 0, 1auf dem zweiten Stapel erstellt wurde - die umgekehrten Binärziffern von 10,0b1010 .

Der zweite Teil des Codes L:vK2*;OS#stammt aus meiner vorherigen Antwort, die Binär in Dezimal umwandelt . Mit der in dieser Antwort beschriebenen und erläuterten Methode werden die Binärziffern auf dem Stapel in eine Ganzzahl zur Basis 10 konvertiert und das Ergebnis ausgegeben.


0

k, 18 Bytes

{2/:|X@&|\X:0b\:x}

Beispiel:

k){2/:|X@&|\X:0b\:x}6
3

0

C #, 167 Bytes

 for(int i = 1; i <= 10; i++)
 {
 var bytes= Convert.ToString(i, 2);
 var value= Convert.ToInt32(byteValue.Reverse()); 
 console.WriteLine(value);
}

Erläuterung:

Hier werde ich n Werte iterieren und jedes Mal, wenn ein iterierter ganzzahliger Wert in einen Bytewert konvertiert wird, diesen Bytewert umkehren und diesen Bytewert in einen ganzzahligen Wert konvertieren.


1
Willkommen auf der Seite! Ich weiß nicht viel über C #, aber Sie haben mit Sicherheit eine Menge zusätzlicher Leerzeichen, die ich zum Entfernen empfehlen würde. Es ist auch nicht klar, wie mit E / A in dieser Einreichung umgegangen wird. Es ist Standard, entweder eine Funktion zu schreiben oder zu verwenden STDIN(ich denke das ist console.Read()aber du würdest es wahrscheinlich besser wissen als ich) und STDOUT. Wie auch immer, willkommen auf der Website, wenn Sie erfahrenere Tipps zum Golfspielen wünschen. C # Ich würde codegolf.stackexchange.com/questions/173/…
Wheat Wizard

Ich habe diese Antwort abgelehnt, weil es überhaupt nicht funktioniert. .Reverse()kehrt zurück IEnumerable<char>. Da Convert.ToInt32IEnumerable nicht überlastet ist, wird eine Ausnahme ausgelöst. Auch die Antwort folgt nicht den Regeln für Code-Golf: 1) Da nichts angegeben ist, muss die Einreichung ein vollständiges Programm oder eine Funktion sein, nicht nur ein Ausschnitt. 2)using Anweisungen müssen in der
Byteanzahl

0

c / c ++ 136 Bytes

uint8_t f(uint8_t n){int s=8*sizeof(n)-ceil(log2(n));n=(n&240)>>4|(n&15)<<4;n=(n&204)>>2|(n&51)<<2;n=(n&172)>>1|(n&85)<<1;return(n>>s);}

Es wird nicht gewinnen, aber ich wollte einen anderen Ansatz in c / c ++ 120 Bytes in der Funktion verfolgen

#include <math.h>
#include <stdio.h>
#include <stdint.h>

uint8_t f(uint8_t n){
    int s=8*sizeof(n)-ceil(log2(n));
    n=(n&240)>>4|(n&15)<<4;
    n=(n&204)>>2|(n&51)<<2;
    n=(n&172)>>1|(n&85)<<1;
    return (n>>s);
}

int main(){
    printf("%u\n",f(6));
    return 0;
}

Um zu erläutern, was ich tue, habe ich die Protokollfunktion verwendet, um die Anzahl der von der Eingabe verwendeten Bits zu bestimmen. Dann eine Reihe von drei Bitverschiebungen nach links / rechts, innen / außen, gerade / ungerade, die die gesamte Ganzzahl spiegeln. Zum Schluss noch ein bisschen verschieben, um die Zahl wieder nach rechts zu verschieben. Die Verwendung von Dezimalstellen für Bitverschiebungen anstelle von Hex ist ein Problem, spart jedoch einige Bytes.


Sie müssen die Funktionsdeklaration einschließen, das sind also tatsächlich 163 Bytes . Wenn Sie jedoch das überflüssige Leerzeichen entfernen, können Sie es auf 136 verkürzen.
DJMcMayhem
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.