십진수에 대한 모든 이진 조합


12

기권

이 질문의 중복없는 이 질문에 . 초기 매개 변수에 이미 설정된 숫자가 있으므로 특정 숫자를 세지 않습니다. 이 질문은 제공된 숫자를 기준으로 이진 문자열로 구성 할 수있는 10 진수에 중점을 둡니다.

도전

주어 두 정수 XY, 제로의 개수를 나타내는 ( 0)과 1 ( 1)는 각각 전용 제로 제공된 것들을 사용하여 이진 스트링을 생성로부터 결정될 수있는 모든 가능한 소수 당량을 계산하여 출력으로 그들을 표시.

예 1 :

입력: 0 1

산출: 1

설명 : 한 1가지만 설명 할 수 있으며 한 방향으로 만 변환 할 수 있습니다.

예 2 :

입력: 1 1

산출: 1,2

설명 : 011로 10변환하고 2로 변환합니다.

예 3 :

입력: 3 2

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

설명 : 3 0과 2 100011(3), 00101(5), 00110(6), 01001(9), 01010(10), 01100(12), 10001(17), 10010(18), 10100(20), 11000(24)를 만듭니다.

제한 및 규칙

  • 0 < X + Y <= 16출력의 최대 숫자는 16 1초 (예 : 매개 변수 0및) 에서만 발생할 수 있는 코드 만 작동 할 것으로 기대합니다 16.
  • 위의 제한으로 인해 출력에서 ​​기대할 수있는 숫자의 범위는 065535입니다.
  • 결과 출력이 제공되는 한 쉼표로 구분 된 목록, 배열, STDOUT으로 출력 된 목록 등 여부에 관계없이 함수 또는 코드를 수락합니다. 출력에 대해 강조해야하는 유일한 기준은 출력을 정렬 해야한다는 것입니다.
  • 이것은 코드 골프이며, 최소 바이트는 최대 영광을 얻습니다.
  • 우리는 바보 허점을 용납하지 않습니다

1
출력을 정렬해야합니까?
Dennis

안녕 @ 데니스, 예, 언급을 잊어 버렸습니다 ... 출력을 정렬해야합니다. 그에 따라 규칙을 업데이트했습니다.
WallyWest

2
사건을 처리해야 0 0합니까?
ETHproductions

@ETHproductions 위에서 언급 한 것은 0 <= X + Y <= 16그렇기 때문에 0 0해당 규칙을 충족하는 유효한 입력으로 간주 되기 때문 입니다.
WallyWest

2
이 경우 예상되는 결과는 0 0무엇입니까? 숫자 0 은 0, 하나 이상의 0으로 표시 될 수 있습니다.
Dennis

답변:


5

젤리 , 8 바이트

0,1xŒ!ḄQ

온라인으로 사용해보십시오!

작동 원리

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.

이것은 꽤 인상적입니다 ... 일반 프로그래밍 시장에서 J를 많이 요구합니까? 젤리가 그것을 기반으로 한 것을 알았습니까?
WallyWest

1
특정 응용 프로그램 (주로 수학 / 통계)에 사용자 기반이 있지만 솔직히 모르겠습니다. 코드 골프 외부에서 J를 사용하지 않았습니다.
Dennis

@WallyWest 함수형 프로그래밍의 이점이있는 환경에 가장 적합하기 때문에 자주 호출되지 않습니다. 일반적으로 매우 전문화 된 프로그래밍에만 해당됩니다.
Conor O'Brien

7

파이썬, 60 바이트

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

Ideone에서 테스트하십시오 .

작동 원리

x 0과 y 1 로 2 진수로 표현할 수있는 모든 양수 는 2 x + y 보다 분명히 작습니다 . 후자의 표준 이진 표현에는 x + y + 1 자리 가 있기 때문 입니다.

람다는 단순히 [0, 2 x + y ) 의 정수를 반복 하고 모든 정수 ny 범위의 해당 범위에 유지 합니다. 이후 N <2 X + Y는 로 표현 될 수있다 (X) (이하) 제로.


5

Mathematica, 59 57 바이트

