Inspirado pelo quarto problema da BMO2 2009 .
Dado um número inteiro positivo n como entrada ou parâmetro, retorne o número de números inteiros positivos cujas representações binárias ocorrem como blocos na expansão binária de n .
Por exemplo, 13 -> 6 porque 13 no binário é 1101 e possui substrings 1101, 110, 101, 11, 10, 1
. Não contamos números binários que começam com zero e não contamos zero.
Casos de teste
13 -> 6
2008 -> 39
63 -> 6
65 -> 7
850 -> 24
459 -> 23
716 -> 22
425 -> 20
327 -> 16
Você pode aceitar n como qualquer um dos seguintes:
- um inteiro
- uma lista de valores verdadeiros / falsos para a representação binária
- uma sequência para a representação binária
- uma string de base 10 (embora eu não saiba por que alguém faria isso)
Faça seu código o mais curto possível.
Respostas:
Python 3,
5450 bytesAgradecemos a Rod e Jonathan Allan por salvar quatro bytes.
fonte
+1
do intervalo parabin(i)
n
em si e devem sempre excluir0
da nossa contagem podemos vez sempre excluirn
e sempre contar0
(Bin (n) começa'0b...'
), portanto, podemos remover o1,
e+1
inteiramente e licençabin(i)
como é salvar quatro bytes Experimente online!Gelatina , 4 bytes
Experimente online!
Recebe a entrada como lista de
0
s e1
s.Experimente online com números!
Explicação:
Prova de que funciona:
Este programa recebe um número de entrada, N . A primeira coisa que este produto faz é, é claro, pegar as substrings de N 2 ( N na base 2 ). Isso inclui substrings duplicados, começando com 0 ou 1 .
Depois disso, simplesmente pegamos as substrings exclusivas, mantendo apenas a primeira ocorrência de cada valor na lista de substring.
Então, este programa soma os primeiros elementos das listas, depois os segundos, depois o terceiro, quarto, etc. e se uma das listas não tiver esse elemento,
0
será assumido. O que o desafio pede é efetivamente Quantas substrings únicas começando com 1 esse número tem em sua forma binária? . Como todo primeiro elemento a ser contado é1
, podemos simplesmente somar em vez de filtrar as substrings apropriadas.Agora, o primeiro elemento da lista resultante do somatório descrito acima contém a contagem dos primeiros bits das substrings, então simplesmente pop e finalmente retornamos.
fonte
Oitava ,
6261 bytesExperimente online!
Explicação
Para entrada
n
, o código testa todos os números de1
atén
para ver se sua representação binária é uma substring da representação binária da entrada.fonte
05AB1E , 5 bytes
Recebe a entrada como uma sequência binária.
O cabeçalho converte a entrada inteira em binário para facilitar o teste.
Experimente online!
Explicação
fonte
bŒʒć}Ùg
mas não, isso é melhor.Perl 5 , 36 + 1 (
-p
) = 37 bytesExperimente online!
Recebe entrada como uma sequência binária.
fonte
PowerShell ,
1039282 bytesExperimente online!
Recebe a entrada como uma matriz de
1
e0
(verdade e falsey no PowerShell). Faz um loop$s
(ou seja, quantos elementos na matriz de entrada). Dentro do loop, fazemos o loop do número atual (salvo como$i
) até$s.count
. Cada loop interno, dividimos-join
a matriz em uma string. Em seguida,sort
com a-u
bandeira nique (que é mais curta do queselect
com a-u
bandeira nique e não nos importamos se elas estão classificadas ou não), pegamos as que não começam e pegamos0
o total.count
. Isso é deixado no pipeline e a produção está implícita.fonte
JavaScript (ES6), 55 bytes
Recebe entrada como uma sequência binária.
Aqui está uma triste tentativa de fazê-lo com números e funções recursivas:
Abordagem antiga, 74 bytes
Também recebe entrada como uma sequência binária.
fonte
Python 2 ,
11881 bytesObrigado a @Rod por salvar 37 bytes!
Recebe entrada como uma sequência binária.
Experimente online!
Python 2 , 81 bytes
Graças a @Rod!
Recebe entrada como uma sequência binária.
Experimente online!
fonte
set(...)
por{...}
exrange
comrange
+1
do intervalo para a fatia e mudars.startswith
para oint(s,2)
seguinteGelatina , 5 bytes
Experimente online!
Recebe a entrada como uma lista de 1s e 0s. O rodapé no link aplica a função a cada um dos exemplos na postagem.
Jonathan Allan apontou que
ẆḄQTL
é uma alternativa de 5 bytes que usa oT
átomo que encontra os índices de todos os elementos da verdade.Explicação
Tome bin (13) = 1101 como exemplo. Entrada é
[1,1,0,1]
Tomou a idéia "truthify" (assine neste caso) da resposta 05AB1E
fonte
T
comẆḄQTL
R ,
88bytesExperimente online!
Recebe entrada como uma sequência binária.
usando
mapply
, gera uma matriz de todas as substrings da entrada.strtoi
converte-os como2
números inteiros base , e tomo a soma da conversão lógica (!!
) das entradas no resultado.fonte
Retina ,
3729 bytesExperimente online!Eu apenas tive que experimentar o
w
modificador do Retina 1.0 . Editar: salvou 8 bytes graças a @MartinEnder. Explicação:Converta de decimal para unário.
Converter de unário em binário, usando
#
para0
e_
for 1.Gere substrings que começam com
1
, quero dizer_
,. Ow
modificador corresponde a todas as substrings, não apenas a mais longa em cada inicialização_
, enquanto op
modificador deduplica as correspondências. Finalmente, como esta é a última etapa, a contagem de correspondências é retornada implicitamente.fonte
q
(oup
) além dew
. Você também não precisa especificarC
explicitamente, porque é o tipo de estágio padrão se houver apenas uma única fonte.M
ser o tipo de estágio padrão!C
meio que é o queM
costumava ser. :)Pitão , 8 bytes
Experimente aqui!
Recebe entrada como uma sequência binária.
.:
gera todas as substrings,vM
avalia cada uma (ou seja, converte cada uma das binárias),{
desduplica,<space>#
filtra por identidade el
obtém o comprimento.fonte
Wolfram Language (Mathematica) , 35 bytes
Contando subsequências únicas da representação binária que começam com uma, embora não tenha certeza de que esse código precise de uma explicação.
Experimente online!
fonte
___
faz?Perl 6 , 47 bytes
Experimente online!
fonte
Julia 0.6 , 37 bytes
Experimente online!
Juliaficação da resposta em Python por J843136028 usando
.
para aplicativo de função elemento-elemento com transmissão. ( link )fonte
Java, 232 bytes
Onde n é a entrada, b é a representação binária e l é uma lista de todas as substrings. A publicação pela primeira vez aqui, definitivamente precisa melhorar e fique à vontade para apontar quaisquer erros! Ligeiramente editado para facilitar a leitura.
fonte
String b=...,t
eint i=...,j,k
salvar caracteres para declarações repetidas do mesmo tipo. Seu código também não se qualificariam como uma entrada porque é um trecho, nem um programa completo nem um fragmento funcional, você tem que escrever seja uma função ou envolva o seu código na forma lambdaAnexo , 35 bytes
Experimente online!
Equivalentemente:
Explicação
Vou explicar a segunda versão, pois é mais fácil seguir (sendo explícito):
fonte
Ruby
41 3627 bytesToma string binária como entrada
É ultra-ineficiente
Em parte inspirado por esta resposta python 3
Experimente online!
fonte
Java 8,
160159158 bytesEntrada como String binária.
Deve haver uma maneira mais curta ..>.>
Explicação:
Experimente online.
fonte
C ++, 110 bytes
Esta é uma função recursiva. Usamos a
std::set
para contar valores, ignorando duplicatas. As duas chamadas recursivas mascaram os bits à esquerda (f(n&i)
) e à direita (f(n/2)
), eventualmente produzindo todas as substrings como números inteiros.Observe que se você deseja chamá-lo novamente,
s
deve ser limpo entre as chamadas.Programa de teste
Resultados
fonte
J , 34 bytes
Experimente online!
fonte
J , 15 bytes
Entrada é uma lista binária. Experimente online!
fonte
Perl 6 , 34 bytes
Teste-o
Expandido:
fonte