aviso Legal
Esta pergunta não é uma duplicata desta pergunta . Não estou contando dígitos específicos, pois já os definimos nos parâmetros iniciais. Esta pergunta está focada nos números decimais que podem ser construídos a partir de cadeias binárias com base nos dígitos fornecidos.
Desafio
Dados dois números inteiros X
e Y
, representando o número de zeros ( 0
) e uns ( 1
), respectivamente, calcule todos os equivalentes decimais possíveis que podem ser determinados a partir da criação de cadeias binárias usando apenas os zeros e os fornecidos, e exibi-los como saída.
Exemplo 1:
Entrada: 0 1
Resultado: 1
Explicação: Apenas um 1
responsável, que só pode ser convertido de uma maneira.
Exemplo 2:
Entrada: 1 1
Resultado: 1,2
Explicação: 01
converte para 1, 10
converte para 2.
Exemplo 3:
Entrada: 3 2
Resultado: 3,5,6,9,10,12,17,18,20,24
Explicação: Três se 0
dois 1
s fazem 00011
(3), 00101
(5), 00110
(6), 01001
(9), 01010
(10), 01100
(12), 10001
(17), 10010
(18), 10100
(20), 11000
(24)
Limitações e regras
- Só espero que seu código funcione onde
0 < X + Y <= 16
o número máximo na saída só pode ocorrer a partir de 161
s, ou seja, parâmetros0
e16
. - Como resultado da limitação acima, o intervalo de números que esperamos na saída são de
0
e65535
. - Aceitarei funções ou código, desde que a saída resultante seja fornecida, seja uma lista separada por vírgula, uma matriz, uma lista emitida para STDOUT etc. O único critério que devo enfatizar sobre a saída é que ela deve ser classificada.
- Isso é código de golfe, o mínimo de bytes receberá o máximo de glória.
- Não toleraremos brechas tolas
0 0
?0 <= X + Y <= 16
, sim, porque0 0
seria considerado uma entrada válida que satisfaz essa regra.0 0
? O número 0 pode ser representado por zero, um ou mais zeros.Respostas:
Geléia , 8 bytes
Experimente online!
Como funciona
fonte
Python, 60 bytes
Teste em Ideone .
Como funciona
Todos os números positivos que podem ser representados em binário com x zeros e y são claramente menores que 2 x + y , uma vez que a representação binária canônica deste último possui x + y + 1 dígitos.
O lambda simplesmente itera sobre os números inteiros em [0, 2 x + y ) e mantém todos os números n nesse intervalo que possuem y . Como n <2 x + y é pode ser representado com x (ou menos) zeros.
fonte
Mathematica,
5957 bytesUm resultado usual no Mathematica: funções de alto nível = boas, nomes longos de funções = ruins.
Join[0&~Array~#,1&~Array~#2]
cria uma lista com o número correto de0
s e1
s.Permutations
gera todas as permutações dessa lista, sem repetições (como aprendi) e em ordem classificada.#+##&~Fold~#
(uma versão otimizada para golfe#~FromDigits~2
) converte uma lista de dígitos da base 2 no número inteiro que eles representam.Versão anterior, antes do comentário de Martin Ender:
fonte
FromDigits
geralmente pode ser reduzido:#+##&~Fold~#&/@Permutations...
Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
CJam (
1514 bytes)Este é um bloco anônimo (função) que recebe a entrada como uma matriz
[number-of-ones number-of-zeros]
e retorna a saída como uma matriz.Demonstração online
Muito longe da realidade, mas mais interessante : isso é sem permutações internas ou conversão de base:
Funcionaria muito bem quando um GolfScript se desenrolasse.
fonte
ee{)*}/
por algo usando.*
e surgiu com esta solução de 14 bytes:{As.*s:~e!2fb}
Nos:~
entanto, parece um pouco ineficiente agora..*
e decidi queee
era melhor do que por exemplo2,:a.*e_
. Eu não sabia, porém, quee!
isso dará a mesma saída, independentemente da ordem de seu argumento.Japonês , 16 bytes
Teste online!
Como funciona
Versão alternativa, 17 bytes
Eu tenho tentado jogar mais nas duas versões, mas não consigo encontrar nenhuma folga ...
fonte
("0".p(U)+"1".p(V)).á().m("n",2)
; cada uma das.x()
funções é definida no arquivo de origem .Ruby, 63 bytes
Uma implementação simples. Sugestões de golfe são bem-vindas.
Ungolfing
fonte
Pitão - 11 bytes
Conjunto de Teste .
fonte
Python
2-10599 bytes+8 bytes porque nossa saída precisa ser classificada
fonte
Mathematica, 47 bytes
Uma função sem nome que aceita dois argumentos: número de
1
s, número de0
s.Essencialmente uma porta da solução Python de Dennis . Nós criamos uma gama de
0
para e em seguida, manter apenas os números cuja quantidade de -bits é igual à primeira entrada. A parte mais interessante é provavelmente a que usa alguma mágica de sequência para evitar os parênteses em torno da adição dos dois argumentos.2x+y-1
1
2^+##
fonte
MATLAB 57 + 6
correr usando
destroçado
fonte
MATL , 9 bytes
Experimente online!
Explicação
A abordagem é semelhante à da resposta de Dennis 'Jelly .
fonte
Na verdade, 21 bytes
Um porto da minha resposta Ruby . Sugestões de golfe são bem-vindas. Experimente online!
Como funciona
fonte
Groovy 74 bytes, 93 bytes ou 123 bytes
Não sei qual deles você considera mais plenamente responde à pergunta, mas ...
Solução de 74 bytes
Para uma entrada de 1,2, você obtém:
Solução de 93 bytes
Para uma entrada de 1,2, você obtém:
Solução de 123 bytes
Para uma entrada de 1,2, você obtém:
Experimente aqui:
https://groovyconsole.appspot.com/edit/5143619413475328
fonte
JavaScript (Firefox 48),
8576747170 bytesEconomizou 3 bytes graças a @Neil.
Compreensões de matriz são impressionantes. Pena que eles ainda não entraram nas especificações oficiais do ECMAScript.
JavaScript (ES6),
1098779787170 bytesAgora deve funcionar em todos os navegadores compatíveis com ES6. Economizei 7 bytes neste, também graças ao @Neil.
fonte
undefined
agora a cada teste que estou fazendo ...?f=(m,n)=>...
, depois chame-o comof(3,2)
. Se é isso que você está fazendo, qual navegador você está usando?eval
versão -less (faz exatamente a mesma coisa, mas com mais 3 bytes de comprimento):(m,n)=>{a="";for(i=0;i<1<<m+n;i++)if(i.toString(2).split(1).length==n+1)a+=i+" ";return a}
Groovy 80 bytes
com base na resposta de @carusocomputing
sua solução de 123 bytes pode ser compactada em 80 bytes:
Solução de 80 bytes
Para uma entrada de 1,2, você obtém:
fonte
C (gcc) ,
7268 bytesExperimente online!
Infelizmente, não há popcount () na biblioteca padrão, mas ela é fornecida como uma "função interna" pelo GCC. A saída é classificada, mas na ordem inversa.
Graças a @ceilingcat por cortar 4 bytes!
fonte
PHP, 80 ou 63 bytes
dependendo wether eu devo usar
$argv
ou pode usar$x
e$y
em vez disso.imprime todos os números correspondentes em ordem decrescente, delimitada por sublinhados.
nome do arquivo não deve começar com um dígito.
sem builtins, 88 ou 71 bytes
adicione um byte cada para apenas um sublinhado após cada número.
@WallyWest: Você estava certo. Salva 3 bytes para mim de
for($i=-1;++$i<...;)
fonte
Perl 6 ,
64 6249 bytesExplicação:
fonte