¿Cuál es el número de bit inverso (binario)?

33

Entonces se le da un número POSITIVO de base 10 (decimal). Su trabajo es revertir los dígitos binarios y devolver ese número de base 10.

Ejemplos:

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)

Este es un desafío de , por lo que gana la solución que utiliza menos bytes.

Este es A030101 en el OEIS.

juniorrubista
fuente
2
¿"Revertir los bits" significa revertir sus dígitos binarios? A veces también puede significar invertir cada bit .
ETHproductions
Sí. Perdón por no estar claro.
juniorRubyist
Esto y esto son muuuy similares.
Geobits
OEIS A030101 .
orlp
1
"base 10" ¿Alguna razón en particular por qué?
CalculatorFeline

Respuestas:

20

Python , 29 bytes

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

Pruébalo en línea!

Esta es una función anónima, sin nombre, que devuelve el resultado.


Primero, bin(n)convierte el argumento en una cadena binaria. Normalmente lo revertiríamos con la notación de corte [::-1]. Esto lee la cadena con un paso de -1 , es decir, hacia atrás. Sin embargo, las cadenas binarias en Python tienen el prefijo an 0by, por lo tanto, damos el segundo argumento de la división como 1 , diciéndole a Python que lea hacia atrás y termine en el índice 1 , por lo tanto, no lee los índices 1 y 0 .

Ahora que tenemos la cadena binaria hacia atrás, la pasamos int(...)con el segundo argumento como 2 . Esto lee la cadena como un entero de base 2, que luego es implícitamente devuelto por la expresión lambda.

FlipTack
fuente
2
Te ganó por 9 segundos.
mbomb007
66
@ mbomb007, ¿mi respuesta no es válida porque hizo clic en el botón de publicación 9 segundos antes? El hecho de que alcancemos el mismo golf al mismo tiempo no significa que tengamos que eliminar ninguna respuesta. En todo caso, culpe a la pregunta de esfuerzo cero.
FlipTack
3
No es inválido, pero definitivamente no tiene sentido. Si hubiera sido más lento, simplemente eliminaría el mío y publicaría un comentario sobre el más rápido que se me ocurrió.
mbomb007
1
@steenbergh ¿A quién le importa? Mismo código, mismo puntaje.
mbomb007
17

Python, 29 bytes

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

Pruébalo en línea

mbomb007
fuente
1
Esto es lo que hubiera hecho. ;)
juniorRubyist
13

JavaScript (ES6), 30 28 bytes

Guardado 2 bytes gracias a @Arnauld

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

Básicamente, esto calcula el reverso un bit a la vez: comenzamos con q = 0 ; mientras n es positivo, multiplicamos q por 2, separamos el último bit de n con n>>1y lo sumamos a q con |n%2. Cuando n llega a 0, el número se ha invertido con éxito y devolvemos q .

Gracias a los largos nombres integrados de JS, resolver este desafío de la manera más fácil requiere 44 bytes:

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

Usando recursividad y una cadena, puede obtener una solución de 32 bytes que hace lo mismo:

f=(n,q='0b')=>n?f(n>>1,q+n%2):+q
ETHproducciones
fuente
f=(n,q)=>n?f(n>>1,q*2|n%2):qCasi funciona. Pero lamentablemente no es para n=0.
Arnauld
@Arnauld OP aún no ha respondido si la entrada siempre será positiva, pero si es así, entonces 0 no tiene que ser manejado.
FlipTack
Este es un seguimiento tardío, pero ahora se sabe que la entrada siempre es positiva.
Arnauld
@Arnauld ¡Gracias!
ETHproductions
10

Java 8, 53 47 46 45 bytes

  • -4 bytes gracias a Titus
  • -1 byte gracias a Kevin Cruijssen

Esta es una expresión lambda que tiene el mismo principio que la respuesta de ETH (aunque la recursión habría sido demasiado detallada en Java, por lo que hacemos un bucle):

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

Pruébalo en línea!

Esto se puede asignar con IntFunction<Integer> f = ..., y luego llamar con f.apply(num). Ampliado, sin golf y comentado, se ve así:

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
fuente
1
Ahorre 3 bytes con en t*2lugar de (t<<1), uno más al mover ese cálculo de la cabeza del bucle al cuerpo del bucle. ¿Se puede usar en xlugar de x>0para la condición?
Titus
2
@Titus no sin un elenco explícito a un booleano, ¡pero gracias por los otros consejos! También acabo de darme cuenta de que x>>=1se puede reemplazar, x/=2ya que automáticamente será una división entera.
FlipTack
45 bytes (cambiado t=t*2+a t+=t+.)
Kevin Cruijssen
@KevinCruijssen agradable!
FlipTack
9

J, 6 bytes

|.&.#:

|. marcha atrás

&. debajo

#: base 2

Adán
fuente
8

Jalea , 3 bytes