Mathematica의 일반적인 결과 : 고급 기능 = 양호, 긴 기능 명 = 불량

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

Join[0&~Array~#,1&~Array~#2]올바른 0s와 1s 의 목록을 만듭니다 . Permutations반복하지 않고 (내가 배운대로) 정렬 된 순서로 해당 목록의 모든 순열을 생성합니다. #+##&~Fold~#(golfuscated 버전의 #~FromDigits~2)는 밑이 2 인 자릿수를 나타내는 정수로 변환합니다.

Martin Ender의 의견 이전의 이전 버전 :

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

1
수없는 코드 골프에 대한 좋은으로, 재정에 대한 그럼에도 불구하고 잘 관찰하고 기록 ... 티카는 중대하다 ... 음, 시간의 일부 ...
WallyWest

1
FromDigits#+##&~Fold~#&/@Permutations...
Martin Ender

@MartinEnder : 알겠습니다! 다른 기지로 일반화하는 방법도 참조하십시오. 이 영리한 관용구를 가르쳐 주셔서 감사합니다.
Greg Martin

1
그것에 대한 크레딧은 alephalpha로 이동합니다 . ;)
Martin Ender

1
그러나 Dennis의 접근 방식으로 전환하는 것이 더 짧다는 것이 밝혀졌습니다 .Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
Martin Ender

5

CJam ( 15 14 바이트)

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

이것은 익명 블록 (함수)으로, 입력을 배열로 받아서 [number-of-ones number-of-zeros]출력을 배열 로 반환합니다.

온라인 데모


멀리 떨어져 있지만 더 흥미로운 점은 순열 내장이나 기본 변환이 없다는 것입니다.

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

GolfScript가 전개 될 때 잘 작동합니다.


나는 대체려고 ee{)*}/뭔가 사용하여 .*이 14 바이트 솔루션을 내놓았다 : {As.*s:~e!2fb}(가) s:~지금은 비록 비효율적 조금 보인다.
Martin Ender

1
@MartinEnder, 나는 실제로 시작하여 .*그것이 ee예보다 더 좋다고 결정했습니다 2,:a.*e_. 나는 e!그것이 논쟁의 순서에 관계없이 동일한 결과를 줄 것이라는 것을 알지 못했습니다 .
피터 테일러


4

Japt , 16 바이트

'0pU +'1pV)á mn2

온라인으로 테스트하십시오!

작동 원리

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

대체 버전, 17 바이트

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

두 가지 버전 모두 더 골프를 시도했지만 슬랙을 찾을 수 없습니다 ...


이것은 훌륭해 보입니다 ... 그리고 훌륭하게 작동합니다! 그러나 통역사가 번역 된 코드를 오른쪽에 표시하지 않습니까? 렌더링 방식을보고 싶습니다.
WallyWest

@WallyWest 대략적으로 다음을 번역합니다 ("0".p(U)+"1".p(V)).á().m("n",2). 각 .x()기능은 소스 파일에 정의되어 있습니다 .
ETHproductions

3

루비, 63 바이트

간단한 구현. 골프 제안을 환영합니다.

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

언 골핑

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 바이트

