Esse desafio é simples, dado um número decimal, converta em binário e calcule a soma das sub-strings do número binário, cujo comprimento é menor que o número original. Aqui está um exemplo:
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
Seu programa deve usar um único número inteiro decimal como entrada e gerar a soma das sub-strings binárias, como visto acima. Você pode assumir que a entrada sempre terá mais de dois dígitos em sua representação binária e que a entrada não causará erros durante a execução do seu programa.
Este é o código-golfe , o código mais curto em bytes vence!
Casos de teste:
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
fonte
fonte
Respostas:
Geléia,
107 bytesExperimente online!
Como funciona
fonte
Pitão, 10
Experimente online ou execute o Test Suite
Explicação:
fonte
CJam,
2721 bytesGrite ao Dennis por me ajudar a economizar 6 bytes!
Funciona apenas com a versão mais recente do CJam (disponível no TIO). Experimente online !
Versão antiga:
Experimente online .
fonte
Python 3, 111 caracteres
EDIT : Explicação:
Converta a string de entrada em um int, depois o int em uma string binária e remova seus dois primeiros caracteres, pois o
bin
método retorna uma string no formato de0b...
Pegue todas as substrings da string binária, converta-as em decimal usando
int(n, 2)
e some-as.é uma lista de todas as substrings. Versão não destruída:
Espero que isto ajude.
fonte
CJam (22 bytes)
Esse é um byte a mais do que a melhor resposta atual do CJam, mas a abordagem provavelmente pode ser adaptada para alguns outros idiomas com bastante lucro.
Demonstração online
Análise
Suponha que a pergunta fosse
sem a parte
Então não é muito difícil mostrar que o bit mais significativo ocorre com o peso total,
1*(2^B-1)
ondeB
está o número de bits; o segundo bit mais significativo ocorre com o peso total2*(2^(B-1)-1)
; até o bit B-mais significativo, que ocorre com o peso totalB*(2^1-1)
.Considerando agora a subtração do número original
x
, terminamos com a somaDissecação
A conversão para a base 2 fornece a primeira parte da soma principal mais
x
; a base 1 fornece a segunda parte maisx
; e a base 0 fornece apenasx
, portanto, subtrair a base-1 da base-2 ox
cancelamento e subtrair a base-0 fornece o resultado desejado.fonte
JavaScript (ES6), 78 bytes
O externo
map
constrói substrings principais dan
representação binária de; o interno extrai substrings finais das principais substrings, cobrindo assim todas as possíveis substrings, incluindo a representação binária original.Cada substring é convertida de binário de volta para decimal e subtraída da entrada original, pois é um pouco mais curta do que juntá-las e subtrair a entrada original.
fonte
Mathematica,
7370 bytesFunção. Inteiro-> Inteiro
fonte
Retina , 64
Experimente online!
Um estágio de alto nível por descrição do estágio: converte decimal em unário, unário em binário, obtenha prefixos, obtenha sufixos de prefixos, despeje o número original, converte binário em unário, conte retorno. Escreverei uma descrição mais detalhada assim que terminar o golfe, muitas dessas etapas parecem suspeitas ...
fonte
C, 71 bytes
Mantemos um acumulador
a
e uma máscaram
. A máscara começa em 1 e fica um pouco mais cada vez ao redor do loop externo. No loop interno, uma cópiai
da entrada é deslocada sucessivamente para a direita até ficar mais curta que a máscara, acumulando o valor mascarado a cada vez.Programa de teste
Saída de teste
fonte
C #, 148 bytes
Ou, se eu adicionar Import "using System.Math estático;" então 138 com
Linguagens OOP como C # não vencerão essa corrida, mas eu queria tentar de qualquer maneira. Aqui está uma versão mais embelezada + testador.
O do-while aninhado adiciona o valor à direita do iTemp (depois de atribuí-lo) desde que o turno + 1 seja menor que o pos. A próxima linha calcula o próximo valor alterado do iPrev
x1 e x2 calculam a máscara, x3 a aplica e depois a desloca para a esquerda, pois o último dígito é sempre descartado. Para o 11, fica assim:
fonte
PowerShell v2 +, 138 bytes
Ooof. Essa conversão de / para o binário é cara.
Recebe entrada
$a
e usa a chamada .NET[convert]::ToString($a,2)
para transformá-la na representação binária. A partir daí, passamos por dois loops - o primeiro conta para trás do final da corda até1
e o segundo conta para cima0
. (O primeiro é o tempo de duração de uma substring e o segundo é o índice de onde na string iniciar a substring.) Definimos um auxiliar$l
ao longo do caminho para passar isso para o loop interno.Dentro do loop interno, usamos outra chamada .NET
[convert]::ToInt32()
para converter o apropriado.substring()
da base2
em um número inteiro. Cada um deles é deixado no pipeline. Encapsulamos tudo isso com parênteses()
e-join
eles juntamente com a e+
, em seguida, lançamos isso paraiex
(abreviação deInvoke-Expression
e similar aeval
).Eu que isso tecnicamente exige que a v2 ou mais recente chame corretamente as chamadas do .NET.
fonte