Bir kümenin n. Alt kümesi


13

Görev

Set verildi

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

ve bir tam sayı

0N<2|S|

Nth alt kümesini bulun.

Giriş çıkış

N , stdin'de işaretsiz bir tam sayı olarak verilir. Eğer dil için uygun bir formatta N. alt kümesini yazdırmak gerekir (bu içerebilir [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, 1,2,3vb sürece bir insan okunabilir olduğu kadar metin biçimi).

Alt kümeler hakkında biraz

İkinci gruptaki altkümelerle sayılar arasında bir ilişki vardır. Her bir

di
kümesi, kümenin i. Öğesinin alt kümede olup olmadığını belirtir . Örneğin 00000000 boş küme ve 10000001 içeren alt kümedir [1,8](son ve ilk eleman). Nth alt kümesini, numarayı taban 2'ye dönüştürerek alırsınız ve alt küme,
di>0
tüm öğeleri içerir . Böylece 3. alt küme (3 = 00000011) içerir [1,2]. En sağdaki rakam # 0 rakamıdır. Yazdırmak tamam [2,1]. Kümenin sıralanması gerekmez.

Ekler:

Evet, set sabittir 1..8. Set, girişin bir parçası değildir. Girdi adildir N .

Evet, alternatif giriş formları kullanabilirsiniz.

Tüm N için beklenen tüm çıktılar : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
Set spesifik 1olarak mı 8yoksa herhangi bir set mi?
Jo King

2
Kimsenin daha önce sormadığıma şaşırdım: Girdileri argüman olarak alan ve dilleri stdin kullanmaya (bazılarını yapamayan) zorlamayan gönderimler olarak işlevlere izin verecek kadar nazik misiniz? Soru alt kümelerle ilgilidir ve girdilerle uğraşmak değildir.
ბიმო

5
Herkese çözümlerinin doğru olup olmadığını söylemenize gerek yoktur, kendinizi ne zaman olmadığını söylemekle kısıtlayabilirsiniz.
ბიმო

1
Set 1..8 ile sınırlı olduğundan , "123"net bir çıktı gibi bir çıktı olacaktır. Geçerli mi?
Arnauld

2
[1,8] yerine 0 dizinli [0,7] kullanabilir miyiz?
Outgolfer Erik

Yanıtlar:


17

Jöle , 3 bayt

BUT

Çevrimiçi deneyin!

Nasıl çalışır

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
Ama ama ama...?!
Arnauld

2
@Arnauld AMA her şey bir yalan! Sence her şey Binary, ha? Şey ... bu Utanmış Gerçek! Yani hayır, her şey İkili değil. Gri alana hoş geldiniz!
Outgolfer Erik

7

R , 52 26 bayt

which(intToBits(scan())>0)

Çevrimiçi deneyin!

Girdiyi bitlerine dönüştürür ve bulundukları yerin 1 tabanlı indekslerini döndürür TRUE. Bu da Dennis'in Jelly cevabı limanı oluyor .

İçin integer(0)tamsayıların boş listesini döndürür 0.


Bu cevap hiçbir IFs, ANDs veya BUT içermese de.
ngm




2

K4 , 7 bayt

Çözüm:

1+&|2\:

Misal:

İlk 10 ...

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

Açıklama:

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


2

Japt, 7 bayt

ì2 Ôi ð

Dene

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

¤¬²Ôð¥1

Dene

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

1

Kabuk , 5 bayt

`fN↔ḋ

Stdin'de olmayan komut satırı argümanı olarak girdi alır ( umarım bu tamamdır ), çevrimiçi deneyin!

açıklama

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

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

Seti ters sırayla çıktılar, çevrimiçi deneyin!

Genel sürüm, 56 bayt

{i}i=18

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

Çevrimiçi deneyin!

açıklama

Terim mapM (pure [0,1]) [1..n]( n=4) [[0,0,0,0],[0,0,0,1],[0,0,1,0],..,[1,1,1,1]]- listesini oluşturur . ikili temsiller [0..2^n-1]. Onunla indeksleme nbize ikili temsilini verir n.

Şimdi sadece zipters sayılarla yapabiliriz [1..n]ve sadece ikili rakamın sıfır olmadığı elemanları tutabiliriz:

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

1

Kömür , 11 bayt

↓⭆⮌↨N²×ιI⊕κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Cevabı boşluk bırakmadan yatay olarak yazdırmak kabul edilebilirse, ilk karakter kaldırılabilir. Açıklama:

    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 bayt

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



0

APL + WIN, 13 bayt

N istemleri:

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

Çevrimiçi deneyin! Dyalog Classic'in izniyle

Açıklama:

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

Altkümeyi ters sırada döndürür



0

Oracle SQL, 77 bayt

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

SQL Plus'ta test edin

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 bayt

â^mÉ┤\*─

Çevrimiçi deneyin!

açıklama

â         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

Alternatif çıktı formatı

Daha esnek bir çıktı biçimi ile (kişisel olarak oldukça iyi göründüğünü düşünüyorum) 6 byter ile gelebilirim:

â^É┤\*

Eşleme yerine her biri için örtük olanı kullanıyorum ve düzleştirmeyi atlıyorum. Çıktı şöyle görünür:

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


0

F # (Mono) , 45 bayt

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

Çevrimiçi deneyin!

Ayrıca genel / özyinelemeli bir işlev uyguladım, ancak oldukça çirkin ve bayt sayısı çok daha büyük ...

F # (Mono) , 107 bayt

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

Çevrimiçi deneyin!


0

05AB1E , 6 bayt

bRSƶ0K

Çevrimiçi deneyin veya olası tüm test senaryolarını doğrulayın .

Açıklama:

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 bayt

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

Çevrimiçi deneyin.

Açıklama:

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`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.