セットの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 31,2,3などのために長い間、それは人間が読めるな限りテキスト形式)。

サブセットについて少し

サブセットとベース2の数値の間には関係があります。各数字

di
は、セットのi番目の要素がサブセット内にあるかどうかを指定します。たとえば、00000000は空のセットで、10000001[1,8](最後と最初の要素)を含むサブセットです。N番目のサブセットを取得するには、数値を基数2に変換すると、サブセットにすべての要素が含まれます(
di>0
。したがって、3番目のサブセット(3 = 00000011)にはが含まれます[1,2]。右端の数字は数字#0です。印刷しても構いません[2,1]。セットをソートする必要はありません。

補遺:

はい、セットはに固定されてい1..8ます。セットは入力の一部ではありません。入力はちょうどNです。

はい、別の入力フォームを使用できます。

すべてのNのすべての予想出力:https : //tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
セットには、具体的である18、またはそれはどんな設定されていますか?
ジョーキング

2
これまで誰も質問していなかったことに驚いています:入力を引数として受け取り、言語にstdin(一部はできない)の使用を強制しないサブミッションとしての機能を許可してくれませんか?問題はサブセットに関するものであり、入力をいじることではありません。
ბიმო

5
ソリューションが正しいかどうかを全員に伝える必要はありません。そうでない場合に伝えることだけに制限できます。
ბიმო

1
セットは1..8に制限されているため、このような出力"123"は明確になります。有効ですか?
アーナルド

2
[1,8]の代わりに0インデックス付き[0,7]を使用できますか?
エリックアウトゴルファー

回答:


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
しかし、しかし、しかし......!
アーナルド

2
@Arnauldしかし、すべては嘘です!すべてがバイナリだと思う?うーん...その逆さまは真実です!だから、いや、すべてがバイナリではない。灰色のエリアへようこそ!
エリックアウトゴルファー





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




1

Haskell55 54バイト

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

セットを逆順に出力します。オンライン試してください!

一般バージョン、56バイト

これは、より大きなセットで機能します {}=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]、2進数がゼロ以外の要素のみを保持できます。

 [ 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

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

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