Antecedentes
Es bien sabido en matemáticas que los enteros se pueden poner en una correspondencia uno a uno con pares de enteros. Hay muchas formas posibles de hacer esto, y en este desafío, implementará una de ellas y su operación inversa.
La tarea
Su entrada es un número entero positivo n > 0. Se sabe que existen enteros únicos no negativos, a, b ≥ 0tales como . Su salida es la "versión invertida" de , el entero positivo .n == 2a * (2*b + 1)n2b * (2*a + 1)
Puede suponer que la entrada y la salida se ajustan al tipo de datos entero sin signo estándar de su idioma.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos se dan en el formato in <-> out, ya que la función que se implementará es su propio inverso: si le devuelve la salida, debe obtener la entrada original.
1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma. Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (p. Ej., Porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de los intérpretes por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
fuente

Respuestas:
Jalea ,
171615 bytesPruébalo en línea!
Cómo funciona
fuente
Pyth,
1615 bytes1 byte gracias a Dennis
Banco de pruebas
Explicación:
fuente
MATL , 22 bytes
Pruébalo en línea!
Explicación
fuente
Qpara1+(esto se ha introducido recientemente) yqpara1-. Eso también ahorra un espacio (que podría ahorrar deHtodos modos). Ver aquíPython 2, 39 bytes
n & -nda la mayor potencia de 2 que dividen. Funciona porque en la aritmética de complemento a dos,-n == ~n + 1. Sintiene k ceros al final, tomar su complemento hará que tenga k al final. Luego, agregar 1 cambiará todos los finales a ceros, y cambiará el bit 2 ^ k de 0 a 1. Entonces-ntermina con un 1 seguido de k 0 (igual quen), mientras que tiene el bit opuestonen todos los lugares más altos.fuente
n&-nfunciona? veo lo que hace este truco pero no cómo :(n&-ndevuelve la potencia más alta de 2 que dividen.n & -n.n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100, pero hay dos caracteres detrás de la mejor solución.n.MATL , 25
26bytesEsto usa la versión actual (10.2.1) del lenguaje / compilador.
Pruébalo en línea!
Explicación
Bastante sencillo, basado en la fuerza bruta. Intenta todas las combinaciones de a y b , selecciona la adecuada y realiza el cálculo requerido.
fuente
Julia, 41 bytes
Esta es una función anónima que acepta un entero y devuelve un entero. Para llamarlo, asígnelo a una variable.
Definimos
acomo 1 + el exponente de 2 en la factorización prima den. Dado quefactordevuelve unaDict, se pueden usargetcon un valor por defecto de 0 en caso de que la descomposición en factores primos no contiene 2. desplazamiento de bits a la derechanpora, y tomar de 2 a este poder. Multiplicamos eso por2a-1para obtener el resultado.fuente
Perl 5, 40 bytes
38 bytes más 2 para
-p-plee el STDIN en la variable$_.$i++,$_/=2until$_%2incrementos$i(que comienzan en 0) y se reducen a la mitad$_hasta$_que no sea cero mod 2. Después de eso,$_es el factor impar del número original y$ies el exponente de 2.$_=2*$i+1<<$_/2-.5- El lado derecho de la=es solo la fórmula para el número buscado: {1 más del doble del exponente de 2} veces {2 a la potencia de {la mitad del factor impar menos la mitad}}. Pero "times {2 to the power of ...}" se juega como "un poco desplazado hacia la izquierda por ...". Y ese lado derecho está asignado a$_.Y
-pgrabados$_.fuente
C, 49 bytes
fuente
JavaScript ES6,
3633 bytesTengo entendido que
Math.clz32va a ser más corto que jugar contoString(2).length.Editar: Guardado 3 bytes gracias a @ user81655.
fuente
n&-nuna variable:n=>63-2*Math.clz32(x=n&-n)<<n/x/2n&=-n, pero necesitonotra vez ...PARI / GP , 38 bytes
Tenga en cuenta que
>>y\tienen la misma precedencia y se calculan de izquierda a derecha, por lo que la última parte puede ser enn>>k\2lugar de(n>>k)\2. La versión no golfista seríakléxica conmy:fuente