Co to jest liczba bitów w odwrotnej kolejności (binarna)?


33

Otrzymujesz więc POZYTYWNĄ liczbę podstawową 10 (dziesiętną). Twoim zadaniem jest odwrócenie cyfr binarnych i zwrócenie podstawowej liczby 10.

Przykłady:

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)

To wyzwanie dla , więc wygrywa rozwiązanie wykorzystujące najmniej bajtów.

To jest A030101 w OEIS.


2
Czy „odwrócenie bitów” oznacza odwrócenie cyfr binarnych? Czasami może to również oznaczać odwrócenie co jakiś czas .
— ETHproductions

Tak. Przepraszam, że jestem niejasny.
— juniorRubyist

To i to są bardzo podobne.
— Geobits


1
„baza 10” Czy jest jakiś konkretny powód?
— CalculatorFeline

Odpowiedzi:


20

Python , 29 bajtów

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

Wypróbuj online!

Jest to anonimowa, nienazwana funkcja, która zwraca wynik.


Najpierw bin(n)konwertuje argument na ciąg binarny. Zwykle odwrócilibyśmy to za pomocą notacji plastra [::-1]. To odczytuje ciąg z krokiem -1 , tj. Do tyłu. Jednak łańcuchy binarne w Pythonie są poprzedzone znakiem 0b, i dlatego podajemy drugi argument krojenia jako 1 , mówiąc Pythonowi, aby czytał wstecz kończąc się na indeksie 1 , a tym samym nie czytając indeksów 1 i 0 .

Teraz, gdy mamy wsteczny ciąg binarny, przekazujemy go int(...)z drugim argumentem jako 2 . Odczytuje to ciąg jako liczbę całkowitą podstawową 2, która następnie jest zwracana przez wyrażenie lambda implikacji.


2
Pokonał cię o 9 sekund.
— mbomb007


6
@ mbomb007, więc moja odpowiedź jest nieprawidłowa, ponieważ kliknąłeś przycisk wysyłania 9 sekund przed rozdaniem? To, że jednocześnie osiągamy ten sam golf, nie oznacza, że ​​musimy usunąć wszelkie odpowiedzi. Jeśli już, obwiniaj pytanie 0-wysiłkowe.
— FlipTack,

3
Nieważne, ale zdecydowanie bezcelowe. Gdybym był wolniejszy, po prostu usunę mój i opublikuję komentarz na temat szybszego, który wymyśliłem.
— mbomb007

1
@steenbergh Kogo to obchodzi? Ten sam kod, ten sam wynik.
— mbomb007


13

JavaScript (ES6), 30 28 bajtów

Zaoszczędzono 2 bajty dzięki @Arnauld

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

Zasadniczo oblicza to odwrotnie jeden bit na raz: Zaczynamy od q = 0 ; podczas gdy n jest dodatnie, mnożymy q przez 2, odrywamy ostatni bit od n za pomocą n>>1i dodajemy go do q za pomocą |n%2. Gdy n osiągnie wartość 0, liczba została pomyślnie odwrócona i zwracamy q .

Dzięki długim wbudowanym nazwom JS rozwiązanie tego wyzwania w prosty sposób zajmuje 44 bajty:

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

Używając rekurencji i łańcucha, możesz uzyskać rozwiązanie 32-bajtowe, które robi to samo:

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

f=(n,q)=>n?f(n>>1,q*2|n%2):qprawie działa. Ale niestety nie n=0.
— Arnauld

@Arnauld OP jeszcze nie odpowiedział, czy dane wejściowe zawsze będą dodatnie, ale jeśli tak, to nie musi być obsługiwane 0.
— FlipTack,

Jest to późna kontynuacja, ale wiadomo, że dane wejściowe są zawsze pozytywne.
— Arnauld

@Arnauld Thanks!
— ETHproductions

10

Java 8, 53 47 46 45 bajtów

  • -4 bajty dzięki Tytusowi
  • -1 bajt dzięki Kevin Cruijssen

To wyrażenie lambda, które ma tę samą zasadę, co odpowiedź ETH (chociaż w Javie rekurencja byłaby zbyt gadatliwa, więc zamiast tego zapętlamy):

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

