เซตย่อยของชุด


13

งาน

ที่กำหนดไว้

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

และจำนวนเต็ม

0N<2|S|

ค้นหาชุดย่อย Nth

Input / Output

Nถูกกำหนดเป็นจำนวนเต็มที่ไม่ได้ลงนามใน stdin คุณต้องพิมพ์เซตชับในรูปแบบที่เหมาะสมสำหรับภาษาของคุณ (ซึ่งอาจรวมถึง[1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3ฯลฯ ให้นานเท่าที่จะเป็นมนุษย์ที่สามารถอ่านข้อความรูปแบบ)

เล็กน้อยเกี่ยวกับชุดย่อย

มีความสัมพันธ์ระหว่างชุดย่อยและตัวเลขในฐานสอง แต่ละหลัก ระบุว่าองค์ประกอบที่iของชุดอยู่ภายในชุดย่อยหรือไม่ ตัวอย่างเช่น00000000จะเป็นชุดว่างเปล่าและ10000001เป็นชุดย่อยที่มี(องค์ประกอบสุดท้ายและองค์ประกอบแรก) คุณจะได้รับเซตชับโดยการแปลงตัวเลขลงในฐานที่ 2 และจากนั้นเซตรวมถึงองค์ประกอบทั้งหมดที่0 เซตที่ 3 (3 = 00000011) จึงมี ตัวเลขที่ถูกต้องที่สุดคือตัวเลข # 0 มันตกลงที่จะพิมพ์ ไม่จำเป็นต้องจัดเรียงชุด

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

แนบท้าย:

ใช่ชุดได้รับการแก้ไข1..8แล้ว ชุดนี้ไม่ได้เป็นส่วนหนึ่งของอินพุต การป้อนข้อมูลเป็นเพียงN

ใช่คุณสามารถใช้แบบฟอร์มป้อนข้อมูลสำรอง

เอาต์พุตที่คาดหวังทั้งหมดสำหรับNทั้งหมด: https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
เป็นชุดเฉพาะ1ที่จะ8หรือจะเป็นชุดใด ๆ
Jo King

2
ฉันประหลาดใจที่ไม่มีใครถามก่อนหน้านี้: คุณจะใจดีเพื่อให้ฟังก์ชั่นเป็นงานที่รับเข้าเป็นอาร์กิวเมนต์และไม่บังคับให้ภาษาใช้ stdin (ซึ่งบางอันไม่สามารถทำได้)? คำถามเกี่ยวกับชุดย่อยและไม่เล่นซอกับอินพุต
ბიმო

5
คุณไม่จำเป็นต้องบอกทุกคนว่าการแก้ปัญหาของพวกเขาถูกต้องหรือไม่คุณสามารถ จำกัด ตัวเองให้บอกเมื่อไม่ได้
ბიმო

1
เนื่องจากชุดนี้ จำกัด ไว้ที่1..8เอาต์พุตเช่น"123"จะไม่คลุมเครือ มันถูกต้องหรือไม่
Arnauld

2
เราสามารถใช้ดัชนี 0 [0,7] แทน [1,8] ได้หรือไม่?
Erik the Outgolfer

คำตอบ:


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
@Annauld แต่ทุกอย่างเป็นเรื่องโกหก! คุณคิดว่าทุกอย่างเป็นไบนารีใช่มั้ย ดี ... ที่upendedเป็นความจริง! ไม่เลยไม่ใช่ทุกอย่างคือไบนารี ยินดีต้อนรับสู่พื้นที่สีเทา!
Erik the Outgolfer

7

R , 52 26 ไบต์

which(intToBits(scan())>0)

ลองออนไลน์!

แปลงอินพุตเป็นบิตและส่งกลับดัชนีที่อิง 1 ว่าเป็นตำแหน่งTRUEใด ที่นี้จะทำให้พอร์ตของเดนนิสคำตอบของวุ้น

ผลตอบแทนที่รายการที่ว่างเปล่าของจำนวนเต็มสำหรับใส่ของinteger(0)0


แม้ว่าคำตอบนี้จะไม่มี IFs, ANDs หรือ BUT
ngm




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

Husk , 5 ไบต์

`fN↔ḋ

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งไม่ได้อยู่บนstdin ( ฉันหวังว่านี่จะโอเค ) ลองออนไลน์!

คำอธิบาย

`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]

1

Haskell , 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]การเป็นตัวแทนของไบนารี การทำดัชนีลงไปด้วยทำให้เรามีฐานเป็นตัวแทนของnn

ตอนนี้เราสามารถทำได้zipด้วยตัวเลขย้อนกลับ[1..n]และเก็บองค์ประกอบที่เลขฐานสองไม่ใช่ศูนย์:

 [ 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

APL + WIN, 13 ไบต์

พรอมต์สำหรับ N:

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

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

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

ส่งคืนเซ็ตย่อยในลำดับย้อนกลับ



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-byter:

â^É┤\*

แทนที่จะใช้การแม็พฉันใช้การบอกเป็นนัยสำหรับแต่ละคนและฉันข้ามการแบน ผลลัพธ์มีดังนี้:

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


0

F # (โมโน) 45 ไบต์

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

ลองออนไลน์!

ฉันยังใช้ฟังก์ชั่นทั่วไป / เรียกซ้ำ แต่มันน่าเกลียดและนับไบต์มีขนาดใหญ่กว่ามาก ...

F # (Mono) , 107 ไบต์

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

ลองออนไลน์!


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.