세트의 N 번째 서브 세트


13

작업

주어진 세트

S=[1,2,3,4,5,6,7,8]

그리고 정수

0N<2|S|

N 번째 부분 집합을 찾으십시오.

입출력

N 은 stdin에서 부호없는 정수로 제공됩니다. 당신은 당신의 언어에 적합한 형식으로 N 번째의 부분 집합을 인쇄해야합니다 (이 포함 [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3등 오래는 사람이 읽을 수있는만큼 텍스트 형식).

서브셋에 대해 조금

기본 2의 부분 집합과 숫자 사이에는 관계가 있습니다. 각 숫자 는 세트 의 i 번째 요소가 서브 세트 내에 있는지 여부를 지정합니다 . 예를 들어 00000000 은 빈 세트이고 10000001 은 (마지막 및 첫 번째 요소)를 포함하는 서브 세트 입니다. 숫자를 밑수 2로 변환하여 N 번째 부분 집합을 얻은 다음 부분 집합에 모든 요소가 포함됩니다 . 따라서 세 번째 하위 집합 (3 = 00000011)에는가 포함 됩니다. 가장 오른쪽 숫자는 숫자 # 0입니다. 인쇄해도됩니다 . 세트를 정렬 할 필요는 없습니다.

di
d i > 0[1,8]
di>0
[1,2][2,1]

부록 :

예, 세트는로 고정되어 1..8있습니다. 세트는 입력의 일부가 아닙니다. 입력은 단지 N 입니다.

예, 대체 입력 양식을 사용할 수 있습니다.

모든 N에 대한 모든 예상 출력 : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
세트가 구체적 1으로 8설정되어 있습니까, 아니면 세트입니까?
조 왕

2
아무도 전에 묻지 않은 것에 놀랐습니다. 입력을 인수로 사용하고 언어가 stdin을 사용하도록 강요하지 않는 제출물로 함수를 허용하는 것이 친절합니까? 문제는 하위 집합에 관한 것이며 입력을 다루지 않습니다.
ბიმო

5
자신의 솔루션이 올바른지 모든 사람에게 알릴 필요는 없습니다. 그렇지 않은 경우 알도록 제한 할 수 있습니다.
ბიმო

1
세트가 1..8 로 제한 되므로 , 출력 "123"은 명확합니다. 유효합니까?
Arnauld

2
[1,8] 대신 0 인덱스 [0,7]을 사용할 수 있습니까?
Outgolfer Erik

답변:


17

젤리 , 3 바이트

BUT

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

작동 원리

BUT  Main link. Argument: n

B    Binary; convert n to base 2.
 U   Upend; reverse the resulting array, so it starts with the LSB.
  T  Truth; find all 1-based indices of set bits.

5
하지만 근데 ...?!
Arnauld

2
@Arnauld 그러나 모든 것이 거짓말입니다! 모든 것이 바이너리라고 생각합니까? 음 ... 있음을 뒤집어은 진실입니다! 따라서 모든 것이 이진은 아닙니다. 회색 영역에 오신 것을 환영합니다!
Outgolfer Erik





2

K4 , 7 바이트

해결책:

1+&|2\:

예:

처음 10 ...

q)k)(1+&|2\:)@'!10
`long$()
,1
,2
1 2
,3
1 3
2 3
1 2 3
,4
1 4

설명:

1+&|2\: / the solution
    2\: / convert to base-2
   |    / reverse
  &     / indices where true
1+      / add 1


2

apt, 7 바이트

ì2 Ôi ð

시도 해봐

ì2          :Convert to base-2 digit array
   Ô        :Reverse
    i       :Prepend null element
      ð     :0-based indices of truthy elements

¤¬²Ôð¥1

시도 해봐

¤           :Convert to base-2 string
 ¬          :Split
  ²         :Push 2
   Ô        :Reverse
    ð       :0-based indices of elements
     ¥1     :  Equal to 1


1

하스켈 , 55 54 바이트

s n=[x|(x,d)<-zip[8,7..]$mapM(pure[0,1])[1..8]!!n,d>0]

세트를 역순으로 출력하고 온라인으로 시도하십시오!

일반 버전, 56 바이트

{i}i=18

s n=[x|(x,d)<-zip[n,n-1..]$mapM(pure[0,1])[1..n]!!n,d>0]

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

설명

이 용어 mapM (pure [0,1]) [1..n]는 목록 ( n=4)을 생성합니다 [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]. 즉. 의 이진 표현 [0..2^n-1]. 로 인덱싱 n하면의 이진 표현이 제공 n됩니다.

이제 우리는 zip숫자를 뒤집어서 [1..n]이진수가 0이 아닌 요소 만 유지할 수 있습니다.

 [ x | (x,digit) <- zip [n,n-1,..1] binaryRepN, digit > 0 ]

1

, 11 바이트

↓⭆⮌↨N²×ιI⊕κ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 공백없이 답을 가로로 인쇄 할 수 있으면 첫 번째 문자를 제거 할 수 있습니다. 설명:

    N       Input as a number
   ↨        Converted to base
     ²      Literal 2
  ⮌         Reversed
 ⭆          Map over bits and join
          κ Current index (0-indexed)
         ⊕  Incremented
        I   Cast to string
       ι    Current bit
      ×     Repeat string
↓           Print vertically








0

파이썬 3.6, 58 바이트

f=lambda n:[8-v for v,i in enumerate(f'{n:08b}')if int(i)]





0

Oracle SQL, 77 바이트

select*from(select rownum r,value(p)from t,table(powermultiset(x))p)where:n=r

SQL Plus에서 테스트

SQL> var n number
SQL> exec :n:=67;

PL/SQL procedure successfully completed.

SQL> with t as (select ku$_vcnt(1,2,3,4,5,6,7,8) x from dual)
  2  select*from(select rownum r,value(p)from t,table(powermultiset(x))p)where:n=r
  3  /
        67
KU$_VCNT('1', '2', '7')

0

MathGolf , 8 바이트

â^mÉ┤\*─

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

설명

â         Convert first input to binary list
 ^        Zip with [1,2,3,4,5,6,7,8] (other input)
  mÉ      Map 2D array using the next 3 instuctions
    ┤     Pop from right of array
     \*   Swap top two elements and repeat array either 0 or 1 times
       ─  Flatten to 1D array

대체 출력 형식

더 유연한 출력 형식 (개인적으로는 꽤 좋아 보인다고 생각합니다)을 사용하여 6 바이트를 만들 수 있습니다.

â^É┤\*

매핑 대신 암시 적 for-each를 사용하고 병합을 건너 뜁니다. 출력은 다음과 같습니다.

[1][2][][4][5][6][7][]



0

05AB1E , 6 바이트

bRSƶ0K

온라인으로 시도 하거나 가능한 모든 테스트 사례를 확인하십시오 .

설명:

b         # Convert the (implicit) integer input to binary
          #  i.e. 22 → "10110"
 R        # Reverse it
          #  i.e. "10110" → "01101"
  S       # Convert it to a list of 0s and 1s
          #  i.e. "01101" → ["0","1","1","0","1"]
   ƶ      # Multiply each with its 1-indexed index
          #  i.e. ["0","1","1","0","1"] → [0,2,3,0,5]
    0K    # Remove all 0s (and output implicitly)
          #  i.e. [0,2,3,0,5] → [2,3,5]

0

자바 8, 58 바이트

n->{for(int i=0;i<8;)if((1&n>>i++)>0)System.out.print(i);}

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

설명:

n->{                        // Method with integer as parameter and no return-type
  for(int i=0;i<8;)         //  Loop `i` in the range [0,8):
    if((1&n>>i++)>0)        //   If 1 AND `n` bitwise right-shifted to `i` is larger than 0
                            //   (with `i` increased by 1 afterwards with `i++`)
      System.out.print(i);} //    Print `i+1`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.