N-е подмножество множества

13

Задание

Учитывая набор

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

и целое число

0N<2|S|

найти N-е подмножество.

Ввод, вывод

N задается как целое число без знака на стандартном вводе. Вы должны напечатать подмножество Nth в формате , подходящем для вашего языка (это может включать в себя [1,2,3], {1,2,3}, [1, 2, 3], 1 2 3, и 1,2,3т.д., пока это человек читаемый текст формат).

Немного о подмножествах

Существует связь между подмножествами и числами в базе два. Каждая цифра

di
указывает, находится ли i- й элемент набора в подмножестве. Например, 00000000 будет пустым набором, а 10000001 - подмножеством, содержащим [1,8](последний и первый элемент). Вы получаете N-е подмножество путем преобразования числа в основание 2, а затем подмножество включает в себя все элементы, где
di>0
. 3-е подмножество (3 = 00000011), таким образом, содержит [1,2]. Самая правая цифра - цифра № 0. Это нормально для печати [2,1]. Набор не должен быть отсортирован.

Дополнения:

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

Да, вы можете использовать альтернативные формы ввода.

Все ожидаемые результаты для всех N : https://tio.run/##SyotykktLixN/f/fyNS02qIoP8soJd1CwSAg2kY32LPWPaoqs7jg/38A

mroman
источник
1
Это набор специально 1для 8или это какой-то набор?
Джо Кинг,
2
Я удивлен, что никто раньше не спрашивал: не будете ли вы так любезны разрешить функции как представления, которые принимают входные данные в качестве аргумента и не заставляют языки использовать stdin (что некоторые не в состоянии)? Вопрос о подмножествах, а не о том, чтобы возиться с входными данными.
ბიმო
5
Вам не нужно сообщать всем, является ли их решение правильным, вы можете ограничиться сообщением, когда это не так.
ბიმო
1
Поскольку набор ограничен 1..8 , вывод, такой как "123", будет однозначным. Это действительно?
Арно
2
Можем ли мы использовать 0-индексированный [0,7] вместо [1,8]?
Эрик 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
Но но НО...?!
Арнаулд
2
@Arnauld НО все ложь! Вы думаете, что все двоичные, а? Хорошо ... что Истинное является Истиной! Так что нет, не все является двоичным. Добро пожаловать в серую зону!
Эрик Outgolfer
7

R , 52 26 байт

which(intToBits(scan())>0)

Попробуйте онлайн!

Преобразует входные данные в его биты и возвращает основанные на 1 индексы того, где они находятся TRUE. Это делает это портом ответа Желе Денниса .

Возвращает integer(0)пустой список целых чисел для ввода 0.

Giuseppe
источник
Хотя этот ответ не содержит IF, AND или BUT.
НГМ
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
streetster
источник
2

Japt, 7 байт

ì2 Ôi ð

Попытайся

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

¤¬²Ôð¥1

Попытайся

¤           :Convert to base-2 string
 ¬          :Split
  ²         :Push 2
   Ô        :Reverse
    ð       :0-based indices of elements
     ¥1     :  Equal to 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)]
PieCot
источник
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-байтовый:

â^É┤\*

Вместо отображения я использую неявный for-each и пропускаю выравнивание. Вывод выглядит так:

[1][2][][4][5][6][7][]
maxb
источник
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

Попробуйте онлайн!

Dana
источник
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`
Кевин Круйссен
источник