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 ≥ 0
tales como . Su salida es la "versión invertida" de , el entero positivo .n == 2a * (2*b + 1)
n
2b * (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 N
está 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
Q
para1+
(esto se ha introducido recientemente) yq
para1-
. Eso también ahorra un espacio (que podría ahorrar deH
todos modos). Ver aquíPython 2, 39 bytes
n & -n
da la mayor potencia de 2 que dividen
. Funciona porque en la aritmética de complemento a dos,-n == ~n + 1
. Sin
tiene 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-n
termina con un 1 seguido de k 0 (igual quen
), mientras que tiene el bit opueston
en todos los lugares más altos.fuente
n&-n
funciona? veo lo que hace este truco pero no cómo :(n&-n
devuelve 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
a
como 1 + el exponente de 2 en la factorización prima den
. Dado quefactor
devuelve unaDict
, se pueden usarget
con un valor por defecto de 0 en caso de que la descomposición en factores primos no contiene 2. desplazamiento de bits a la derechan
pora
, y tomar de 2 a este poder. Multiplicamos eso por2a-1
para obtener el resultado.fuente
Perl 5, 40 bytes
38 bytes más 2 para
-p
-p
lee el STDIN en la variable$_
.$i++,$_/=2until$_%2
incrementos$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$i
es 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
-p
grabados$_
.fuente
C, 49 bytes
fuente
JavaScript ES6,
3633 bytesTengo entendido que
Math.clz32
va a ser más corto que jugar contoString(2).length
.Editar: Guardado 3 bytes gracias a @ user81655.
fuente
n&-n
una variable:n=>63-2*Math.clz32(x=n&-n)<<n/x/2
n&=-n
, pero necesiton
otra 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\2
lugar de(n>>k)\2
. La versión no golfista seríak
léxica conmy
:fuente