Wszystkie kombinacje binarne na dziesiętne

12

Zrzeczenie się

To pytanie nie jest duplikatem tego pytania . Nie liczę konkretnych cyfr, ponieważ mamy już ustawione w parametrach początkowych. To pytanie koncentruje się na liczbach dziesiętnych, które można zbudować z ciągów binarnych na podstawie podanych cyfr.

Wyzwanie

Biorąc pod uwagę dwie liczby całkowite Xi Y, odpowiednio, reprezentujące liczbę zer ( 0) i jedynek ( 1), oblicz wszystkie możliwe ekwiwalenty dziesiętne, które można określić na podstawie tworzenia ciągów binarnych przy użyciu tylko podanych zer i jedynek, i wyświetl je jako dane wyjściowe.

Przykład 1:

Wejście: 0 1

Wynik: 1

Objaśnienie: Tylko jeden 1do rozliczenia, który można przekształcić tylko w jeden sposób.

Przykład 2:

Wejście: 1 1

Wynik: 1,2

Objaśnienie: 01konwertuje na 1, 10konwertuje na 2.

Przykład 3:

Wejście: 3 2

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

Objaśnienie: Trzy 0i dwa 1s tworzą 00011(3), 00101(5), 00110(6), 01001(9), 01010(10), 01100(12), 10001(17), 10010(18), 10100(20), 11000(24)

Ograniczenia i zasady

  • Spodziewam się, że twój kod będzie działał tylko tam 0 < X + Y <= 16, gdzie maksymalna liczba w danych wyjściowych może wystąpić tylko z 16 1s, tj. Parametrów 0i 16.
  • W wyniku powyższego ograniczenia zakres liczb, których oczekujemy na wyjściu, pochodzi z 0i 65535.
  • Akceptuję funkcje lub kod, tak długo, jak Wynikiem jest, czy to będzie lista oddzielonych przecinkami, tablica, lista wyprowadzane do STDOUT, itd. Jedynym kryterium Muszę podkreślić o wyjście jest to, że musi być sortowane.
  • To jest kod golfowy, minimalne bajty otrzymają maksymalną sławę.
  • Nie będziemy tolerować głupich luk
WallyWest
źródło
1
Czy dane wyjściowe muszą być sortowane?
Dennis,
Cześć @Dennis, tak, zapomniałem wspomnieć, że ... dane wyjściowe muszą być posortowane. Zaktualizowałem odpowiednio zasady.
WallyWest,
2
Czy potrzebujemy załatwić sprawę 0 0?
ETHprodukcje
@ETHproductions Wspomniałem powyżej, że 0 <= X + Y <= 16tak, ponieważ 0 0byłoby uważane za prawidłowe dane wejściowe, które spełniają tę zasadę.
WallyWest,
2
W takim razie, po co jest oczekiwany wynik 0 0? Liczba 0 może być reprezentowana przez zero, jeden lub więcej zer.
Dennis

Odpowiedzi:

5

Galaretka , 8 bajtów

0,1xŒ!ḄQ

Wypróbuj online!

Jak to działa

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
źródło
To imponujące ... Czy na rynku programowania jest dużo J? Zauważyłem, że Jelly opiera się na tym?
WallyWest,
1
Ma bazę użytkowników w niektórych konkretnych aplikacjach (głównie matematyka / statystyka), ale szczerze mówiąc nie wiem. Nie używałem J poza golfem kodowym.
Dennis,
@WallyWest Nie jest często wymagane, ponieważ najlepiej nadaje się do środowiska, które skorzystałoby z programowania funkcjonalnego. Zwykle tylko w przypadku bardzo specjalistycznego programowania.
Conor O'Brien
7

Python, 60 bajtów

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

Przetestuj na Ideone .

Jak to działa

Wszystkie liczby dodatnie, które mogą być reprezentowane binarnie za pomocą x zer i y , są wyraźnie mniejsze niż 2 x + y , ponieważ kanoniczna reprezentacja binarna tych ostatnich ma x + y + 1 cyfr.

Lambda po prostu iteruje po liczbach całkowitych w [0, 2 x + y ) i utrzymuje wszystkie liczby całkowite n w tym zakresie, które mają y . Ponieważ n <2 x + y można przedstawić za pomocą x (lub mniej) zer.

Dennis
źródło
5

