查找子集因素


14

假设我们有一组有限的正整数。这个集合可以表示为一点点线,其中集合中存在的每个整数都像扫描仪或打孔卡一样被填充。例如,该集合{1,3,4,6}可以表示为:

*.**.*

*代表我们集合的成员,并且.代表一个不是集合成员的整数。

这些集合具有“因素”。如果可以从x的副本中构建y,则x是y的因子。更严格地,我们对因子的定义如下:

  • 当且仅当y是许多不交集的并集时,x都是y的因子,所有不交集都是x且具有偏移量。

我们之所以称其*.*因子,是*.**.*因为它很显然是由两个*.*首尾相连的副本组成的。

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

因素不一定是端到端的,我们还要说这*.**.*.*.*

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

因素也可以重叠。这*.*也意味着****

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

但是,一个数字不能多次覆盖一个因数。例如*.*不是一个因素*.*.*


这是一个更复杂的示例:

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

*..*.*是一个因素。您可以在下面看到我排列的三个实例的地方*..*.*

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

任务

给定一个由任何合理表示形式输出的集合,所有集合都是输入的因子。

您可以按任何值编制索引(即,可以选择输入中可以存在的最小数字)。您还可以假设输入集将始终包含该最小值。

这是一个问题,因此您应该以尽可能少的字节为目标。

测试用例

这些测试用例是手工完成的,较大的可能有一个或两个错误

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

如果我们把一组数字(例如列表[1,3,5,7]*.*.*.*),我们可以假设它的排序?
Martin Ender

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 '17

1
@JonathanAllan在您的示例中,它*被列为代表与*.或相同子集的因子*..
Martin Ender

1
@JonathanAllan它说输出所有集合,而不是输出有效集合的所有ASCII表示。
Martin Ender

Answers:


3

Mathematica,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 Nope(其中N是输入的长度,o = p = e = 1 ...)。它生成子集的所有子集,然后选择连接在一起时会导致输入发送的那些子集(确保我们仅考虑分区),并且如果我们减去每个子集的最小值,则所有元素都相同。


2

果冻,12字节

;÷@DỊȦ
ÆDçÐf

输入和输出使用10代替*.

在线尝试!

怎么运行的

Æ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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.