Ennesimo sottoinsieme di un set


13

L'obiettivo

Dato il set

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

e un numero intero

0N<2|S|

trova l'ennesimo sottoinsieme.

Input Output

N è dato come intero senza segno su stdin. È necessario stampare il sottoinsieme ennesimo in un formato adatto per la vostra lingua (questo può includere [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3ecc per tutto il tempo in quanto è un leggibile il testo formato).

Un po 'di sottoinsiemi

Esiste una relazione tra sottoinsiemi e numeri nella seconda base. Ogni cifra specifica se l' i esimo elemento dell'insieme si trova all'interno del sottoinsieme. Ad esempio 00000000 sarebbe l'insieme vuoto e 10000001 è il sottoinsieme contenente (l'ultimo e il primo elemento). Si ottiene l'ennesimo sottoinsieme convertendo il numero in base 2 e quindi il sottoinsieme include tutti gli elementi in cui . Il terzo sottoinsieme (3 = 00000011) contiene quindi . La cifra più a destra è la cifra # 0. Va bene stampare . Non è necessario ordinare il set.

dio
d i > 0[1,8]
dio>0
[1,2][2,1]

addendum:

Sì, il set è fisso su 1..8. Il set non fa parte dell'input. Ingresso è solo N .

Sì, è possibile utilizzare moduli di input alternativi.

Tutte le uscite previste per tutte le N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
È l'insieme specificamente 1a 8, o è qualsiasi insieme?
Jo King,

2
Sono sorpreso che nessuno abbia mai chiesto prima: saresti così gentile da consentire funzioni come invii che prendono l'input come argomento e non costringono le lingue a usare lo stdin (che alcuni non sono in grado di)? La domanda riguarda i sottoinsiemi e non armeggiare con gli input.
ბიმო

5
Non devi dire a tutti se la loro soluzione è corretta, puoi limitarti a dire quando non lo è.
ბიმო

1
Poiché il set è limitato a 1..8 , un output come "123"sarebbe inequivocabile. È valido?
Arnauld,

2
Possiamo usare [0,7] indicizzato 0 invece di [1,8]?
Erik the Outgolfer,

Risposte:


17

Gelatina , 3 byte

BUT

Provalo online!

Come funziona

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
Ma, MA, MA ...?!
Arnauld,

2
@Arnauld MA è tutto una bugia! Pensi che tutto sia binario, eh? Bene ... quella Rivolta è la Verità! Quindi no, non tutto è binario. Benvenuti nell'area grigia!
Erik the Outgolfer,

7

R , 52 26 byte

which(intToBits(scan())>0)

Provalo online!

Converte l'input nei suoi bit e restituisce gli indici in base 1 di dove si trovano TRUE. Questo rende questo un porto della risposta Jelly di Dennis .

Restituisce integer(0), l'elenco vuoto di numeri interi, per l'immissione di 0.


Sebbene questa risposta non contenga IF, AND o MA.
ngm,




2

K4 , 7 byte

Soluzione:

1+&|2\:

Esempio:

Primi 10 ...

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

Spiegazione:

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


2

Japt, 7 byte

ì2 Ôi ð

Provalo

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

¤¬²Ôð¥1

Provalo

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

1

Buccia , 5 byte

`fN↔ḋ

Accetta input come argomento della riga di comando non su stdin ( spero che vada bene ), provalo online!

Spiegazione

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

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

Emette il set in ordine inverso, provalo online!

Versione generale, 56 byte

{io}io=18

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

Provalo online!

Spiegazione

Il termine mapM (pure [0,1]) [1..n]genera la lista ( n=4) [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]- cioè. le rappresentazioni binarie di [0..2^n-1]. Indicizzarlo con nci dà la rappresentazione binaria di n.

Ora possiamo solo zipfarlo con i numeri invertiti [1..n]e mantenere solo gli elementi in cui la cifra binaria è diversa da zero:

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

1

Carbone , 11 byte

↓⭆⮌↨N²×ιI⊕κ

Provalo online! Il collegamento è alla versione dettagliata del codice. Se è accettabile stampare la risposta in orizzontale senza spazi, è possibile rimuovere il primo carattere. Spiegazione:

    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

1

JavaScript (ES6), 37 byte

+4 byte se un separatore è obbligatorio
+3 byte se questo separatore è una virgola e una virgola iniziale è consentita

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

Provalo online!








0

Python 3.6, 58 byte

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

Test 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 byte

â^mÉ┤\*─

Provalo online!

Spiegazione

â         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

Formato di output alternativo

Con un formato di output più flessibile (che personalmente ritengo sia abbastanza buono) posso inventare un 6-byte:

â^É┤\*

Invece di mappare, uso l'implicito per-ciascuno e salto l'appiattimento. L'output è simile al seguente:

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


0

F # (Mono) , 45 byte

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

Provalo online!

Ho anche implementato una funzione generica / ricorsiva, ma è piuttosto brutta e il conteggio dei byte è molto più grande ...

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

Provalo online!


0

05AB1E , 6 byte

bRSƶ0K

Provalo online o verifica tutti i possibili casi di test .

Spiegazione:

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);}

Provalo online.

Spiegazione:

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`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.