BUḄ

Pruébalo en línea!

B   # convert to binary
 U  # reverse
  Ḅ # convert to decimal
Riley
fuente
77
Eso es bastante corto, BUB
Cyoce
Hmm ... ¿Eso es realmente 3 bytes ?
aioobe
1
@aioobe Sí. Jelly usa su propia página de códigos donde cada uno de estos caracteres es de 1 byte.
Riley
¡Genial, gracias! <pad>
aioobe
8

Mathematica, 19 bytes

#~IntegerReverse~2&
ngenisis
fuente
7

Laberinto, 23 bytes

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

Bueno, esto es incómodo ... esto devuelve el número BINARIO inverso ... Gracias @Martin Ender por señalar mi error y mi error ID 10T. Entonces esto no funciona, tendré que encontrar otra solución.

C Anderson
fuente
1
¡Bienvenido a PPCG, y buena primera publicación! Simplemente completar un desafío en un idioma como Labyrinth puede ser muy difícil. Por aquí, generalmente prefijamos la primera línea de una respuesta con uno o dos hashes, para que se muestre como encabezado:# Labyrinth, 89 bytes
ETHproductions
1
¿Omitió accidentalmente un espacio inicial de la segunda fila? Tal como está, el programa simplemente rebotaría de un lado a otro en la primera línea porque _están en los cruces.
Martin Ender
Desafortunadamente, acabo de notar que esto no es válido independientemente, porque el desafío pide la representación en base 10 del número invertido, no su representación binaria.
Martin Ender
6

C, 48 44 43 42 bytes

-1 byte gracias a gurka y -1 byte gracias a anatolyg:

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

Solución anterior de 44 bytes:

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

Solución anterior de 48 bytes:

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

Sin golf y uso:

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
fuente
¿No restá inicializado a cero aquí r;f(n){r=0;, por ejemplo, r=0;es innecesario? También error tipográfico menor: " Solución anterior de 48 bytes"
simon
1
@gurka La función debe ser reutilizable.
Karl Napf
1
Creo que los forbucles siempre son al menos tan cortos como los whilebucles y, a menudo, más cortos.
anatolyg
@anatolyg algo como r;f(n){for(r=n&1;n/=2;r=2*r+n%2);return r;}:? 1 byte más corto, pero no estoy seguro si es válido C (C99).
Simon
Sí; También, a su vez, =en +=para que sea más corto y más ofuscado
anatolyg
5

Ruby, 29 28 bytes

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

"% b"% n formatea la entrada n como una cadena binaria, invierte, luego vuelve a convertir a un número

Uso / casos de prueba:

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
fuente
@Titus Creo que no entiendes la respuesta. 2es la base a la que se está convirtiendo, y nes la entrada. ->args{return value}es la sintaxis de ruby ​​lambda
Cyoce
¿Puedes quitar los paréntesis .to_i(2)?
Cyoce
@Cyoce efectivamente, gracias.
Alexis Andersen
4

Java (OpenJDK) , 63 bytes

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

Pruébalo en línea!

¡Gracias a poke por -12 bytes y a Cyoce por -8 bytes!

Pavel
fuente
Aunque las presentaciones REPL están permitidas, siguen la regla de que no se puede asumir que la entrada está en variables predefinidas (como aen este contexto)
FlipTack
@FlipTack Vaya. Originalmente era una función antes de recordar que existía la respuesta
Pavel el
1
Además, en el futuro, printprintln
úselo en
1
StringBufferahorra más de un byteStringBuilder
empuje
1
¿Podrías hacer en +""lugar de .toString()?
Cyoce
3

Perl 6 , 19 bytes

{:2(.base(2).flip)}
Sean
fuente
¿Dónde está la entrada?
Titus
Esta es una función que toma un solo parámetro $_. No se menciona por su nombre, pero basese llama al método.
Sean
2
@Titus en Perl 6 a Block es un tipo de Código, es decir, es un objeto invocable. Lo anterior es una expresión que puede tomar y asignar a una variable como una función o lambda en otro idioma, o llamar directamente; {:2(.base(2).flip)}(10)en REPL se imprimirá 5. Por lo tanto, cumple con los criterios estándar de código de golf para una función.
hobbs
3

Haskell, 36 bytes

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

Mismo algoritmo (¡y longitud!) Que la respuesta de JavaScript de ETHproductions .

Lynn
fuente
3

Utilidades Bash / Unix, 24 23 bytes

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

Pruébalo en línea!

Mitchell Spector
fuente
¡Una versión valiente de Bash! 😉
juniorRubyist
@juniorRubyist - ¡Gracias!
Mitchell Spector
3

PHP, 33 bytes

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

convertir a base2, invertir cadena, convertir a decimal. Guardar en archivo y ejecutar como tubería con -F.

sin construcciones:

iterativo, 41 bytes

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

Mientras que la entrada ha establecido bits, saque un bit de la entrada y empújelo a la salida. Ejecutar como tubería con -nR.

recursivo, 52 bytes

function r($n,$r=0){return$n?r($n>>1,$r*2+$n%2):$r;}
Titus
fuente
@ JörgHülsermann Los 44 bytes tienen $r+=$r. Pero en realidad no recuerdo por qué puse eso delante.
Tito
2

MATL , 4 bytes

BPXB

Pruébalo en línea!

Explicación

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

Scala, 40 bytes

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

Uso:

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

Explicación:

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
fuente
1

Mathematica, 38 bytes

#+##&~Fold~Reverse[#~IntegerDigits~2]&
JungHwan Min
fuente
1

Groovy, 46 bytes

{0.parseInt(0.toBinaryString(it).reverse(),2)}
Urna de pulpo mágico
fuente
¿Esto toma alguna entrada?
Titus
1
@Titus se itrefiere al argumento dado a un bloque IIRC
Cyoce
Me encanta cómo esta es la misma longitud que mi respuesta de Java: Java y maravilloso, ¡únanse!
FlipTack
1
@FlipTack Voy a llorar ahora.
Urna de pulpo mágico
1

CJam , 8 bytes

ri2bW%2b

Pruébalo en línea!

Explicación

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
fuente
1

Lote, 62 bytes

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

Explicación: en la primera pasada, %1contiene el parámetro de entrada mientras %2está vacío. Por lo tanto, evaluamos ncomo la mitad de %1y rcomo +%1módulo 2 (el %operador debe duplicarse para citarlo). Si nno es cero, entonces nos llamamos cola recursivamente pasando ny una expresión que se evalúa en la próxima pasada efectivamente duplicando rcada vez.

Neil
fuente
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
fuente
1

R, 55 bytes

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

Lee la entrada de stdin y, en consecuencia, utiliza la binfunción del miscFuncspaquete para convertir de decimal a un vector binario.

Billywob
fuente
1

Pushy , 19 bytes

¡Sin conversión de base integrada!

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

Pruébalo en línea!

Pushy tiene dos pilas, y esta respuesta hace uso de esto ampliamente.

Hay dos partes dos en este programa. Primero, $&2%v2/;Fconvierte el número a su representación binaria inversa:

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

Dado el ejemplo 10, las pilas aparecerían de la siguiente manera en cada iteración:

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]