Mathematica, 59 57 bajtów

Zwykły wynik w przypadku Mathematica: funkcje wysokiego poziomu = dobre, długie nazwy funkcji = złe.

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

Join[0&~Array~#,1&~Array~#2]tworzy listę z poprawną liczbą 0s i 1s. Permutationsgeneruje wszystkie permutacje z tej listy, bez powtórzeń (jak się dowiedziałem) i posortowane. #+##&~Fold~#(wersja z golfową wersją #~FromDigits~2) konwertuje listę cyfr o podstawie 2 na liczbę całkowitą, którą reprezentują.

Poprzednia wersja, przed komentarzem Martina Endera:

#~FromDigits~2&/@Permutations@Join[0&~Array~#,1&~Array~#2]&
Greg Martin
źródło
1
Niemniej jednak, dobrze obserwowane i udokumentowane ... Mathematica świetnie nadaje się do
łamania
1
FromDigitszwykle można skrócić:#+##&~Fold~#&/@Permutations...
Martin Ender
@MartinEnder: Rozumiem! i zobacz, jak uogólnić na inne bazy. Dziękuję za nauczenie mnie tego sprytnego idiomu.
Greg Martin
1
Kredyty za wymyślenie tego idą do alephalpha . ;)
Martin Ender
1
Okazuje się, że przejście na podejście Dennisa jest krótsze:Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
Martin Ender
5

CJam ( 15 14 bajtów)

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

Jest to anonimowy blok (funkcja), który pobiera dane wejściowe jako tablicę [number-of-ones number-of-zeros]i zwraca dane wyjściowe jako tablicę.

Demo online


Daleko od znaku, ale bardziej interesujące : jest to bez wbudowanych permutacji lub konwersji podstawowej:

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

Działałoby to ładnie, gdy rozwija się GolfScript.

Peter Taylor
źródło
Starałem się zastąpić ee{)*}/czymś użyciu .*i wymyślił tego rozwiązania 14-bajtowy: wygląda trochę nieefektywne teraz chociaż. {As.*s:~e!2fb}s:~
Martin Ender
1
@MartinEnder, tak naprawdę zacząłem od .*i zdecydowałem, że eeto ładniejsze niż np 2,:a.*e_. Nie zdawałem sobie jednak sprawy, że e!da to ten sam wynik niezależnie od kolejności argumentów.
Peter Taylor,
4

Japt , 16 bajtów

'0pU +'1pV)á mn2

Przetestuj online!

Jak to działa

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

Alternatywna wersja, 17 bajtów

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

Próbowałem dalej grać w golfa w obu wersjach, ale po prostu nie mogę znaleźć luzu ...

ETHprodukcje
źródło
To wygląda niesamowicie ... i działa świetnie! Czy interpreter nie pokazuje kodu po prawej stronie? Chciałbym zobaczyć, jak to renderuje?
WallyWest,
@WallyWest transpiluje z grubsza do ("0".p(U)+"1".p(V)).á().m("n",2); każda z .x()funkcji jest zdefiniowana w pliku źródłowym .
ETHprodukcje
3

Rubinowy, 63 bajty

Prosta implementacja. Sugestie dotyczące gry w golfa mile widziane.

->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
źródło
3

Pyth - 11 bajtów

