Tüm İkili Kombinasyonlar Ondalık


12

feragat

Bu soru, bu sorunun bir kopyası değil . Zaten ilk parametrelerde ayarlanmış olduğundan, belirli basamakları saymıyorum. Bu soru, sağlanan rakamlara göre ikili dizelerden oluşturulabilecek ondalık sayılara odaklanmaktadır.

Meydan okuma

İki tamsayı verildiğinde Xve sırasıyla Ysıfır ( 0) ve birler ( ) sayısını temsil ederek 1, yalnızca sağlanan sıfırları ve olanları kullanarak ikili dizeler oluşturmaktan tespit edilebilen tüm olası ondalık eşdeğerlerini hesaplayın ve çıktı olarak görüntüleyin.

Örnek 1:

Giriş: 0 1

Çıktı: 1

Açıklama: Hesaplanacak yalnızca bir tanesi 1, bu yalnızca bir yöne dönüştürülebilir.

Örnek 2:

Giriş: 1 1

Çıktı: 1,2

Açıklama: 011'e, 102'ye dönüştürür.

Örnek 3:

Giriş: 3 2

Çıktı: 3,5,6,9,10,12,17,18,20,24

Açıklama: Üç 0s ve iki 1s yapmak 00011(3), 00101(5), 00110(6), 01001(9), 01010(10), 01100(12), 10001(17), 10010(18), 10100(20), 11000(24)

Sınırlamalar ve Kurallar

  • Kodunuzun 0 < X + Y <= 16yalnızca çıktıdaki maksimum sayının sadece 16 1saniyeden, yani parametreler 0ve 16.
  • Yukarıdaki sınırlamanın bir sonucu olarak, çıktıda beklediğimiz sayı aralığı 0ve arasındadır 65535.
  • Bu çıkış o ilgili vurgulamak gerekir vb sadece kriterleri virgülle ayrılmış listesi, bir dizi, STDOUT çıkışı listesi, olsun, sonuçta ortaya çıkan çıkış sağlanan gibi, işlevleri veya kod kabul gerekir sıralanabilir.
  • Bu kod golf, minimum bayt maksimum zafer alacak.
  • Aptal boşlukları tolere etmeyeceğiz

1
Çıktının sıralanması gerekiyor mu?
Dennis

Merhaba @Dennis, evet, bahsetmeyi unuttum ... çıktı sıralanmalıdır. Kuralları buna göre güncelledim.
WallyWest

2
Davayı ele almamız gerekiyor 0 0mu?
ETHproductions 7:16

@ETHproductions Yukarıda bahsettiğim 0 <= X + Y <= 16, bu yüzden evet, çünkü 0 0bu kuralı karşılayan geçerli girdi olarak kabul edilir.
WallyWest

2
Bu durumda beklenen çıktı ne için 0 0? 0 sayısı sıfır, bir veya daha fazla sıfır ile temsil edilebilir.
Dennis

Yanıtlar:


5

Jöle , 8 bayt

0,1xŒ!ḄQ

Çevrimiçi deneyin!

Nasıl çalışır

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.

Bu oldukça etkileyici ... J genel programlama pazarında çok fazla çağrı var mı? Jelly'in buna dayandığını fark ettim mi?
WallyWest

1
Bazı belirli uygulamalarda (çoğunlukla matematik / istatistik) bir kullanıcı tabanına sahiptir, ancak dürüstçe bilmiyorum. J kodu golf dışında kullanmadım.
Dennis

@WallyWest İşlevsel programlamadan yararlanacak bir ortam için en uygun ortam olduğu için sık kullanılmaz. Genellikle sadece çok özel programlama için.
Conor O'Brien

7

Python, 60 bayt

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

Ideone üzerinde test edin .

Nasıl çalışır

İkili x sıfır ve y olanlar ile gösterilebilen tüm pozitif sayılar 2 x + y'den açıkça küçüktür , çünkü ikincisinin kanonik ikili gösterimi x + y + 1 basamağa sahiptir.

