Todas as combinações binárias em decimais

12

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 Xe 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 1responsável, que só pode ser convertido de uma maneira.

Exemplo 2:

Entrada: 1 1

Resultado: 1,2

Explicação: 01converte para 1, 10converte para 2.

Exemplo 3:

Entrada: 3 2

Resultado: 3,5,6,9,10,12,17,18,20,24

Explicação: Três se 0dois 1s 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 <= 16o número máximo na saída só pode ocorrer a partir de 16 1s, ou seja, parâmetros 0e 16.
  • Como resultado da limitação acima, o intervalo de números que esperamos na saída são de 0e 65535.
  • 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
WallyWest
fonte
1
A saída precisa ser classificada?
Dennis
Oi @ Dennis, esqueci de mencionar que ... a saída deve ser classificada. Atualizei as regras de acordo.
WallyWest 07/09/16
2
Precisamos lidar com o caso 0 0?
ETHproductions
@ETHproductions que mencionei acima 0 <= X + Y <= 16, sim, porque 0 0seria considerado uma entrada válida que satisfaz essa regra.
WallyWest 7/09/16
2
Nesse caso, qual é o resultado esperado 0 0? O número 0 pode ser representado por zero, um ou mais zeros.
Dennis

Respostas:

5

Geléia , 8 bytes

0,1xŒ!ḄQ

Experimente online!

Como funciona

0,1xŒ!ḄQ Main link. Argument: [x, y]

0,1x     Repeat 0 x times and 1 y times.
    Œ!   Compute all permutations of the result.
      Ḅ   Unbinary; convert each permutation from base 2 to integer.
       Q  Unique; deduplicate the results.
Dennis
fonte
Isso é impressionante ... Há muita demanda por J no mercado de programação geral? Percebi que Jelly é baseada nisso?
Wally West
1
Ele tem uma base de usuários em algumas aplicações específicas (principalmente matemática / estatística), mas sinceramente não sei. Eu não usei J fora do código de golfe.
Dennis
@WallyWest Não é exigido com frequência porque é mais adequado para um ambiente que se beneficiaria com a programação funcional. Geralmente apenas para programação muito especializada.
Conor O'Brien
7

Python, 60 bytes

lambda x,y:[n for n in range(1<<x+y)if bin(n).count('1')==y]

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.

Dennis
fonte
5

Mathematica, 59 57 bytes

Um resultado usual no Mathematica: funções de alto nível = boas, nomes longos de funções = ruins.

#+##&~Fold~#&/@Permutations@Join[0&~Array~#,1&~Array~#2]&

Join[0&~Array~#,1&~Array~#2]cria uma lista com o número correto de 0s e 1s. Permutationsgera 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:

#~FromDigits~2&/@Permutations@Join[0&~Array~#,1&~Array~#2]&
Greg Martin
fonte
1
No entanto, bem observado e documentado ... Mathematica é ótimo para processamento de números, não tão bom para o golfe código ... bem, por algum tempo ...
Wally West
1
FromDigitsgeralmente pode ser reduzido:#+##&~Fold~#&/@Permutations...
Martin Ender
@MartinEnder: Entendi! e veja como generalizar para outras bases também. Obrigado por me ensinar esse idioma inteligente.
Greg Martin
1
Os créditos para chegar a ele vão para os alefalpha . ;)
Martin Ender
1
Acontece que a mudança para a abordagem de Dennis é mais curta:Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
Martin Ender
5

CJam ( 15 14 bytes)

{As.*s:~e!2fb}

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:

{2\f#~1$*:X;[({___~)&_2$+@1$^4/@/|_X<}g;]}

Funcionaria muito bem quando um GolfScript se desenrolasse.

Peter Taylor
fonte
Eu estava tentando substituir o ee{)*}/por algo usando .*e surgiu com esta solução de 14 bytes: {As.*s:~e!2fb}No s:~entanto, parece um pouco ineficiente agora.
Martin Ender
1
@ MartinEnder, eu realmente comecei .*e decidi que eeera melhor do que por exemplo 2,:a.*e_. Eu não sabia, porém, que e!isso dará a mesma saída, independentemente da ordem de seu argumento.
Peter Peter Taylor
4

Japonês , 16 bytes

'0pU +'1pV)á mn2

Teste online!

Como funciona

                  // Implicit: U = first integer, V = second integer
'0pU              // Repeat the string "0" U times.
     +'1pV)       // Concatenate with the string "1" repeated V times.
           á      // Take all unique permutations.
             mn2  // Interpret each item in the resulting array as a binary number.
                  // Implicit: output last expression

Versão alternativa, 17 bytes

2pU+V o f_¤è'1 ¥V
                   // Implicit: U = first integer, V = second integer
