Este desafío es simple, dado un número decimal, convertir a binario y calcular la suma de las subcadenas del número binario, cuya longitud es más corta que el número original. Aquí hay un ejemplo:
Input:
11
Binary:
11 -> 1011
Substrings:
101 = 5
011 = 3
10 = 2
01 = 1
11 = 3
1 = 1
0 = 0
1 = 1
1 = 1
Sum:
5+3+2+1+3+1+0+1+1=17
Output:
17
Su programa debe tomar un solo entero decimal como entrada y salida de la suma de las subcadenas binarias, como se ve arriba. Puede suponer que la entrada siempre tendrá más de dos dígitos en su representación binaria y que en la entrada no causará ningún error durante la ejecución de su programa.
Este es el código de golf , ¡el código más corto en bytes gana!
Casos de prueba:
2 => 1
3 => 2
4 => 3
5 => 5
6 => 7
7 => 9
8 => 7
9 => 10
10 => 14
11 => 17
code-golf
base-conversion
binary
subsequence
GamrCorps
fuente
fuente
Respuestas:
Jalea,
107 bytesPruébalo en línea!
Cómo funciona
fuente
Pyth, 10
Pruébelo en línea o ejecute Test Suite
Explicación:
fuente
CJam,
2721 bytes¡Gracias a Dennis por ayudarme a ahorrar 6 bytes!
Funciona solo con la versión más nueva de CJam (disponible en TIO). Pruébalo en línea !
Versión antigua:
Pruébalo en línea .
fuente
Python 3, 111 caracteres
EDITAR : Explicación:
Convierta la cadena de entrada en un int, luego el int en una cadena binaria y elimine sus dos primeros caracteres, ya que el
bin
método devuelve una cadena en el formato de0b...
Tome todas las subcadenas de la cadena binaria, conviértalas a decimales usando
int(n, 2)
y sumelas.es una lista de todas las subcadenas. Versión sin golf:
Espero que esto ayude.
fuente
CJam (22 bytes)
Este es un byte más largo que la mejor respuesta actual de CJam, pero el enfoque probablemente se pueda adaptar a otros idiomas de manera bastante rentable.
Demostración en línea
Análisis
Supongamos que la pregunta fuera
sin el bit
Entonces no es demasiado difícil demostrar que el bit más significativo ocurre con el peso total,
1*(2^B-1)
dondeB
está el número de bits; el segundo bit más significativo ocurre con el peso total2*(2^(B-1)-1)
; hasta el bit más significativo de Bth, que ocurre con el peso totalB*(2^1-1)
.Teniendo en cuenta ahora la resta del número original
x
, terminamos con la sumaDisección
La conversión a la base 2 da la primera parte de la suma principal más
x
; a base 1 da la segunda parte másx
; y a base 0 da justox
, así que restando la base-1 de la base-2 sex
cancela s, y restando la base-0 da el resultado deseado.fuente
JavaScript (ES6), 78 bytes
El exterior
map
acumula subcadenas principales den
la representación binaria de '; el interno extrae las subcadenas finales de las subcadenas iniciales, cubriendo así todas las subcadenas posibles, incluida la representación binaria original.Cada subcadena se convierte de binario a decimal y se resta de la entrada original, ya que esto es un poco más corto que sumarlas y restar la entrada original.
fuente
Mathematica,
7370 bytesFunción. Entero-> Entero
fuente
Retina , 64
Pruébalo en línea!
Una descripción de etapa por etapa de alto nivel: convertir decimal a unario, unario a binario, obtener prefijos, obtener sufijos de prefijos, volcar el número original, convertir binario a unario, conteo devuelto. Escribiré una descripción más detallada una vez que termine de jugar al golf, muchas de estas etapas parecen sospechosas ...
fuente
C, 71 bytes
Mantenemos un acumulador
a
y una máscaram
. La máscara comienza en 1 y se alarga un poco cada vez alrededor del bucle externo. En el bucle interno, una copiai
de la entrada se desplaza sucesivamente hacia la derecha hasta que sea más corta que la máscara, acumulando el valor enmascarado cada vez.Programa de prueba
Prueba de salida
fuente
C #, 148 bytes
O, si agrego Importar "usando System.Math estático"; entonces 138 con
Los lenguajes OOP como C # no ganarán tal carrera, pero quería probarlo de todos modos. Aquí hay una versión más embellecida + probador.
El Do-while anidado agrega el valor desplazado a la derecha de iTemp (después de asignarlo) siempre que shift + 1 sea menor que pos. La siguiente línea calcula el siguiente valor desplazado de iPrev
x1 y x2 calculan la máscara, x3 la aplica y luego la desplaza hacia la izquierda, ya que el último dígito siempre se descarta. Para 11, se ve así:
fuente
PowerShell v2 +, 138 bytes
Ooof Esa conversión a / desde binario es costosa.
Toma entrada
$a
, luego usa la llamada .NET[convert]::ToString($a,2)
para convertirla en la representación binaria. A partir de ahí, pasamos por dos bucles: el primero cuenta hacia atrás desde el final de la cadena hacia abajo1
y el segundo cuenta hacia arriba desde0
. (El primero es cuánto tiempo debe extraerse una subcadena, y el segundo es el índice de dónde en la cadena comenzar la subcadena). Establecemos un ayudante$l
en el camino para pasarlo al bucle interno.Dentro del bucle interno, usamos otra llamada .NET
[convert]::ToInt32()
para convertir la.substring()
base apropiada2
en un entero. Cada uno de ellos se deja en la tubería. Encapsulamos todo eso con parens()
y-join
ellos junto con a+
, luego lo arrojamos aiex
(short forInvoke-Expression
y similar-ish toeval
).Creo que esto técnicamente requiere v2 o más reciente para llamar correctamente a las llamadas .NET.
fuente