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

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.

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.


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]&

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.


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 ...


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

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

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)))

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^+##


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

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

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.

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


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, 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]

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!


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<...;)


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.