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

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.

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.


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

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.


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


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

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

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

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


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

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

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.

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


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.


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]

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!


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


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.