2pU+V              // Take 2 to the power of U + V.
      o            // Create the range [0, 2^(U+V)).
        f_         // Filter to only items where
           è'1     //  the number of "1"s in
          ¤        //  its binary representation
               ¥V  //  is equal to V. 
                   // Implicit: output last expression

Eu tenho tentado jogar mais nas duas versões, mas não consigo encontrar nenhuma folga ...

ETHproductions
fonte
Isso parece incrível ... e funciona muito bem! O intérprete não está mostrando o código transpilado à direita, no entanto? Eu adoraria ver como é processado?
WallyWest 07/09
@WallyWest Ele transpila aproximadamente para ("0".p(U)+"1".p(V)).á().m("n",2); cada uma das .x()funções é definida no arquivo de origem .
ETHproductions
3

Ruby, 63 bytes

Uma implementação simples. Sugestões de golfe são bem-vindas.

->a,b{(?0*a+?1*b).chars.permutation.map{|b|(b*'').to_i 2}.uniq}

Ungolfing

def f(a,b)
  str = "0"*a+"1"*b                   # make the string of 0s and 1s
  all_perms = str.chars.permutation   # generate all permutations of the 0s and 1s
  result = []
  all_perms.do each |bin|             # map over all of the permutations
    bin = bin * ''                    # join bin together
    result << bin.to_i(2)             # convert to decimal and append
  end
  return result.uniq                  # uniquify the result and return
end
Sherlock9
fonte
3

Pitão - 11 bytes