Lambda basitçe [0, 2 x + y ) içindeki tamsayılar üzerinde yinelenir ve tüm tamsayıları n olan bu aralıkta y değerini tutar. Yana n <2 , x + y ile temsil edilebilir x (veya daha az) sıfır.


5

Mathematica, 59 57 bayt

Mathematica ile olağan bir sonuç: üst düzey işlevler = iyi, uzun işlev adları = kötü.

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

Join[0&~Array~#,1&~Array~#2]doğru sayıda 0s ve 1s içeren bir liste oluşturur . Permutationsbu listenin tüm permütasyonlarını tekrar etmeden (öğrendiğim gibi) ve sıralı olarak oluşturur. #+##&~Fold~#(golfuscated sürümü #~FromDigits~2), baz 2 basamaklı bir listeyi temsil ettikleri tamsayıya dönüştürür.

Önceki versiyon, Martin Ender'in yorumundan önce:

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

1
Yine de, iyi gözlemlenmiş ve belgelenmiş ... Mathematica, kod golf için iyi değil, sayı çatırtı için harika ... iyi, bazen ...
WallyWest

1
FromDigitsgenellikle kısaltılabilir:#+##&~Fold~#&/@Permutations...
Martin Ender

@MartinEnder: Anladım! ve diğer üslere nasıl genelleştirileceğini de görebilirsiniz. Bana bu akıllı deyimi öğrettiğiniz için teşekkür ederim.
Greg Martin

1
Onunla gelmek için krediler alephalpha'ya gider . ;)
Martin Ender

1
Ancak Dennis'in yaklaşımına Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
Martin Ender

5

CJam ( 15 14 bayt)

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

Bu, girdiyi dizi olarak alan [number-of-ones number-of-zeros]ve çıktıyı dizi olarak döndüren anonim bir bloktur (işlev) .

Çevrimiçi demo


İşaretten çok uzak, ama daha ilginç : bu permütasyon yerleşikleri veya taban dönüşümü olmadan:

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

Bir GolfScript'in ortaya çıkmasıyla iyi çalışır.


Ben değiştirmeye çalışıyordum ee{)*}/şey kullanarak .*ve bu 14 bayt çözüm geldi: Şimdi olsa verimsiz biraz görünüyor. {As.*s:~e!2fb}s:~
Martin Ender

1
@MartinEnder, aslında başladım .*ve bunun eeörneğin daha güzel olduğuna karar verdim 2,:a.*e_. Yine de e!, bu argümanın sırasına bakılmaksızın aynı çıktıyı vereceğini fark etmedim .
Peter Taylor


4

Japt , 16 bayt

'0pU +'1pV)á mn2

Çevrimiçi test edin!

Nasıl çalışır

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

Alternatif sürüm, 17 bayt

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

Her iki versiyonda da golf oynamaya çalışıyorum, ama herhangi bir gevşeklik bulamıyorum ...


Bu harika görünüyor ... ve harika çalışıyor! Yorumlayıcı, aktarılan kodu sağda göstermiyor mu? Nasıl sonuç verdiğini görmek isterim?
WallyWest

@WallyWest Kabaca ("0".p(U)+"1".p(V)).á().m("n",2); .x()işlevlerin her biri kaynak dosyada tanımlanır .
ETHproductions 7:16

3

Ruby, 63 bayt

Basit bir uygulama. Golf önerileri hoş geldiniz.

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