{iR2.psmVU2

테스트 스위트 .

{                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

파이썬 2-105 99 바이트

+8 바이트이므로 출력을 정렬해야합니다.

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

인상적인 편집!
WallyWest

1
고맙게도 람다 함수로 모듈을 가져올 수 있다는 것을 몰랐습니다.
Jeremy Jeremy

저는 항상 코드 골프 목적으로 별도의 수입 명세서를 가질 수 있다고 생각했습니다. (분명히 길이를 포함해야합니다.) 이렇게하면 1 ~ 2 바이트를 절약 할 수 있습니까?

2

수학, 47 바이트

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

명명되지 않은 함수는 1s의 수, s의 두 인수 를 사용 0합니다.

본질적으로 Dennis의 Python 솔루션 포트입니다 . 우리의 범위 생성 0에를 그 양의 그 숫자 계속 다음과 -bits 첫 번째 입력과 동일합니다. 가장 흥미로운 비트는 아마도 두 개의 인수를 추가하는 괄호를 피하기 위해 일부 시퀀스 매직 을 사용 하는 것입니다.2x+y-112^+##


2

MATLAB 57 + 6

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

사용하여 실행

ans(2,3)

언 골프

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
플러스 6 바이트는 얼마입니까?
mbomb007

나는 같은 것을 물어 보려고했다
WallyWest

2

MATL , 9 바이트

y+:<Y@XBu

온라인으로 사용해보십시오!

설명

이 접근법은 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

실제로 21 바이트

내 루비 답변 의 포트 . 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

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

작동 원리

          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

그루비 74 바이트, 93 바이트 또는 123 바이트

어느 것이 당신이 질문에 더 완전히 대답한다고 생각하는지 모르겠지만 ...

74 바이트 솔루션

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

1,2의 입력에 대해 다음을 얻습니다.

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

93 바이트 솔루션

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

1,2의 입력에 대해 다음을 얻습니다.

[101, 011, 110]

123 바이트 솔루션

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

1,2의 입력에 대해 다음을 얻습니다.

[5, 3, 6]

여기서 사용해보십시오.

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


이것은 123 바이트 솔루션을 계산합니다.이 내용은 요약에서 언급 한 출력 유형과 일치합니다. 잘 했어.
WallyWest

1

자바 스크립트 (Firefox 48), 85 76 74 71 70 bytes

@Neil 덕분에 3 바이트가 절약되었습니다.

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

배열 이해력은 훌륭합니다. 그들은 아직 공식 ECMAScript 사양으로 만들지 못했습니다.

자바 스크립트 (ES6), 109 87 79 78 71 70 바이트

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

모든 ES6 호환 브라우저에서 작동합니다. @Neil 덕분에 이것에 7 바이트를 절약했습니다.


어, @ETHProductions, 어떤 이유로 든 내가 undefined하고있는 모든 테스트를 할 때마다 다시 돌아 오는 중 ...?
WallyWest

당신이 첫번째 예를 들어, 변수에 할당하고 있는지 확인 @WallyWest f=(m,n)=>..., 다음과 같이 호출 f(3,2). 그것이 당신이하고있는 일이라면 어떤 브라우저를 사용하고 있습니까?
ETHproductions

Chrome 52 ...이 컴퓨터에는 파이어 폭스가 없으므로 ES6 비 파이어 폭스 버전 만 테스트 할 수 있습니다 ...
WallyWest

브라우저 콘솔에서 실행하려고합니다.
WallyWest

흠. Chrome에서도 문제가 발생합니다. 이 eval-less 버전을 사용해보십시오 (정확히 동일한 작업이지만 3 바이트 더 길어짐) :(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

그루비 80 바이트

@carusocomputing의 답변을 바탕으로

그의 123 바이트 솔루션은 80 바이트로 압축 될 수 있습니다.

80 바이트 솔루션

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

1,2의 입력에 대해 다음을 얻습니다.

[5, 3, 6]

1

C (gcc) , 72 68 바이트

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

온라인으로 사용해보십시오!

불행히도 표준 라이브러리에는 popcount ()가 없지만 GCC에 의해 "내장 함수"로 제공됩니다. 출력은 정렬되지만 역순으로 정렬됩니다.

4 바이트를 줄인 @ceilingcat에게 감사드립니다!


여전히 허용됩니다. 잘 하셨어요!
WallyWest

0

PHP, 80 또는 63 바이트

내가 사용합니다 어떠했는지에 따라 $argv또는 사용 $x하고 $y대신.

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

밑줄로 구분 된 모든 일치하는 숫자를 내림차순으로 인쇄합니다.
filename은 숫자로 시작해서는 안됩니다.

내장되지 않은 88 또는 71 바이트

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

모든 숫자 다음에 하나의 밑줄에 대해 하나의 바이트를 추가하십시오.

@WallyWest : 네 말이 맞아. 나를 위해 3 바이트를 저장합니다for($i=-1;++$i<...;)


0

펄 6 ,  64 62  49 바이트

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

설명:

# 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.