Tome um número inteiro positivo n como entrada e dê saída (alguns dos) números decimais que podem ser criados usando n bits, ordenados da seguinte maneira:
Primeiro, liste todos os números que podem ser criados com apenas um 1
e o restante 0
na representação binária (classificada), depois todos os números que podem ser criados com dois consecutivos 1
, o restante 0
, depois três consecutivos 1
e assim por diante.
Vamos ver como é isso para n = 4 :
0001 - 1
0010 - 2
0100 - 4
1000 - 8
0011 - 3
0110 - 6
1100 - 12
0111 - 7
1110 - 14
1111 - 15
Portanto, a saída para n = 4 é: 1, 2, 4, 8, 3, 6, 12, 7, 14, 15 (formato de saída opcional).
Casos de teste:
n = 1
1
n = 2
1 2 3
n = 3
1, 2, 4, 3, 6, 7
n = 8
1, 2, 4, 8, 16, 32, 64, 128, 3, 6, 12, 24, 48, 96, 192, 7, 14, 28, 56, 112, 224, 15, 30, 60, 120, 240, 31, 62, 124, 248, 63, 126, 252, 127, 254, 255
n = 17
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288, 24576, 49152, 98304, 7, 14, 28, 56, 112, 224, 448, 896, 1792, 3584, 7168, 14336, 28672, 57344, 114688, 15, 30, 60, 120, 240, 480, 960, 1920, 3840, 7680, 15360, 30720, 61440, 122880, 31, 62, 124, 248, 496, 992, 1984, 3968, 7936, 15872, 31744, 63488, 126976, 63, 126, 252, 504, 1008, 2016, 4032, 8064, 16128, 32256, 64512, 129024, 127, 254, 508, 1016, 2032, 4064, 8128, 16256, 32512, 65024, 130048, 255, 510, 1020, 2040, 4080, 8160, 16320, 32640, 65280, 130560, 511, 1022, 2044, 4088, 8176, 16352, 32704, 65408, 130816, 1023, 2046, 4092, 8184, 16368, 32736, 65472, 130944, 2047, 4094, 8188, 16376, 32752, 65504, 131008, 4095, 8190, 16380, 32760, 65520, 131040, 8191, 16382, 32764, 65528, 131056,16383, 32766, 65532, 131064, 32767, 65534, 131068, 65535, 131070, 131071
Isso é código-golfe , então o código mais curto em cada idioma vence!
Boas explicações são altamente encorajadas , também para soluções em "idiomas regulares"!
code-golf
sorting
base-conversion
binary
Stewie Griffin
fonte
fonte
Respostas:
Python , 53 bytes
Experimente online!
A função recursiva gera a lista classificada como uma pré-ordem percorrida nesta árvore (exemplo com
n=4
):As ramificações esquerdas dobram o valor, e as ramificações direitas
i->i*2+1
existem e existem apenas para ímparesi
. Portanto, a caminhada de pré-encomenda para não-folhas éT(i)=[i]+T(i*2)+i%2*T(i*2+1)
.A árvore termina em profundidade
n
, onden
está a entrada. Isso é obtido decrementandon
a cada passo e parando quando é 0.Uma estratégia alternativa seria terminar com valores que
i
excedam2**n
, em vez de rastrear a profundidade. Eu achei que esse fosse um byte a mais:fonte
[f]
toque é divertido, não posso dizer que já vi isso antes.Gelatina , 6 bytes
Isso se qualifica para o bônus imaginário .
Experimente online!
Como funciona
fonte
Ẇ
é um componente ideal para esse desafio e é implementado para que os resultados estejam na ordem certa para esse desafio. Bem feito :-)Mathematica, 40 bytes
Cada número na lista desejada é a diferença de duas potências de 2; portanto, simplesmente as geramos em ordem, usando
Table
e achatando a lista. Eu acho que isso ganha o bônus imaginário de Stewie Griffin :)Mathematica, 35 bytes
Uma porta do algoritmo Jelly de Dennis . Eu não sabia
Subsequences
antes disso! (Também não vi que as milhas haviam postado essa resposta exata ... vá com uma votação!)fonte
JavaScript (ES6),
595855 bytesUm programa completo que recebe informações por meio de um prompt e alerta cada número em sucessão. Isso também se qualifica para o bônus imaginário .
Snippet de teste
(Nota: usa em
console.log
vez dealert
)Mostrar snippet de código
fonte
JavaScript (ES6),
5551 bytesRetorna uma lista separada por espaços de números inteiros.
Bônus imaginário amigável.
Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
Python 2 ,
6461 bytes-3 bytes graças a Dennis
Experimente online!
fonte
Mathematica, 35 bytes
fonte
Python 2 ,
656358 bytesExperimente online!
fonte
(2<<i)-1<<j
... e você já descobriu. Bom trabalho! Além disso, bom trabalho em se livrar das faixas duplasHaskell , 37 bytes
Experimente online!
fonte
Haskell, 47 bytes
Exemplo de uso:
f 4
->[1,2,4,8,3,6,12,7,14,15]
. Experimente online! .Como funciona: para cada número
b
em[1..n]
, comece com2^b-1
e repetidamente dobrar o valor e tomarn-b+1
elementos desta lista.fonte
05AB1E , 6 bytes
Experimente online! ou como um conjunto de testes
Explicação
Usa o truque de soma de sub-listas, como mostrado na resposta de Dennis 'Jelly
fonte
Groovy,
9089 bytesA conversão binária é tão burra no groovy.
-1 graças a Gurupad Mamadapur
fonte
{(1..<2**it)...
salva um byte.Pitão, 7 bytes
Experimente online.
Usa o algoritmo de Dennis.
fonte
Utilitários Bash + Unix, 51 bytes
Experimente online!
A entrada n é passada em um argumento.
Use seq para imprimir todos os números com n ou menos dígitos. (Estes são os números da base 10, portanto, existem muitos números extras aqui. É um desperdício e consome tempo, mas isso é código de golfe!)
A chamada para grep mantém apenas os números que consistem precisamente em 1s seguidos por 0s.
Em seguida, use sort -r para classificá-los em ordem lexicográfica reversa.
Por fim, dc está definido como entrada de base 2 - empurra os números classificados em uma pilha e depois imprime a pilha de cima para baixo. (Isso imprime o último item enviado primeiro, etc., e é por isso que estou usando sort -r em vez de apenas sort.)
Corrigido um erro: eu havia omitido a opção -f% .f para seq, necessária para contagens de números inteiros a partir de 1000000 em diante. (Agradecemos a @TobySpeight por apontar que havia um problema.)
fonte
dc<<<2i`seq $[10**7-1]|grep ^1*0*$|sort -r`f | wc -
relata apenas 12 valores. Eu acho que você quer, emgrep ^1[01]*$
vez disso.Mathematica / Mathics , 69 bytes
Experimente online!
fonte
Perl 6 , 38 bytes
Como funciona
Ou seja, constrói os números assim:
O código:
Perl 6 , 44 bytes
Essa foi a minha primeira abordagem antes de pensar na solução de mudança de bits (na verdade mais simples) acima.
Como funciona
Ou seja, constrói os números assim:
fonte
Haskell
5946 BytesEu comecei com
f n=[0..n]>>= \b->take(n-b).iterate(*2).sum.map(2^)$[0..b]
da resposta de nimi acima ganhou o insight que
sum.map(2^)$[0..x]
pode ser condensado até2^x-1
Terminando com
e n=[1..n]>>= \x->map(\y->2^y*(2^x-1))[0..n-x]
[1..n] - lista com o número de bits consecutivos que queremos percorrer`
>> = - traduzido aproximadamente para cada elemento da lista à esquerda, passe-o para a função à direita e concatene todos os resultados
\ x -> - declaração da função lambda com um argumento
map xy - aplica a função x a todos os membros da lista y
No nosso caso x = (\ y-> 2 ^ y * (2 ^ x-1)) - outra função lambda 2 ^ y * (2 ^ x-1)). Essa fórmula surge da multiplicação por duas adicionando um zero à direita em binário (exemplo 0001 a 0010). 2 ^ x - 1 é o número de bits com os quais estamos trabalhando. portanto, para 11, temos 2 ^ 0 * 3 (isto é, não mude nada) == 0011, então 2 ^ 1 * 3 = 0110 e, em seguida, 2 ^ 2 * 3-1100.
[0..nx] Cria a lista de quantas vezes podemos mudar os bits. Se estivermos trabalhando com um único 1, olhando para 0001, queremos mudar 3 vezes (4-1). Se estamos trabalhando com dois 11, queremos 4-2 e assim por diante.
fonte
Python 3, 59 bytes
Nota: isso foi feito independentemente das soluções de ovs e de Dennis , embora seja muito semelhante a ambas.
Como funciona:
Experimente online!
Dicas (codificação e dinheiro) são sempre bem-vindas!
fonte
Japonês , 11 bytes
Teste online!
Explicação
Isso praticamente usa a abordagem de @ Dennis:
fonte
Python ,
6159 bytesExperimente online!
fonte
PHP,
59 5653 bytesrecebe entrada do STDIN; corra com
-R
.demolir
fonte
$argn
muito boa ideia. Depois de ler a pergunta que eu tenho na minha cabeça uma solução com mais de 200 BytesJ , 19 bytes
Isso usa o mesmo método na solução @Dennis ' .
Experimente online!
Explicação
fonte
Python 3, 91 bytes
Programa completo, com saída separada por vírgula + espaço, conforme especificado.
Explicação:
A notação em estrela descompacta as listas. Então
print(*[1,2,3])
é o mesmo queprint(1,2,3)
. Passe aoint()
construtor uma sequência de '1's consecutivos.-~b
avalia comob+1
, mas você não precisa cercá-lo entre colchetes ao multiplicar uma sequência.Bitshift o número inteiro produzido um número crescente de vezes.
print()
possui o argumento sep opcional, especificando a sequência a ser inserida entre cada item em uma lista descompactada.fonte
Java 7, 108 bytes
Dobra o valor inicial desde que o resultado seja menor que
2^n
. Posteriormente, atualiza o valor inicial a ser(initial_value * 2) + 1
e inicia novamente a partir daí até que finalmente chegue(2^n)-1
.por exemplo, para
n=4
:Experimente online!
fonte
Ruby, 50 bytes
Tentei algumas abordagens "inteligentes", mas essa parece ser a mais curta (literalmente, siga as instruções)
Explicação:
Cada iteração começa com 2 ^ n-1 e multiplica por 2 até que o limite superior seja atingido. Nada extravagante, apenas matemática básica.
fonte
QBIC , 37 bytes - bônus imaginário = ainda 37 bytes ...
Pena que ainda não
while-wend
integrei o QBIC ... Explicação:EDIT: QBIC agora tem suporte para
WHILE
:Isso é apenas 26 bytes! Aqui está o
WHILE
:fonte
MATL,
1918 bytes1 byte salvo graças a @Luis
Experimente Online
fonte
R ,
694846 bytesCada número decimal correspondente aos do
i in 1..n
sistema binário é multiplicado por2^(0..n-i)
, ou seja, primeirasn-i+1
potências de dois (1, 2, 4, ...).Experimente online!
fonte
Stax , 9 bytes
Execute e depure online!
Explicação
Bem, não há conversão básica aqui.
Usa a versão descompactada (10 bytes) para explicar.
fonte
Lote, 92 - 0 = 92 bytes
Subtraindo 0 para o bônus imaginário de @ StewieGriffin.
fonte