Wypróbuj online!

Można to przypisać za pomocą IntFunction<Integer> f = ..., a następnie wywołać za pomocą f.apply(num). Po rozwinięciu, bez golfa i komentowania wygląda to tak:

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
Zaoszczędź 3 bajty t*2zamiast (t<<1), jeszcze jeden, przenosząc te obliczenia z głowy na pętlę. Czy możesz użyć xzamiast x>0warunku?
— Tytus

2
@Titus nie bez wyraźnej obsady typu boolean, ale dzięki za inne wskazówki! Właśnie zrozumiałem, że x>>=1można go zastąpić, x/=2ponieważ automatycznie będzie to dzielenie liczb całkowitych.
— FlipTack,

45 bajtów (zmieniono t=t*2+na t+=t+.)
— Kevin Cruijssen

@KevinCruijssen nice one!
— FlipTack,




7

Labirynt, 23 bajty

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

Cóż, to jest niezręczne ... zwraca odwrotny numer BINARNY ... Dzięki @Martin Ender za wskazanie zarówno mojego błędu, jak i błędu ID 10T. Więc to nie działa, będę musiał znaleźć inne rozwiązanie.


1
Witamy w PPCG i miły pierwszy post! Samo ukończenie wyzwania w języku takim jak Labirynt może być bardzo trudne. W tym miejscu zwykle poprzedzamy pierwszą linię odpowiedzi jednym lub dwoma hashami, aby wyświetlała się jako nagłówek:# Labyrinth, 89 bytes
— ETHproductions

1
Czy przypadkiem pominąłeś wiodące miejsce w drugim rzędzie? W obecnej postaci program odbijałby się w przód i w tył w pierwszym wierszu, ponieważ _znajdują się na skrzyżowaniach.
— Martin Ender

Niestety, właśnie zauważyłem, że nie jest to ważne niezależnie, ponieważ wyzwanie prosi o reprezentację liczby 10 odwróconej liczby, a nie jej reprezentację binarną.
— Martin Ender

6

C, 48 44 43 42 bajtów

-1 bajt dzięki gurka i -1 bajt dzięki anatolyg:

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

Poprzednie rozwiązanie 44 bajtów:

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

Poprzednie rozwiązanie 48 bajtów:

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

Niegolfowane i użytkowanie:

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);
}

Czy nie jest rjuż tutaj inicjowany do zera r;f(n){r=0;, np. Czy nie r=0;jest to konieczne? Również drobna literówka: „Poprzednie rozwiązanie 48 bajtów”
— simon

1
@gurka Funkcja powinna być wielokrotnego użytku.
— Karl Napf

1
Myślę, że forpętle są zawsze co najmniej tak krótkie jak whilepętle, a często krótsze.
— anatolyg

@anatolyg coś takiego: r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}? 1 bajt krótszy, ale nie jestem pewien, czy jest to poprawne C (C99).
— simon

Tak; Również kolej =do +=zrobić to krótsze i bardziej ukrywane
— anatolyg

5

Ruby, 29 28 bajtów

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

„% b”% n formatuje wejście n jako ciąg binarny, odwraca, a następnie konwertuje z powrotem na liczbę

Przypadki użycia / testowe:

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 Myślę, że źle zrozumiałeś odpowiedź. 2jest bazą, na którą konwertuje, i njest wkładem. ->args{return value}jest składnią ruby ​​lambda
— Cyoce

Czy możesz usunąć nawiasy .to_i(2)?
— Cyoce,

@Cyoce na pewno, dzięki.
— Alexis Andersen


4

Java (OpenJDK) , 63 bajty

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

Wypróbuj online!

Dzięki poke za -12 bajtów i Cyoce za -8 bajtów!


Mimo że przesyłanie REPL jest dozwolone, nadal są zgodne z zasadą, że nie można zakładać, że dane wejściowe są w predefiniowanych zmiennych (jak aw tym kontekście)
— FlipTack

@FlipTack Ups. Pierwotnie była to funkcja, zanim przypomniałem sobie, że replika istniała
— Pavel

1
Also, in the future, use print instead of println for golfing :)
— FlipTack

1
StringBuffer saves a byte over StringBuilder
— Poke