{iR2.psmVU2

Test Takımı .

{                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 bayt

+8 bayt çünkü çıktımızın sıralanması gerekiyor

lambda x,y:sorted(set(int("".join(z),2)for z in __import__('itertools').permutations("0"*x+"1"*y)))

Etkileyici düzenleme!
WallyWest

1
Teşekkürler, lambda fonksiyonlarında modül ithal edebileceğiniz konusunda hiçbir fikrim yoktu.
Jeremy

Her zaman kod golf için ayrı bir ithalat beyanı var izin olduğunu düşündüm. (Açıkçası hala uzunluğunu eklemeniz gerekiyor.) Bu size bir veya iki bayt tasarruf edebilir mi?
Neil

2

Mathematica, 47 bayt

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

İki argüman alan isimsiz bir fonksiyon: 1s sayısı, 0s sayısı .

Esasen Dennis'in Python çözümünün bir limanı . Biz bir aralık oluşturmak 0için olan miktar sadece bu sayıları tutmak sonra ve -bits ilk girişi eşittir. En ilginç kısım, muhtemelen iki argümanın eklenmesi sırasında parantezlerden kaçınmak için bir dizi sihir kullanan şeydir.2x+y-112^+##


2

MATLAB 57 + 6

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

kullanarak koş

ans(2,3)

ungolfed

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
Artı 6 bayt ne için?
mbomb007

Aynı şeyi sormak
üzereydim

2

MATL , 9 bayt

y+:<Y@XBu

Çevrimiçi deneyin!

açıklama

Yaklaşım Dennis'in Jelly cevabındakine benzer .

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

Aslında 21 bayt

Ruby cevabımın bir limanı . Golf önerileri hoş geldiniz. Çevrimiçi deneyin!

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

Nasıl çalışır

          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 Bayt, 93 Bayt veya 123 Bayt

Hangisini daha iyi düşündüğünüzü bilmiyorum ama ...

74 Bayt Çözümü

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

1,2 girişi için şunları elde edersiniz:

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

93 Bayt Çözümü

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

1,2 girişi için şunları elde edersiniz:

[101, 011, 110]

123 Bayt Çözümü

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

1,2 girişi için şunları elde edersiniz:

[5, 3, 6]

Burada deneyin:

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


Bu, kısaca belirtilen çıktı türüyle eşleştiği için 123 bayt çözümü sayıyorum. Aferin.
WallyWest

1

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

@Neil sayesinde 3 bayt kaydedildi.

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

Dizi anlayışları harika. Henüz resmi ECMAScript spesifikasyonuna girememiş olmaları çok kötü.

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

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

Şimdi ES6 uyumlu tüm tarayıcılarda çalışmalıdır. @Neil sayesinde bu konuda 7 bayt tasarruf etti.


@ETHProductions, nedense undefinedşu anda yaptığım her test çalışmasında geri dönüyorum ...?
WallyWest

@WallyWest İlk önce bir değişkene atadığınızdan emin olun, örneğin f=(m,n)=>..., şöyle çağırın f(3,2). Yaptığınız buysa, hangi tarayıcıyı kullanıyorsunuz?
ETHproductions

Chrome 52 ... Bu makinede firefox yok, bu yüzden sadece ES6 Firefox olmayan sürümünü test edebilirim ...
WallyWest

Tarayıcı konsolunda çalıştırmaya çalışıyorum.
WallyWest

Oh, hmm. Bu sorunu Chrome'da da görüyorum. Bu evalsürümü deneyin (tam olarak aynı şeyi yapar, ancak 3 bayt daha uzun):(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 Bayt

@carusocomputing tarafından verilen cevaba göre

123 Byte çözümü 80 Byte sıkıştırılabilir:

80 Bayt Çözümü

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

1,2 girişi için şunları elde edersiniz:

[5, 3, 6]

1

C (gcc) , 72 68 bayt

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

Çevrimiçi deneyin!

Ne yazık ki standart kütüphanede popcount () yoktur, ancak GCC tarafından bir "yerleşik işlev" olarak sağlanır. Çıktı sıralanır, ancak ters sıradadır.

4 baytlık tıraş için @ceilingcat'e teşekkürler!


Hala kabul edilebilir. İyi iş!
WallyWest

0

PHP, 80 veya 63 bayt

Ben kullanmalıdır Hava bağlı $argvveya kullanabilir $xve $ybunun yerine.

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

eşleşen tüm numaraları alt çizgi ile ayrılmış azalan sırada yazdırır.
dosya adı bir rakamla başlamamalıdır.

yerleşik yok, 88 veya 71 bayt

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

her sayıdan sonra yalnızca bir alt çizgi için bir bayt ekleyin.

@WallyWest: Haklıydın. Benim için 3 baytfor($i=-1;++$i<...;)


0

Perl 6 ,  64 62  49 bayt

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

Açıklama:

# 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.