Tập con thứ n của một tập hợp


13

Nhiệm vụ

Đưa ra bộ

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

và một số nguyên

0N<2|S|

tìm tập con Nth.

Đầu ra đầu vào

N được cho dưới dạng một số nguyên không dấu trên stdin. Bạn phải in các tập hợp con thứ N trong một định dạng thích hợp cho ngôn ngữ của bạn (điều này có thể bao gồm [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3vv cho miễn là nó là một người đọc được văn bản định dạng).

Một chút về tập con

Có một mối quan hệ giữa các tập con và số trong cơ sở hai. Mỗi chữ số

di
chỉ định xem phần tử thứ i của tập hợp có nằm trong tập hợp con hay không. Ví dụ 00000000 sẽ là tập hợp trống và 10000001 là tập hợp con chứa [1,8](phần tử cuối cùng và đầu tiên). Bạn nhận được tập con Nth bằng cách chuyển đổi số thành cơ sở 2 và sau đó tập hợp con bao gồm tất cả các phần tử trong đó
di>0
. Do đó, tập hợp con thứ 3 (3 = 00000011) [1,2]. Chữ số ngoài cùng bên phải là chữ số # 0. Bạn có thể in[2,1] . Các tập hợp không phải được sắp xếp.

Phụ lục:

Có, bộ được cố định 1..8. Bộ này không phải là một phần của đầu vào. Đầu vào chỉ là N .

Có, bạn có thể sử dụng các hình thức đầu vào thay thế.

Tất cả các kết quả đầu ra dự kiến ​​cho tất cả N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
Là tập đặc biệt 1để 8, hoặc là nó bất kỳ tập?
Jo King

2
Tôi ngạc nhiên không ai hỏi trước đây: Bạn có tử tế khi cho phép các hàm dưới dạng đệ trình lấy đầu vào làm đối số và không ép buộc các ngôn ngữ sử dụng stdin (điều mà một số không thể)? Câu hỏi là về tập hợp con và không đấu tranh với đầu vào.
ბიმო

5
Bạn không cần phải nói cho mọi người biết giải pháp của họ có đúng hay không, bạn có thể hạn chế tự nói khi không.
24/11/18

1
Vì tập hợp được giới hạn ở 1..8 , một đầu ra như vậy "123"sẽ không rõ ràng. Có hợp lệ không?
Arnauld

2
Chúng tôi có thể sử dụng 0-indexed [0,7] thay vì [1,8] không?
Erik the Outgolfer 24/11/18

Câu trả lời:


17

Thạch , 3 byte

BUT

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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
Nhưng nhưng nhưng...?!
Arnauld

2
@Arnauld NHƯNG mọi thứ đều là dối trá! Bạn nghĩ mọi thứ là nhị phân, nhỉ? Vâng ... đó upended là những thử thách! Vì vậy, không, tất cả mọi thứ là nhị phân. Chào mừng đến với khu vực màu xám!
Erik the Outgolfer

7

R , 52 26 byte

which(intToBits(scan())>0)

Hãy thử trực tuyến!

Chuyển đổi đầu vào thành các bit của nó và trả về các chỉ số dựa trên 1 về vị trí của chúng TRUE. Điều đó làm cho đây là một cảng của câu trả lời Dennis 'Jelly .

Trả về integer(0), danh sách số nguyên trống, cho đầu vào của 0.


Mặc dù câu trả lời này không chứa IF, AND hoặc BUT.
ngm




2

K4 , 7 byte

Giải pháp:

1+&|2\:

Thí dụ:

10 ...

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

Giải trình:

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


2

Japt, 7 byte

ì2 Ôi ð

Thử nó

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

¤¬²Ôð¥1

Thử nó

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


1

Haskell , 55 54 byte

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

Xuất ra các thiết lập theo thứ tự đảo ngược, thử trực tuyến!

Phiên bản chung, 56 byte

Điều này sẽ làm việc cho các bộ lớn hơn {Tôi}Tôi= =1số 8:

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

Hãy thử trực tuyến!

Giải trình

Thuật ngữ mapM (pure [0,1]) [1..n]tạo danh sách ( n=4) [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]- tức là. các đại diện nhị phân của [0..2^n-1]. Lập chỉ mục vào nó nmang lại cho chúng ta biểu diễn nhị phân củan .

Bây giờ chúng ta có thể chỉ zipnó với các số đảo ngược [1..n]và chỉ giữ các phần tử trong đó chữ số nhị phân khác không:

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

1

Than , 11 byte

↓⭆⮌↨N²×ιI⊕κ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Nếu in câu trả lời theo chiều ngang mà không có khoảng trắng được chấp nhận thì ký tự đầu tiên có thể được loại bỏ. Giải trình:

    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

Oracle SQL, 77 byte

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

Kiểm tra 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 byte

â^mÉ┤\*─

Hãy thử trực tuyến!

Giải trình

â         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

Định dạng đầu ra thay thế

Với định dạng đầu ra linh hoạt hơn (mà cá nhân tôi nghĩ trông khá tốt) tôi có thể đưa ra một 6 -terter:

â^É┤\*

Thay vì ánh xạ, tôi sử dụng ẩn cho mỗi, và tôi bỏ qua việc làm phẳng. Đầu ra trông như thế này:

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



0

05AB1E , 6 byte

bRSƶ0K

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm có thể .

Giải trình:

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

Java 8, 58 byte

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

Hãy thử trực tuyến.

Giải trình:

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`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.