1
Could you do +"" instead of .toString()?
— Cyoce

3

Perl 6, 19 bytes

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

Where is the input?
— Titus

This is a function that takes a single parameter $_. It isn't mentioned by name, but the base method is called on it.
— Sean

2
@Titus in Perl 6 a Block is a type of Code, which is to say it's a callable object. The above is an expression that you can take and assign to a variable like a function or lambda in another language, or call directly — {:2(.base(2).flip)}(10) at the REPL will print 5. So it meets the standard code-golf criteria for a function.
— hobbs

3

Haskell, 36 bytes

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

Same algorithm (and length!) as ETHproductions’ JavaScript answer.



3

PHP, 33 bytes

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

convert to base2, reverse string, convert to decimal. Save to file and run as pipe with -F.

no builtins:

iterative, 41 bytes

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

While input has set bits, pop a bit from input and push it to output. Run as pipe with -nR.

recursive, 52 bytes

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

@JörgHülsermann The 44 bytes have $r+=$r. But I actually don´t remember why I put that in front.
— Titus

2

MATL, 4 bytes

BPXB

Try it online!

Explanation

B     % Input a number implicitly. Convert to binary array
P     % Reverse array
XB    % Convert from binary array to number. Display implicitly



2

Scala, 40 bytes

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

Usage:

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

Explanation:

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

CJam, 8 bytes

ri2bW%2b

Try it online!

Explanation

ri          e# Read integer
  2b        e# Convert to binary array
    W%      e# Reverse array
      2b    e# Convert from binary array to number. Implicitly display

1

Batch, 62 bytes

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

Explanation: On the first pass, %1 contains the input parameter while %2 is empty. We therefore evaluate n as half of %1 and r as +%1 modulo 2 (the % operator has to be doubled to quote it). If n is not zero, we then call ourselves tail recursively passing in n and an expression that gets evaluated on the next pass effectively doubling r each time.


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)

Reads input from stdin and consequently uses the bin function from the miscFuncs package to convert from decimal to a binary vector.


1

Pushy, 19 bytes

No builtin base conversion!

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

Try it online!

Pushy has two stacks, and this answer makes use of this extensively.

There are two parts two this program. First, $&2%v2/;F, converts the number to its reverse binary representation:

            \ 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)

Given the example 10, the stacks would appear as following on each iteration:

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]

We can see that after the final iteration, 0, 1, 0, 1 has been created on the second stack - the reverse binary digits of 10, 0b1010.

The second part of the code, L:vK2*;OS#, is taken from my previous answer which converts binary to decimal. Using the method decsribed and explained in that answer, it converts the binary digits on the stack into a base 10 integer, and prints the result.



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);
}

Explanation:

Here I will iterate n values and each time iterated integer value is convert to byte value then reverse that byte value and that byte value is converted to integer value.


1
Welcome to the site! I don't know much about C# but you most certainly have a good deal of extra whitespace I would recommend removing. It also is not clear how I/O is dealt with in this submission. It is standard to either write a function or to use STDIN (I think that is console.Read() but you would probably know better than I would) and STDOUT. Anyway, welcome to the site if you want more experienced advice in golfing C# I would recommend codegolf.stackexchange.com/questions/173/…
— Wheat Wizard

I've downvoted this answer, because it doesn't work at all. .Reverse() returnes IEnumerable<char>. As Convert.ToInt32 doesn't have an overload for IEnumerable it throws an exception. Also the answer doesn't follow the rules for code golf: 1)As nothing is specified the submission has to be a full program or function not just a snippet. 2)using statements must be included in the byte count
— raznagul

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);}

It's not going to win, but I wanted to take a different approach in c/c++ 120 bytes in the function

#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;
}

To elaborate on what I am doing, I used the log function to determine the number of bits utilized by the input. Than a series of three bit shifts left/right, inside/outside, even/odd which flips the entire integer. Finally a bit shift to shift the number back to the right. Using decimals for bit shifts instead of hex is a pain but it saved a few bytes.


You do need to include the function declaration, so this is actually 163 bytes. Although, if you remove the extraneous whitespace, you could shorten it to 136.
— DJMcMayhem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.