Знайдіть підмножини факторів


14

Уявімо, у нас є скінченна множина натуральних чисел. Цей набір може бути представлений у вигляді рядків крапок, де кожне ціле число, присутнє в наборі, заповнюється як карта скантрона або перфокарта . Наприклад, набір {1,3,4,6}може бути представлений у вигляді:

*.**.*

*являє собою член нашого набору і .являє собою ціле число, яке не є членом, який він встановив.

Ці множини мають "фактори". Вільно x - це коефіцієнт y, якщо y може бути побудований з копій x. Більш чітко наше визначення фактора полягає в наступному:

  • x - коефіцієнт y, якщо і лише тоді, коли y - це об'єднання декількох роз'єднаних множин, які є x зі зміщенням.

Ми могли б назвати *.*в фактор з , *.**.*тому що це абсолютно ясно з двох примірників *.*пут кінця в кінець.

*.**.*
------
*.*...
...*.*

Фактори не повинні бути цілими до кінця, ми також сказали б, що *.*це фактор*.*.*.*

*.*.*.*
-------
*.*....
....*.*

Фактори також можуть перетинатися. Це *.*також є фактором****

****
----
*.*.
.*.*

Однак число не може бути покрито фактором більше одного разу. Наприклад, *.*це не є фактором *.*.*.


Ось більш складний приклад:

 *..*.**..***.*.*

Це є *..*.*чинником. Ви бачите це нижче, де я вишикував три екземпляри *..*.*.

*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*

Завдання

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

Ви можете індексувати будь-яке значення (тобто ви можете вибрати найменше число, яке може бути присутнім у введенні). Ви також можете припустити, що набір вводу завжди буде містити найменше значення.

Це питання з тому вам слід прагнути зробити це якомога менше байтів.

Випробування

Ці тестові справи були зроблені вручну, на великих розмірах може бути помилка чи дві

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**

Якщо ми сприймаємо набір як список чисел (наприклад, [1,3,5,7]для *.*.*.*), чи можна вважати, що він відсортований?
Мартін Ендер

1
Чи це еквівалент знаходження дільників многочленів, коефіцієнти яких обмежені 0 і 1?
xnor

1
@xnor Я не впевнений. Якщо *.*.*=x+x^2+x^4 , то 1+x+x^2= ***був би дільником, правда? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
@JonathanAllan Для ваших прикладів *вказано як фактор, який представляє те саме підмножина, що *.і *...
Мартін Ендер

1
@JonathanAllan Каже, виведіть усі набори, а не виведіть усі представлення ASCII дійсних наборів.
Мартін Ендер

Відповіді:


3

Математика, 71 68 байт

#&@@@Cases[(s=Subsets)@s@#,x_/;Sort[Join@@x]==#&&Equal@@(#&@@@x-x)]&

Введіть як {1,3,5,7}(відсортовано), а вихід як {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}. Функція буде кидати купу повідомлень.

Це O (2 2 ні ) (де N - довжина вводу, а o = p = e = 1 ...). Він генерує всі підмножини підмножини, потім вибирає ті, які призводять до надсилання вхідного сигналу при об'єднанні разом (гарантуючи, що ми розглядаємо лише розділи) і де всі елементи однакові, якщо відняти найменше значення кожного підмножини).


2

Желе , 12 байт

;÷@DỊȦ
ÆDçÐf

Використання вводу та виводу 1та0 не *та ..

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

Як це працює

ÆDçÐf   Main link. Argument: n (integer with decimal digits 1 and 0)

ÆD      Compute all divisors of n.
  çÐf   Filter; call the helper link with left argument d and right argument n for
        all divisors d of n. Return the array of d's for which the helper link
        returns a truthy value.


;÷@DỊȦ  Helper link. Left argument: d. Right argument: n

 ÷@     Divide n by d.
;       Concatenate, yielding [d, n÷d].
   D    Decimal; convert both integers in the pair to base 10.
    Ị   Insignificant; map 1 and 0 to 1, all other positive integers to 0.
     Ȧ  All; return 1 iff the result contains no zeroes.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.