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.

juniorRubyist
źródło
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
OEIS A030101 .
orlp
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.

FlipTack
źródło
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
17

Python, 29 bajtów

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

Wypróbuj online

mbomb007
źródło
1
Tak bym zrobił. ;)
juniorRubyist
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
ETHprodukcje
źródło
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
};
FlipTack
źródło
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,
9

J, 6 bajtów

|.&.#:

|. rewers

&. pod

#: baza 2

Adám
źródło
8

Galaretka , 3 bajty

BUḄ

Wypróbuj online!

B   # convert to binary
 U  # reverse
  Ḅ # convert to decimal
Riley
źródło
7
To dość krótko, BUB
Cyoce
Hmm ... Czy to naprawdę 3 bajty ?
aioobe,
1
@aioobe Yep. Jelly używa własnej strony kodowej, gdzie każdy z tych znaków ma 1 bajt.
Riley,
Fajne dzięki! <pad>
aioobe,
8

Mathematica, 19 bajtów

#~IntegerReverse~2&
ngenisis
źródło
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.

C Anderson
źródło
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);
}
Karl Napf
źródło
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
Alexis Andersen
źródło
@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!

Pavel
źródło
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)}
Sean
źródło
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.

Lynn
źródło
3

Bash/Unix utilities, 24 23 bytes

dc -e2i`dc -e2o?p|rev`p

Try it online!

Mitchell Spector
źródło
A courageous take on Bash! 😉
juniorRubyist
@juniorRubyist -- Thank you!
Mitchell Spector
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;}
Titus
źródło
@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
Luis Mendo
źródło
2

Pyth, 6 bytes

i_.BQ2

Test suite available here.

Explanation

i_.BQ2
    Q     eval(input())
  .B      convert to binary
 _        reverse
i    2    convert from base 2 to base 10
Mike Bufardeci
źródło
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
  )
corvus_192
źródło
1

Mathematica, 38 bytes

#+##&~Fold~Reverse[#~IntegerDigits~2]&
JungHwan Min
źródło
1

Groovy, 46 bytes

{0.parseInt(0.toBinaryString(it).reverse(),2)}
Magic Octopus Urn
źródło
Does this take any input?
Titus
1
@Titus it refers to the argument given to a block IIRC
Cyoce
I love how this is the same length as my Java answer - Java and groovy, unite!
FlipTack
1
@FlipTack I'm gonna go cry now.
Magic Octopus Urn
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
Luis Mendo
źródło
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.

Neil
źródło
1

C#, 98 bytes

using System.Linq;using b=System.Convert;a=>b.ToInt64(string.Concat(b.ToString(a,2).Reverse()),2);
Horváth Dávid
źródło
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.

Billywob
źródło
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.

FlipTack
źródło
0

k, 18 bytes

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

Example:

k){2/:|X@&|\X:0b\:x}6
3
skeevey
źródło
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.

Deepak
źródło
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.

mreff555
źródło
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