Um número inteiro positivo pode ser diluído inserindo um 0
entre dois bits em sua expansão binária. Isso significa que um n
número de bits possui n-1
diluições, que não são necessariamente todas distintas.
Por exemplo, para 12
(ou 1100
em binário), as diluições são
11000 = 24
^
11000 = 24
^
10100 = 20
^
Neste desafio, tomaremos a soma de todas as diluições, excluindo o número original. Pois 12
, considerando a soma dos 24, 24, 20
resultados 68
, 68
deve ser a saída para 12
.
Desafio
Dado um número inteiro positivo n > 1
como entrada, produza / retorna a soma diluída conforme explicado acima.
Exemplos
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Regras
- Pode-se presumir que a entrada e a saída se encaixam no tipo inteiro nativo do seu idioma.
- A entrada e saída podem ser fornecidas em qualquer formato conveniente .
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
code-golf
arithmetic
number-theory
binary
AdmBorkBork
fonte
fonte
Respostas:
Python 2 ,
4339 bytesExperimente online!
Quão?
Cada chamada da função recursiva calcula uma única diluição. A posição do inserido
0
élog2(i)
. A função se repete atéi
ficar maior quen
e a inserção estaria à esquerda do número. Ifi>n
,n/i
avalia to0
, que é um valor falso no Python.n*2
desloca o número inteiro um dígito binário para a esquerdan%i
oun % 2**(position of insertion)
calcula o valor da parte que não deve ser deslocada para a esquerda. Este valor é subtraído do número deslocado.Exemplo (n = 7)
fonte
Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
MATL , 13 bytes
Experimente no MATL Online! Ou verifique todos os casos de teste .
Explicação
Considere a entrada
12
como um exemplo.fonte
C,
5856 bytesObrigado a @Dennis por salvar dois bytes!
Experimente online!
C (gcc) , 50 bytes
Retornar por
k=s;
é um comportamento indefinido, mas funciona com o gcc quando as otimizações estão desabilitadas. Além disso,n%k+n/k*(k+=k)
possui um comportamento não especificado , mas parece funcionar bem com o gcc.Experimente online!
fonte
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 bytes)n%k
oun/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
é completamente bom en%k
sempre será avaliado antesn/k*(k*=2)
en/k
também será avaliado antesk*=2
. Obrigada pelo esclarecimento. (Vou excluir alguns dos meus comentários agora para reduzir a confusão.)Geléia ,
98 bytesExperimente online!
Vice-versa
B¹ƤṖ+BḄS
,: obtenha prefixos, solte por último, adicione-os à entrada e soma.fonte
J ,
20 1514 bytesExperimente online.
15 bytes
Experimente online!
fonte
Japonês ,
1211 bytesTente
Explicação
fonte
JavaScript (ES6),
4140 bytesEconomizou 1 byte graças ao Mr.Xcoder
Casos de teste
Mostrar snippet de código
fonte
Retina ,
535047 bytesExperimente online! O link inclui casos de teste. Editar: salvou 3 bytes graças a @MartinEnder. Explicação:
Converta de decimal para binário, mas use O para representar 0, pois não é um dígito, e _ para representar 1, pois é o caractere de repetição padrão na Retina 1.
Insira um O entre cada par de dígitos e colete os resultados como uma lista.
Converter de binário em unário. (Essa conversão produz
O
s extras , mas não nos importamos.)Soma e converta para decimal.
fonte
%
. Se for mais complicado, você precisará de algo parecido/[O_]+/_
.Pitão , 13 bytes
Experimente aqui!
Explicação
fonte
Gelatina , 10 bytes
Experimente online!
Não é o mais curto atualmente, mas poderia ser se houvesse uma maneira de contornar
Bµ µḄ
...Explicação
Basicamente, isso funciona multiplicando cada dígito binário por um número mágico. Não consigo explicar sem visualizá-lo, então aqui está o número binário com o qual trabalharemos:
Conforme explicado pelo desafio, a saída que queremos é a soma desses números binários:
No entanto, na verdade, não precisamos inserir zeros: o átomo "não-binário" de Jelly aceitará outros números além de apenas
0
e1
. Quando nos permitimos usar2
, esse padrão fica mais simples:Quando somamos os dígitos em cada coluna, obtemos
O truque que esta resposta usa é gerar esse padrão e multiplicar cada dígito pelo dígito correspondente no original para cancelar as colunas necessárias. 12, por exemplo, seria representado como
fonte
Java 8, 55 bytes
Resposta C da porta do Steadybox ' e colocou 3 bytes de golfe no processo.
Experimente online.
fonte
Casca ,
1312 bytes-1 byte graças a @Mr. Xcoder!
Experimente online!
Explicação
fonte
05AB1E , 14 bytes
Experimente online!
fonte
Pip ,
2118 bytesExperimente online!
Explicação
Ligue para o nosso número de entrada
a
. Para cada índice binárioi
no qual queremos inserir um zero, podemos calcular os bits restantes do ponto de inserção comoa // 2**i
(onde//
é a divisão inteira e a**
exponenciação), os bits à direita do ponto de inserção comoa % 2**i
e, portanto, o número inteiro diluído como2 * (a // 2**i) * 2**i + (a % 2**i)
. Mas(a // 2**i) * 2**i
é igual aa - (a % 2**i)
, e assim podemos reorganizar para uma fórmula mais curta:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.fonte
R ,
14148 bytesExperimente online!
Ou eu estou fazendo algo realmente errado ou R é terrível em manipulação de bits.Portar a abordagem de Luis Mendo é fácil, correta e divertida.Mas se você realmente quer apenas mexer com operações de bits, MickyT sugeriu o seguinte 105 byter:
Experimente online!
fonte
Python 3,
928078 bytesExperimente Online
Obrigado ao Mr.XCoder e ovs por -12 bytes e -2 bytes, respectivamente.
fonte
Lote,
9277 bytesEditar: alternado para a mesma fórmula que todo mundo está usando.
fonte
Gelatina , 14 bytes
Experimente online!
fonte
Perl 5 , 36 + 1 (
-p
) = 37 bytesExperimente online!
fonte
Anexo , 57 bytes
Experimente online!
Eu pensei em abordar o problema a partir de uma abordagem de manipulação não-bit, pois essa abordagem é impraticável no Attache. Eu tenho que investigar algumas das partes desta abordagem para alternativas.
Explicação
Aqui está uma versão expandida:
Isso simplesmente pega a representação binária do número, divide-a em determinados pontos, insere zeros lá, converte de volta para decimal e soma-os.
fonte
J , 33 bytes
Provavelmente há muito espaço para mais golfe.
Quão?
@#:
converter para binário e<@}.\.
- encontre todos os elementos suficientes, solte o primeiro dígito de cada e<\
- encontre todos os prefixos e encaixe-os(,0;])"0
- para cada prefixo, adicione 0 e, em seguida, adicione o sufixo decapitado correspondente;@
raze (unbox)1#.[:}:#.@
- converter para decimal, reduzir e somarExperimente online!
fonte