Podemos ver que después de la iteración final, 0, 1, 0, 1se ha creado en la segunda pila - los dígitos binarios inversas de 10, 0b1010.

La segunda parte del código, L:vK2*;OS#se toma de mi respuesta anterior que convierte binario a decimal . Usando el método descifrado y explicado en esa respuesta, convierte los dígitos binarios en la pila en un entero de base 10 e imprime el resultado.

FlipTack
fuente
0

k, 18 bytes

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

Ejemplo:

k){2/:|X@&|\X:0b\:x}6
3
skeevey
fuente
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);
}

Explicación:

Aquí iteraré n valores y cada vez que el valor entero iterado se convierta en valor de byte, luego revertiré ese valor de byte y ese valor de byte se convertirá en valor entero.

Deepak
fuente
1
Bienvenido al sitio! No sé mucho acerca de C #, pero ciertamente tiene una gran cantidad de espacio en blanco adicional que recomendaría eliminar. Tampoco está claro cómo se trata la E / S en esta presentación. Es estándar escribir una función o usarla STDIN(creo que es así, console.Read()pero probablemente lo sabrías mejor que yo) y STDOUT. De todos modos, bienvenido al sitio si desea consejos más experimentados en golf C #. Recomendaría codegolf.stackexchange.com/questions/173/…
Wheat Wizard
He rechazado esta respuesta porque no funciona en absoluto. .Reverse()returnes IEnumerable<char>. Como Convert.ToInt32no tiene una sobrecarga para IEnumerable, arroja una excepción. Además, la respuesta no sigue las reglas para el código de golf: 1) Como no se especifica nada, el envío debe ser un programa completo o una función, no solo un fragmento. 2) las usingdeclaraciones deben incluirse en el recuento de bytes
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);}

No va a ganar, pero quería adoptar un enfoque diferente en c / c ++ 120 bytes en la función

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

Para explicar lo que estoy haciendo, utilicé la función de registro para determinar el número de bits utilizados por la entrada. Que una serie de cambios de tres bits hacia la izquierda / derecha, dentro / fuera, par / impar que voltea todo el entero. Finalmente, un poco de desplazamiento para cambiar el número de nuevo a la derecha. El uso de decimales para cambios de bits en lugar de hexadecimal es una molestia, pero ahorró algunos bytes.

mreff555
fuente
Debe incluir la declaración de la función, por lo que en realidad son 163 bytes . Sin embargo, si elimina el espacio en blanco extraño, podría acortarlo a 136.
DJMcMayhem