用倍数覆盖一组


14

让我们一组整数大于1,并称之为X。我们将S(i)定义为Xi整除的所有成员的集合,其中i> 1。想从这些子集中选择一组集合,以便

  • 他们的联合是集合X

  • X的元素不在两个集合中。

例如,我们可以重新组合{3..11}

      {3,4,5,6,7,8,9,10,11}
S(3): {3,    6,    9,     }
S(4): {  4,      8,       }
S(5): {    5,        10,  }
S(7): {        7,         }
S(11):{                 11}

有些集合不能用这种方式表达。例如,如果我们采用{3..12}12则是3和4的倍数,以防止我们的集合相互排斥。

某些集合可以多种方式表达,例如 {4..8}可以表示为

      {4,5,6,7,8}
S(4): {4,      8}
S(5): {  5,     }
S(6): {    6,   }
S(7): {      7, }

但也可以表示为

      {4,5,6,7,8}
S(2): {4,  6,  8}
S(5): {  5,     }
S(7): {      7, }

任务

我们的目标是编写一个程序,该程序将集合作为输入,并以这种方式输出覆盖它的最少子集。如果没有,则应输出除正整数以外的其他值(例如0)。

这是一个 问题,因此答案将以字节计分,字节越少越好。

测验

{3..11}       -> 5
{4..8}        -> 3
{22,24,26,30} -> 1
{5}           -> 1

如果没有,则应输出除正整数以外的其他值(例如0)。我们的程序不能导致未定义的行为吗?
Xcoder先生17年

另外,您可以添加一个测试用例[5..5]吗?我们可以收到类似的东西[8..4]吗?
Xcoder先生17年

@ Mr.Xcoder不可以。程序应该能够识别不可能的情况,而不仅仅是永久循环或崩溃。
发布Rock Garf Hunter

1
12是两者的倍数,34防止我们的集合相互排斥 ”:为什么?我在问题陈述中没有看到其他任何内容,需要12将它们都放入这两个子集中。
彼得·泰勒

1
另外,测试用例是什么?[22,24,26,30]是的倍数2。您确定删除它并对其进行沙箱处理会更好吗?
彼得·泰勒

Answers:


6

Python 2,167字节

lambda a:([q for q in range(a[-1])if a in[sorted(sum(j,[]))for j in combinations([[p for p in a if p%i<1]for i in range(2,1+a[-1])],q)]]+[0])[0]
from itertools import*

在线尝试!

-9个字节,感谢Zacharý-4个字节,感谢Xcoder
先生
-2个字节,使用列表而不是
-5个字节,a in [...]而不是使用- any([a == ...])
-2个字节归Xcoder先生
-8个字节,通过合并语句
-5个字节归Xcoder先生的感谢
-7个字节归Xcoder先生/Zacharý的
+7个字节来解决错误
字节,感谢ovs -1个字节的

注意

对于较大的最大值,这非常慢,因为它没有经过优化。它在Xcoder的设备上2分钟内没有出现[22, 24, 26, 30]


5

Clingo,51个字节

{s(2..X)}:-x(X).:-x(X),{s(I):X\I=0}!=1.:~s(I).[1,I]

演示版

$ echo 'x(3..11).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) s(3) s(4) s(5) s(7) s(11)
Optimization: 5
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 5
Calls        : 1
Time         : 0.003s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.010s
$ echo 'x(4..8).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(4) x(5) x(6) x(7) x(8) s(3) s(4) s(5) s(7)
Optimization: 4
Answer: 2
x(4) x(5) x(6) x(7) x(8) s(2) s(5) s(7)
Optimization: 3
OPTIMUM FOUND

Models       : 2
  Optimum    : yes
Optimization : 3
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(22;24;26;30).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(22) x(24) x(26) x(30) s(5) s(8) s(22) s(26)
Optimization: 4
Answer: 2
x(22) x(24) x(26) x(30) s(3) s(22) s(26)
Optimization: 3
Answer: 3
x(22) x(24) x(26) x(30) s(2)
Optimization: 1
OPTIMUM FOUND

Models       : 3
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.004s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(5).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(5) s(5)
Optimization: 1
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

这似乎无法检测到没有类似解决方案的案例x(3..12).(或者我是否需要更新?)。顺便说一句,您能推荐一个很好的clingo介绍吗?
Christian Sievers

1
@ChristianSievers糟糕,这是一个错误,现已修复。UNSATISFIABLE在这种情况下应该输出。我主要使用Potassco指南
Anders Kaseorg '17

4

Mathematica,105个字节

Length@Select[Subsets@Table[Select[s,Mod[#,i]==0&],{i,2,Max[s=#]}],Sort@Flatten@#==Sort@s&][[1]]~Check~0&


在线尝试,
复制并粘贴至ctrl + v,
将输入粘贴至代码末尾,按
shift + enter运行

输入

[{3,4,5,6,7,8,9,10,11}]


如果没有列表,则将列表作为输入输出0


很好的使用Check
Keyu Gan

有工作版本后,为什么不取消删除第一个答案?
尼尔

因为这是一种全新的方法?有问题吗?
J42161217

4

Haskell,136个字节

import Data.List
f l|m<-maximum l=(sort[n|(n,c)<-[(length s,[i|j<-s,i<-[j,2*j..m],elem i l])|s<-subsequences[2..m]],c\\l==l\\c]++[0])!!0

在线尝试!

怎么运行的

f l     =                           -- input set is l
   |m<-maximum l                    -- bind m to maximum of l
       [   |s<-subsequences[2..m]]  -- for all subsequences s of [2..m]
        (length s, )                -- make a pair where the first element is the length of s
            [i|j<-s,i<-[j,2*j..m],elem i l]
                                    -- and the second element all multiples of the numbers of s that are also in l
     [n|(n,c)<-       ,c\\l==l\\c]  -- for all such pairs (n,c), keep the n when c has the same elements as l, i.e. each element exactly once
   sort[ ]++[0]                     -- sort those n and append a 0 (if there's no match, the list of n is empty)
 (     )!!0                         -- pick the first element

花费很多时间{22,24,26,30}


3

果冻38 35 34 33 31 28 25 24 23 20 19字节

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ

-5个字节,感谢Leaky Nun

在线尝试!

认为第三个测试用例可以工作,但是非常慢。0没有解决方案时输出。

说明(可能将这个说明弄错了):

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ     (input z)
ṀḊ                      - 2 .. max(z)
  ŒP                    - powerset
    ð                   - new dyadic chain
     %þ@⁹               - modulo table of z and that
         ¬              - logical not
          S             - sum
           ḟ1           - filter out 1's
             ðÐḟ        - filter out elements that satisfy that condition
                L€      - length of each element
                  Ḣ     - first element


谢谢!并感谢您不要自己提交!
扎卡里

我有一个不同的18字节的解决方案更贴近我的原创,我个人是这样一个更好:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
扎卡里

哇... ṀḊ实际上是一个很酷的把戏!
扎卡里

哎呀,那行不通,我的重写也不行!这应该输出0,而不是1
扎卡里

2

朱莉娅91字节

x->(t=[];for i in x z=findfirst(x->x==0,i%(2:maximum(x)));zt?1:push!(t,z) end;length(t))

嗯...您是否忘记了在语言名称中包含链接,还是实际上将其命名为“ [Julia]”?
扎卡里

您说得对,名字叫朱莉娅,不带括号
Tanj

您可能还想在其他答案上解决该问题!
扎卡里

哇,答案很多!如果你要插入一个链接,语法是[Text to display](link to website)
扎卡里
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.