N-й підмножина набору


13

Завдання

Враховуючи набір

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

і ціле число

0N<2|S|

знайти N-му підмножину.

Введення-виведення

N задається як непідписане ціле число на stdin. Ви повинні надрукувати підмножина Nth в форматі , відповідному для вашої мови (це може включати в себе [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, і 1,2,3т.д., поки це людина читається текст формат).

Трохи про підмножини

Існує залежність між підмножинами та числами в базовій другій. Кожна цифра

гi
вказує, чи є i- й елемент набору в межах підмножини. Наприклад, 00000000 буде порожнім набором, а 10000001 - підмножиною, що містить [1,8](останній і перший елемент). Ви отримуєте N-му підмножину шляхом перетворення числа в базу 2, а потім підмножина включає всі елементи, де
гi>0
. Третій підмножина (3 = 00000011), таким чином, містить [1,2]. Крайній правою цифрою є цифра # 0. Друкувати добре [2,1]. Набір не потрібно сортувати.

Додатки:

Так, набір фіксовано на 1..8. Набір не є частиною вводу. Введення тільки N .

Так, ви можете використовувати альтернативні форми введення.

Усі очікувані результати для всіх N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A


1
Чи є набір спеціально 1для 8, або це будь-який набір?
Джо Кінг

2
Я здивований, що раніше ніхто не запитував: Чи будете ви такі добрі, щоб дозволити функції як подання, які беруть дані як аргумент, а не змушують мови використовувати stdin (що деякі не в змозі)? Питання полягає в підмножинах, а не в зборах із вхідними даними.
ბიმო

5
Не потрібно всім казати, чи правильно їх рішення, ви можете обмежитись, коли вони це не відповідають.
ბიმო

1
Оскільки множина обмежена 1..8 , вихід такого типу "123"був би однозначним. Чи дійсно це?
Арнольд

2
Чи можна використовувати 0-індексований [0,7] замість [1,8]?
Ерік Аутгольфер

Відповіді:


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
Але, але, АЛЕ ...?!
Арнольд

2
@Arnauld АЛЕ все брехня! Ви думаєте, що все є Бінарним, так? Ну ... що Невиконаний - це Істина! Отже, ні, не все є Бінарним. Ласкаво просимо в сіру зону!
Ерік Аутгольфер

7

R , 52 26 байт

which(intToBits(scan())>0)

Спробуйте в Інтернеті!

Перетворює вхід у свої біти та повертає 1-бальні індекси, де вони знаходяться TRUE. Це робить портретом відповідь Дженніса Желе .

Повертає integer(0), порожній список цілих чисел, для введення 0.


Хоча ця відповідь не містить IF, AND або BUT.
ngm




2

К4 , 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

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]. Індексація в ньому nдає нам двійкове представленняn .

Тепер ми можемо просто 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

Python 3.6, 58 байт

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





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-байтний:

â^É┤\*

Замість відображення я використовую неявне для-кожного, і пропускаю вирівнювання. Вихід виглядає приблизно так:

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


0

F # (моно) , 45 байт

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

Спробуйте в Інтернеті!

Я також реалізував загальну / рекурсивну функцію, але її досить некрасиво і кількість байтів - це багато більше ...

F # (моно) , 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`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.