Un entero positivo se puede diluir insertando 0
entre dos bits en su expansión binaria. Esto significa que un n
número de bits tiene n-1
diluciones, que no necesariamente son todas distintas.
Por ejemplo, para 12
(o 1100
en binario), las diluciones son
11000 = 24
^
11000 = 24
^
10100 = 20
^
En este desafío, vamos a tomar la suma de todas las diluciones, excluyendo el número original. Para 12
, teniendo en cuenta la suma de 24, 24, 20
resultados 68
, también 68
debería ser la salida para 12
.
Reto
Dado un entero positivo n > 1
como entrada, salida / retorno de la suma diluida como se explicó anteriormente.
Ejemplos
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Reglas
- Se puede suponer que la entrada y la salida encajan en el tipo de entero nativo de su idioma.
- La entrada y la salida se pueden dar en cualquier formato conveniente .
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
code-golf
arithmetic
number-theory
binary
AdmBorkBork
fuente
fuente
Respuestas:
Python 2 ,
4339 bytesPruébalo en línea!
¿Cómo?
Cada llamada de la función recursiva calcula una única dilución. La posición del insertado
0
eslog2(i)
. La función se repite hasta que sei
hace más granden
y la inserción estaría a la izquierda del número. Sii>n
, sen/i
evalúa como0
, que es un valor falso en Python.n*2
desplaza el dígito binario número uno completo a la izquierda,n%i
on % 2**(position of insertion)
calcula el valor de la parte que no debe desplazarse a la izquierda. Este valor se resta del número desplazado.Ejemplo (n = 7)
fuente
Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
MATL , 13 bytes
¡Pruébalo en MATL Online! O verificar todos los casos de prueba .
Explicación
Considere la entrada
12
como un ejemplo.fuente
C,
5856 bytes¡Gracias a @Dennis por guardar dos bytes!
Pruébalo en línea!
C (gcc) , 50 bytes
Volver por
k=s;
es un comportamiento indefinido, pero funciona con gcc cuando las optimizaciones están deshabilitadas. Además,n%k+n/k*(k+=k)
tiene un comportamiento no especificado , pero parece funcionar bien con gcc.Pruébalo en línea!
fuente
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 bytes)n%k
o cuáln/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
está completamente bien, yn%k
siempre se evaluará antesn/k*(k*=2)
yn/k
también se evaluará antesk*=2
. Gracias por la explicación. (Eliminaré algunos de mis comentarios ahora para reducir el desorden).Jalea ,
98 bytesPruébalo en línea!
Viceversa
B¹ƤṖ+BḄS
: obtener prefijos, soltar al final, agregarlos a la entrada y sumar.fuente
J ,
20 1514 bytesPruébalo en línea.
15 bytes
Pruébalo en línea!
fuente
Japt ,
1211 bytesIntentalo
Explicación
fuente
JavaScript (ES6),
4140 bytesGuardado 1 byte gracias a Mr.Xcoder
Casos de prueba
Mostrar fragmento de código
fuente
Retina ,
535047 bytesPruébalo en línea! El enlace incluye casos de prueba. Editar: Guardado 3 bytes gracias a @MartinEnder. Explicación:
Convierta de decimal a binario, pero use O para representar 0, ya que no es un dígito, y _ para representar 1, ya que es el carácter de repetición predeterminado en Retina 1.
Inserte una O entre cada par de dígitos y recopile los resultados como una lista.
Convierte de binario a unario. (Esta conversión produce
O
s adicionales , pero no nos importa).Suma y convierte a decimal.
fuente
%
. Si es más complicado, necesitarías algo así/[O_]+/_
.Pyth , 13 bytes
Pruébalo aquí!
Explicación
fuente
Jalea , 10 bytes
Pruébalo en línea!
No es el más corto actualmente, pero podría serlo si hay una forma de evitarlo
Bµ µḄ
...Explicación
Básicamente, esto funciona multiplicando cada dígito binario por un número mágico. No puedo explicarlo sin visualizarlo, así que aquí está el número binario con el que trabajaremos:
Como se explica en el desafío, el resultado que queremos es la suma de estos números binarios:
Sin embargo, en realidad no tenemos que insertar ceros: el átomo "no binario" de Jelly aceptará otros números además de
0
y1
. Cuando nos permitimos usar2
, este patrón se vuelve más simple:Cuando sumamos los dígitos en cada columna, obtenemos
El truco que usa esta respuesta es generar este patrón y multiplicar cada dígito por el dígito correspondiente en el original para cancelar las columnas necesarias. 12, por ejemplo, se representaría como
fuente
Java 8, 55 bytes
Puerto de respuesta Steadybox 'C , y golfed 3 bytes en el proceso.
Pruébalo en línea.
fuente
Casco ,
1312 bytes-1 byte gracias a @Mr. Xcoder!
Pruébalo en línea!
Explicación
fuente
05AB1E , 14 bytes
Pruébalo en línea!
fuente
Pip ,
2118 bytesPruébalo en línea!
Explicación
Llame a nuestro número de entrada
a
. Para cada índice binarioi
en el que queremos insertar un cero, podemos calcular los bits a la izquierda del punto de inserción comoa // 2**i
(donde//
es la división de enteros y la**
exponenciación), los bits a la derecha del punto de inserción comoa % 2**i
y, por lo tanto, el entero diluido como2 * (a // 2**i) * 2**i + (a % 2**i)
. Pero(a // 2**i) * 2**i
es igual aa - (a % 2**i)
, por lo que podemos reorganizar a una fórmula más corta:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.fuente
R ,
14148 bytesPruébalo en línea!
O estoy haciendo algo realmente mal o R es simplemente terrible en la manipulación de bits.Portabilidad el enfoque de Luis Mendo es fácil, correcto y golfoso.Pero si realmente solo quieres perder el tiempo con operaciones de bits, MickyT sugirió el siguiente byte de 105:
Pruébalo en línea!
fuente
Python 3,
928078 bytesPruébalo en línea
Gracias a Mr.XCoder y ovs por -12 bytes y -2 bytes respectivamente.
fuente
Lote,
9277 bytesEditar: cambió a la misma fórmula que todos los demás están usando.
fuente
Jalea , 14 bytes
Pruébalo en línea!
fuente
Perl 5 , 36 + 1 (
-p
) = 37 bytesPruébalo en línea!
fuente
Adjunto , 57 bytes
Pruébalo en línea!
Pensé que abordaría el problema desde un enfoque de manipulación sin bits, ya que dicho enfoque no es práctico en Attache. Tengo que investigar algunas de las partes de este enfoque para buscar alternativas.
Explicación
Aquí hay una versión ampliada:
Esto simplemente toma la representación binaria del número, lo divide en ciertos puntos, inserta ceros allí, los convierte a decimales y los suma.
fuente
J , 33 bytes
Lo más probable es que haya mucho espacio para más golf.
¿Cómo?
@#:
convertir a binario y<@}.\.
- encuentra todos los suficientes, suelta el primer dígito de cada cuadro<\
- encuentra todos los prefijos y los encajona(,0;])"0
- a cada prefijo agregue 0 y luego agregue el sufijo decapitado correspondiente;@
raze (sin caja)1#.[:}:#.@
- convertir a decimal, acortar y sumarPruébalo en línea!
fuente