{iR2.psmVU2

Conjunto de Teste .

{                Uniquify
 iR2             Map i2, which converts from binary to decimal
  .p             All permutations
   s             Concatenate list
    mV           Vectorized map, which in this case is repeat
     U2          0, 1
     (Q)         Implicit input
Maltysen
fonte
2

Python 2-105 99 bytes

+8 bytes porque nossa saída precisa ser classificada

lambda x,y:sorted(set(int("".join(z),2)for z in __import__('itertools').permutations("0"*x+"1"*y)))
Jeremy
fonte
Edição impressionante!
Wally West
1
Obrigado, eu não tinha ideia de que você poderia importar módulos nas funções lambda.
Jeremy
Eu sempre pensei que você tinha permissão para ter uma declaração de importação separada para fins de código de golfe. (Obviamente, você ainda precisa incluir o comprimento.) Isso pode economizar um ou dois bytes?
Neil
2

Mathematica, 47 bytes

Cases[Range[2^+##]-1,x_/;DigitCount[x,2,1]==#]&

Uma função sem nome que aceita dois argumentos: número de 1s, número de 0s.

Essencialmente uma porta da solução Python de Dennis . Nós criamos uma gama de 0para 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-112^+##

Martin Ender
fonte
2

MATLAB 57 + 6

@(a,b)unique(perms([ones(1,a) zeros(1,b)])*2.^(0:a+b-1)')

correr usando

ans(2,3)

destroçado

function decimalPerms( nZeros, nOnes )
  a = [ones(1,nOnes) zeros(1,nZeros)];  % make 1 by n array of ones and zeros
  a = perms(a);                         % get permutations of the above 
  powOfTwo = 2.^(0:nOnes+nZeros-1)';    % powers of two as vector
  a = a * powOfTwo;                     % matrix multiply to get the possible values
  a = unique(a)                         % select the unique values and print
Richard
fonte
1
Para que mais 6 bytes?
mbomb007
Eu estava prestes a perguntar a mesma coisa
Wally West
2

MATL , 9 bytes

y+:<Y@XBu

Experimente online!

Explicação

A abordagem é semelhante à da resposta de Dennis 'Jelly .

y     % Implicitly take two inputs (say 3, 2). Duplicate the first.
      %   STACK: 3, 2, 3
+     % Add
      %   STACK: 3, 5
:     % Range
      %   STACK: 3, [1 2 3 4 5]
<     % Less  than
      %   STACK: [0 0 0 1 1]
Y@    % All permutations
      %   STACK: [0 0 0 1 1; 0 0 0 1 1; ...; 0 0 1 0 1; ...; 1 1 0 0 0]
XB    % Binary to decimal
      %   STACK: [3 3 ... 5 ... 24]
u     % Unique
      %   STACK: [3 5 ... 24]
      % Implicitly display
Luis Mendo
fonte
1

Na verdade, 21 bytes

Um porto da minha resposta Ruby . Sugestões de golfe são bem-vindas. Experimente online!

│+)'1*@'0*+╨`εj2@¿`M╔

Como funciona

          Implicit input of a and b.
│+)       Duplicate a and b, add, and rotate to bottom of stack. Stack: [b a a+b]
'1*@      "1" times b and swap with a.
'0*+      "0" times a and add to get "0"*a+"1"*b.
╨`...`M   Take all the (a+b)-length permutations of "0"*a+"1"*b
          and map the following function over them.
  εj        Join the permutation into one string
  2@¿       Convert from binary to decimal
╔         Uniquify the resulting list and implicit return.
Sherlock9
fonte
1

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

​{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().unique()}(1,2)

Para uma entrada de 1,2, você obtém:

[[1,0,1], [0,1,1], [1,1,0]]

Solução de 93 bytes

{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().collect{it.join()}.unique()}(1,2)​

Para uma entrada de 1,2, você obtém:

[101, 011, 110]

Solução de 123 bytes

{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().collect{it.join()}.unique().collect{Integer.parseInt(it,2)}}(1,2)

Para uma entrada de 1,2, você obtém:

[5, 3, 6]

Experimente aqui:

https://groovyconsole.appspot.com/edit/5143619413475328

Urna de polvo mágico
fonte
Eu contaria a solução de 123 bytes, pois ela corresponde ao tipo de saída mencionado no resumo. Bem feito.
WallyWest 7/09/16
1

JavaScript (Firefox 48), 85 76 74 71 70 bytes

Economizou 3 bytes graças a @Neil.

(m,n,g=x=>x?g(x>>1)-x%2:n)=>[for(i of Array(1<<m+n).keys())if(!g(i))i]

Compreensões de matriz são impressionantes. Pena que eles ainda não entraram nas especificações oficiais do ECMAScript.

JavaScript (ES6), 109 87 79 78 71 70 bytes

(m,n,g=x=>x?g(x>>1)-x%2:n)=>[...Array(1<<m+n).keys()].filter(x=>!g(x))

Agora deve funcionar em todos os navegadores compatíveis com ES6. Economizei 7 bytes neste, também graças ao @Neil.

ETHproductions
fonte
@ETHProductions, por algum motivo, estou conseguindo retornar undefinedagora a cada teste que estou fazendo ...?
WallyWest 7/09/16
@WallyWest Certifique-se de atribuí-lo primeiro a uma variável, por exemplo f=(m,n)=>..., depois chame-o como f(3,2). Se é isso que você está fazendo, qual navegador você está usando?
ETHproductions
Chrome 52 ... eu não tenho firefox nesta máquina, então eu só poderia testar a ES6 versão não Firefox ...
Wally West
Tentando executá-lo no console do navegador.
WallyWest 7/09/16
Ah, hmm. Eu também vejo esse problema no Chrome. Tente esta evalversã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}
ETHproductions
1

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

{a,b->([0]*a+[1]*b).permutations()*.join().collect{Integer.parseInt(it,2)}}(1,2)

Para uma entrada de 1,2, você obtém:

[5, 3, 6]
norganos
fonte
1

C (gcc) , 72 68 bytes

f(a,b){for(a=1<<a+b;a--;)__builtin_popcount(a)^b||printf("%d\n",a);}

Experimente 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!

G. Sliepen
fonte
Ainda aceitável. Bom trabalho!
WallyWest 8/09/16
0

PHP, 80 ou 63 bytes

dependendo wether eu devo usar $argvou pode usar $xe $yem vez disso.

for($i=1<<array_sum($argv);$i--;)echo$argv[2]-substr_count(decbin($i),1)?_:$i._;

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

for($i=1<<array_sum($argv);$i--;print$c?_:$i._)for($n=$i,$c=$argv[2];$n;$n>>=1)$c-=$n&1;

adicione um byte cada para apenas um sublinhado após cada número.

@WallyWest: Você estava certo. Salva 3 bytes para mim defor($i=-1;++$i<...;)

Titus
fonte
0

Perl 6 ,  64 62  49 bytes

{(0 x$^a~1 x$^b).comb.permutations.map({:2(.join)}).sort.squish}
{[~](0,1 Zx@_).comb.permutations.map({:2(.join)}).sort.squish}
{(^2**($^x+$^y)).grep:{.base(2).comb('1')==$y}}

Explicação:

# bare block lambda with two placeholder parameters 「$^x」 and 「$^y」
{
  # Range of possible values
  # from 0 up to and excluding 2 to the power of $x+$y
  ( ^ 2 ** ( $^x + $^y ) )

  # find only those which
  .grep:

  # bare block lambda with implicit parameter of 「$_」
  {

    # convert to base 2
    # ( implicit method call on 「$_」 )
    .base(2)

    # get a list of 1s
    .comb('1')

    # is the number of elements the same
    ==

    # as the second argument to the outer block
    $y
  }
}
say {(0..2**($^x+$^y)).grep:{.base(2).comb('1')==$y}}(3,2)
# (3 5 6 9 10 12 17 18 20 24)
Brad Gilbert b2gills
fonte