{iR2.psmVU2

Pakiet testowy .

{                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
źródło
2

Python 2 - 105 99 bajtów

+8 bajtów, ponieważ nasze dane wyjściowe muszą zostać posortowane

lambda x,y:sorted(set(int("".join(z),2)for z in __import__('itertools').permutations("0"*x+"1"*y)))
Jeremy
źródło
Imponująca edycja!
WallyWest,
1
Dzięki, nie miałem pojęcia, że ​​możesz importować moduły do ​​funkcji lambda.
Jeremy,
Zawsze myślałem, że możesz mieć oddzielne oświadczenie importowe dla celów golfa. (Oczywiście nadal musisz podać jego długość.) Może to zaoszczędzić bajt lub dwa?
Neil
2

Mathematica, 47 bajtów

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

Funkcja bez nazwy, która przyjmuje dwa argumenty: liczbę 1s, liczbę 0s.

Zasadniczo port rozwiązania Dennisa w Pythonie . Tworzymy zakres od 0do, a następnie zachowujemy tylko te liczby, których liczba bitów jest równa pierwszej wartości wejściowej. Najciekawszym bitem jest prawdopodobnie ten, który używa magii sekwencji, aby uniknąć nawiasów wokół dodania dwóch argumentów.2x+y-112^+##

Martin Ender
źródło
2

MATLAB 57 + 6

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

uruchom za pomocą

ans(2,3)

bez golfa

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
źródło
1
Do czego służy 6 bajtów?
mbomb007,
Już miałem zapytać o to samo
WallyWest,
2

MATL , 9 bajtów

y+:<Y@XBu

Wypróbuj online!

Wyjaśnienie

Podejście jest podobne do tego w odpowiedzi Dennisa „Galaretka” .

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
źródło
1

Właściwie 21 bajtów

Port mojej odpowiedzi Ruby . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

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

Jak to działa

          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
źródło
1

Groovy 74 bajty, 93 bajty lub 123 bajty

Nie wiem, który z nich uważasz za pełniejszy, odpowiada na pytanie, ale ...

74 bajtowe rozwiązanie

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

Za wkład 1,2 otrzymujesz:

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

93 bajtowe rozwiązanie

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

Za wkład 1,2 otrzymujesz:

[101, 011, 110]

123 bajtowe rozwiązanie

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

Za wkład 1,2 otrzymujesz:

[5, 3, 6]

Wypróbuj tutaj:

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

Urna Magicznej Ośmiornicy
źródło
Liczę 123 bajtowe rozwiązanie, ponieważ odpowiada to typowi wyjścia wymienionemu w skrócie. Dobra robota.
WallyWest,
1

JavaScript (Firefox 48), 85 76 74 71 70 bajtów

Zaoszczędź 3 bajty dzięki @Neil.

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

Rozumienia tablic są niesamowite. Szkoda, że ​​nie dostali się jeszcze do oficjalnej specyfikacji ECMAScript.

JavaScript (ES6), 109 87 79 78 71 70 bajtów

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

Powinien działać teraz we wszystkich przeglądarkach zgodnych z ES6. Zapisano 7 bajtów na tym, również dzięki @Neil.

ETHprodukcje
źródło
Uh, @ETHProductions, z jakiegoś powodu wracam undefinedteraz z każdym uruchomieniem testowym ...?
WallyWest,
@WallyWest Upewnij się, że najpierw przypisujesz ją do zmiennej, np. f=(m,n)=>...Następnie nazywaj ją jak f(3,2). Jeśli tak robisz, jakiej przeglądarki używasz?
ETHprodukcje
Chrome 52 ... Nie mam firefoxa na tym komputerze, więc mogłem przetestować tylko wersję ES6
inną
Próbuję uruchomić go w konsoli przeglądarki.
WallyWest,
Och, hmm. Widzę ten problem również w Chrome. Wypróbuj tę evalwersję bez ((robi dokładnie to samo, ale 3 bajty dłużej):(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

na podstawie odpowiedzi @carusocomputing

jego 123 bajtowe rozwiązanie można skompresować do 80 bajtów:

80-bajtowe rozwiązanie

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

Za wkład 1,2 otrzymujesz:

[5, 3, 6]
norganos
źródło
1

C (gcc) , 72 68 bajtów

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

Wypróbuj online!

Niestety nie ma popcount () w standardowej bibliotece, ale jest ona udostępniana przez GCC jako „funkcja wbudowana”. Dane wyjściowe są sortowane, ale w odwrotnej kolejności.

Dzięki @ceilingcat za golenie 4 bajtów!

G. Sliepen
źródło
Nadal do zaakceptowania. Dobra robota!
WallyWest,
0

PHP, 80 lub 63 bajty

w zależności od pogody muszę użyć $argvlub mogę użyć $xi $yzamiast tego.

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

drukuje wszystkie pasujące liczby w malejącej kolejności, rozdzielone znakami podkreślenia.
nazwa pliku nie może zaczynać się cyfrą.

brak wbudowanych, 88 lub 71 bajtów

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

dodaj jeden bajt dla każdego znaku podkreślenia po każdej liczbie.

@WallyWest: Miałeś rację. Zapisuje dla mnie 3 bajtyfor($i=-1;++$i<...;)

Tytus
źródło
0

Perl 6 ,  64 62  49 bajtów

{(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}}

Wyjaśnienie:

# 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
źródło