Nset subset dari set

13

Tugas

Diberikan set

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

dan bilangan bulat

0N<2|S|

temukan himpunan bagian ke-N.

Input output

N diberikan sebagai integer tak bertanda pada stdin. Anda harus mencetak subset N dalam format yang sesuai untuk bahasa Anda (ini mungkin termasuk [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3dll selama itu adalah dibaca manusia text format).

Sedikit tentang himpunan bagian

Ada hubungan antara himpunan bagian dan angka di basis dua. Setiap digit Menentukan apakah saya th elemen dari himpunan adalah dalam subset. Misalnya 00000000 akan menjadi himpunan kosong dan 10000001 adalah himpunan bagian yang mengandung (elemen terakhir dan pertama). Anda mendapatkan subset Nth dengan mengubah angka menjadi basis 2 dan kemudian subset mencakup semua elemen di mana . Subset ke-3 (3 = 00000011) dengan demikian mengandung . Digit paling kanan adalah digit # 0. Tidak apa-apa untuk mencetak . Set tidak harus disortir.

dsaya
[1,8]
dsaya>0
[1,2][2,1]

Adendum:

Ya, set sudah diperbaiki 1..8. Set bukan bagian dari input. Input hanya N .

Ya, Anda dapat menggunakan formulir input alternatif.

Semua output yang diharapkan untuk semua N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A

mroman
sumber
1
Apakah set khusus 1untuk 8, atau set?
Jo King
2
Saya terkejut tidak ada yang bertanya sebelumnya: Apakah Anda akan berbaik hati mengizinkan fungsi sebagai kiriman yang mengambil masukan sebagai argumen dan tidak memaksa bahasa untuk menggunakan stdin (yang beberapa tidak mampu)? Pertanyaannya adalah tentang himpunan bagian dan tidak mengutak-atik input.
ბიმო
5
Anda tidak perlu memberi tahu semua orang apakah solusi mereka benar, Anda dapat membatasi diri untuk memberi tahu kapan itu tidak.
ბიმო
1
Karena himpunan terbatas pada 1..8 , output seperti "123"itu akan tidak ambigu. Apakah ini valid
Arnauld
2
Bisakah kita menggunakan 0-diindeks [0,7] bukan [1,8]?
Erik the Outgolfer

Jawaban:

17

Jelly , 3 byte

BUT

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
5
Tapi, tapi, TAPI ...?!
Arnauld
2
@Arnauld TAPI semuanya bohong! Anda pikir semuanya Biner, eh? Baiklah ... bahwa Terangkat adalah Kebenaran! Jadi, tidak, tidak semuanya Biner. Selamat datang di area abu-abu!
Erik the Outgolfer
7

R , 52 26 byte

which(intToBits(scan())>0)

Cobalah online!

Mengonversi input menjadi bit-bitnya dan mengembalikan indeks berbasis 1 di mana mereka berada TRUE. Ini membuat port jawaban Dennis 'Jelly .

Pengembalian integer(0), daftar bilangan bulat kosong, untuk input 0.

Giuseppe
sumber
Meskipun jawaban ini tidak mengandung IF, AND, atau BUT.
ngm
4

Perl 6 , 33 byte

(1..*Zxx*.base(2).flip.comb).flat

Cobalah online!

Jo King
sumber
2

K4 , 7 byte

Larutan:

1+&|2\:

Contoh:

10 pertama ...

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

Penjelasan:

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

MATLAB / Oktaf , 31 29 27 byte

@(n)9-find(dec2bin(n,8)-48)

Cobalah online!

PieCot
sumber
1
@(n)9-find(dec2bin(n,8)-48)
alephalpha
@alephalpha Terima kasih!
PieCot
2

Japt, 7 byte

ì2 Ôi ð

Cobalah

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

¤¬²Ôð¥1

Cobalah

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

Sekam , 5 byte

`fN↔ḋ

Mengambil input sebagai argumen baris perintah bukan pada stdin ( saya harap ini ok ), coba online!

Penjelasan

`fN↔ḋ  -- example input: 6
    ḋ  -- convert to binary: [1,1,0]
   ↔   -- reverse: [0,1,1]
`      -- flip the arguments of
 fN    -- | filter the natural numbers by another list
       -- : [2,3]
ბიმო
sumber
1

Haskell , 55 54 byte

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

Keluarkan set dalam urutan terbalik, coba online!

Versi umum, 56 byte

{saya}saya=18

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

Cobalah online!

Penjelasan

Istilah mapM (pure [0,1]) [1..n]menghasilkan daftar ( n=4) [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]- yaitu. representasi biner dari [0..2^n-1]. Mengindeks ke dalamnya dengan nmemberi kita representasi biner dari n.

Sekarang kita bisa hanya zipdengan angka terbalik [1..n]dan hanya menyimpan elemen-elemen di mana biner-digit bukan nol:

 [ x | (x,digit) <- zip [n,n-1,..1] binaryRepN, digit > 0 ]
ბიმო
sumber
1

Arang , 11 byte

↓⭆⮌↨N²×ιI⊕κ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Jika mencetak jawaban secara horizontal tanpa spasi dapat diterima maka karakter pertama dapat dihapus. Penjelasan:

    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
Neil
sumber
1

JavaScript (ES6), 37 byte

+4 byte jika pemisah wajib
+3 byte jika pemisah ini koma dan koma utama dibolehkan

f=(n,i=1)=>n?(n&1?i:'')+f(n/2,i+1):''

Cobalah online!

Arnauld
sumber
1

Gangguan Umum, 57 byte

(lambda(x)(dotimes(i 7)(format(logbitp i x)"~a "(1+ i))))

Cobalah online!

Renzo
sumber
1

J , 13 10 byte

-3 bytes thanks to Bubbler

1+I.@|.@#:

Cobalah online!

Galen Ivanov
sumber
1
10 byte .
Bubbler
@ Lubbler Terima kasih! Saya pikir saya sudah mencoba ini - tampaknya tidak :)
Galen Ivanov
0

Python 3.6, 58 byte

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

APL + WIN, 13 byte

Anjuran untuk N:

((8⍴2)⊤⎕)/⌽⍳8

Cobalah online! Atas perkenan Dyalog Classic

Penjelasan:

((8⍴2)⊤⎕) prompt for N and convert to binary

/⌽⍳8 generate a vector from 1 to 8, reverse and select integers according to 1s in binary

Mengembalikan subset dalam urutan terbalik

Graham
sumber
0

Oracle SQL, 77 byte

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

Tes dalam 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')
Dr Y Wit
sumber
0

MathGolf , 8 byte

â^mÉ┤\*─

Cobalah online!

Penjelasan

â         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

Format keluaran alternatif

Dengan format output yang lebih fleksibel (yang menurut saya pribadi terlihat cukup bagus) saya dapat menghasilkan 6-byter:

â^É┤\*

Alih-alih memetakan, saya menggunakan implisit untuk masing-masing, dan saya melewatkan perataan. Output terlihat seperti ini:

[1][2][][4][5][6][7][]
maks
sumber
0

F # (Mono) , 45 byte

let m x=Seq.where(fun y->x>>>y-1&&&1>0)[1..8]

Cobalah online!

Saya juga menerapkan fungsi generik / rekursif, tetapi sangat jelek dan jumlah byte jauh lebih besar ...

F # (Mono) , 107 byte

let rec g y i=
 if y>0 then seq{
  if y%2>0 then yield i
  yield!g(y/2)(i+1)
 }else Seq.empty
let f x=g x 1

Cobalah online!

dana
sumber
0

05AB1E , 6 byte

bRSƶ0K

Cobalah secara online atau verifikasi semua kemungkinan kasus pengujian .

Penjelasan:

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]
Kevin Cruijssen
sumber
0

Java 8, 58 byte

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

Cobalah online.

Penjelasan:

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`
Kevin Cruijssen
sumber