N-te Teilmenge einer Menge


13

Die Aufgabe

Angesichts der Menge

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

und eine ganze Zahl

0N<2|S|

Finden Sie die n-te Teilmenge.

Input-Output

N wird als vorzeichenlose ganze Zahl in stdin angegeben. Sie müssen die n - te Teilmenge in einem geeigneten Format für Ihre Sprache gedruckt werden (dies kann [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3usw. , solange es ein Mensch lesbar Text - Format).

Ein bisschen über Teilmengen

Es gibt eine Beziehung zwischen Teilmengen und Zahlen in der Basis zwei. Jede Ziffer

di
angibt , ob das i - te Element der Menge innerhalb der Teilmenge ist. Beispielsweise wäre 00000000 die leere Menge und 10000001 die Teilmenge, die enthält [1,8](das letzte und erste Element). Sie erhalten die Teilmenge Nth durch die Zahl in der Basis 2 Umwandlung und dann enthält die Teilmenge alle Elemente , bei denen
di>0
. Die 3. Teilmenge (3 = 00000011) enthält also [1,2]. Die Ziffer ganz rechts ist die Ziffer # 0. Es ist in Ordnung zu drucken [2,1]. Das Set muss nicht sortiert werden.

Nachträge:

Ja, das Set ist fest auf 1..8. Das Set ist nicht Bestandteil der Eingabe. Die Eingabe ist nur N .

Ja, Sie können alternative Eingabeformulare verwenden.

Alle erwarteten Ausgaben für alle N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
Ist der Satz speziell 1auf 8, oder ist es ein Satz?
Jo King

2
Ich bin überrascht, dass noch niemand gefragt hat: Würden Sie so freundlich sein, Funktionen als Einreichungen zuzulassen, die die Eingabe als Argument verwenden und Sprachen nicht dazu zwingen, stdin zu verwenden (was einige nicht können)? Die Frage handelt von Teilmengen und nicht von Eingaben.
24.

5
Sie müssen nicht jedem mitteilen, ob die Lösung korrekt ist, sondern können sich darauf beschränken, zu sagen, wann dies nicht der Fall ist.
24.

1
Da der Satz auf 1..8 begrenzt ist , kann ein Ausgang wie z"123" eindeutig. Ist es gültig
Arnauld

2
Können wir 0-indizierte [0,7] anstelle von [1,8] verwenden?
Erik der Outgolfer

Antworten:


17

Gelee , 3 Bytes

BUT

Probieren Sie es online!

Wie es funktioniert

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
Aber, aber, aber...?!
Arnauld

2
@ Arnauld ABER alles ist eine Lüge! Sie denken, dass alles binär ist, nicht wahr? Nun ... dass Upended die Wahrheit ist! Also, nein, nicht alles ist binär. Willkommen in der Grauzone!
Erik der Outgolfer

7

R , 52 26 Bytes

which(intToBits(scan())>0)

Probieren Sie es online!

Konvertiert die Eingabe in ihre Bits und gibt die auf 1 basierenden Indizes zurück, in denen sie sich befinden TRUE. Das macht dies zu einem Hafen von Dennis 'Jelly-Antwort .

Gibt integer(0)die leere Liste der Ganzzahlen zur Eingabe von zurück 0.


Obwohl diese Antwort keine IFs, ANDs oder BUTs enthält.
ngm




2

K4 , 7 Bytes

Lösung:

1+&|2\:

Beispiel:

Erste 10 ...

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

Erläuterung:

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


2

Japt, 7 Bytes

ì2 Ôi ð

Versuch es

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

¤¬²Ôð¥1

Versuch es

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

1

Schale , 5 Bytes

`fN↔ḋ

Nimmt Eingaben als Kommandozeilenargument nicht auf stdin ( ich hoffe das ist ok ), versuche es online!

Erläuterung

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

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

Gibt das Set in umgekehrter Reihenfolge aus, probiere es online aus!

Allgemeine Version, 56 Bytes

Dies funktioniert für Gruppen, die größer als sind {ich}ich=18:

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

Probieren Sie es online!

Erläuterung

Der Begriff mapM (pure [0,1]) [1..n]erzeugt die Liste ( n=4) [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]- dh. die binären Darstellungen von [0..2^n-1]. Indizieren in es mit ngibt uns die binäre Darstellung vonn .

Jetzt können wir es einfach zipmit den umgekehrten Zahlen machen [1..n]und nur die Elemente behalten, bei denen die Binärziffer ungleich Null ist:

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

1

Holzkohle , 11 Bytes

↓⭆⮌↨N²×ιI⊕κ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Wenn es akzeptabel ist, die Antwort horizontal ohne Leerzeichen auszudrucken, kann das erste Zeichen entfernt werden. Erläuterung:

    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

Python 3.6, 58 Bytes

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





0

Oracle SQL, 77 Byte

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

Testen Sie in 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 Bytes

â^mÉ┤\*─

Probieren Sie es online!

Erläuterung

â         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

Alternatives Ausgabeformat

Mit einem flexibleren Ausgabeformat (das meiner Meinung nach recht gut aussieht) kann ich ein 6-Byte-Format erstellen:

â^É┤\*

Anstatt zuzuordnen, verwende ich das implizite For-Each und überspringe die Abflachung. Die Ausgabe sieht folgendermaßen aus:

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


0

F # (Mono) , 45 Bytes

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

Probieren Sie es online!

Ich habe auch eine generische / rekursive Funktion implementiert, aber sie ist ziemlich hässlich und die Anzahl der Bytes ist sehr hoch größer ...

F # (Mono) , 107 Bytes

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

Probieren Sie es online!


0

05AB1E , 6 Bytes

bRSƶ0K

Probieren Sie es online aus oder überprüfen Sie alle möglichen Testfälle .

Erläuterung:

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 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.