在除数关系中找到最大匹配


16

您会得到一组正整数。您必须将它们成对布置,以便:

  • 每对包含2个数字,其中一个是另一个的倍数。例如,8是4的倍数,而9是9的倍数。
  • 如果在初始集中多次出现相同的数字,则可以成对使用多次。一个数字甚至可以与另一个相同数字出现
  • 获得最大可能的对数。

输出必须是对数。最短的代码获胜。

样本数据

2,3,4,8,9,18 -> 3

7,14,28,42,56 -> 2

7,1,9,9,4,9,9,1,3,9,8,5 -> 6

8,88,888,8888,88888,888888 -> 3

2,6,7,17,16,35,15,9,83,7 -> 2


3
有人知道这个问题是否是NP完全的吗?我认为最小的“硬”集是2,3,4,8,9,18。(该列表中的每个数字都是一个因子和/或列表中至少两个其他数字的倍数,但只有一个解决方案。)
Neil 2015年

Answers:


6

Haskell,109 107 76 70字节

感谢nimi节省了33个字节并教给我更多的Haskell。:)
感谢xnor节省了另外6个字节。

import Data.List
f l=maximum$0:[1+f t|a:b:t<-permutations l,a`mod`b<1]

是的,我第一次参加Haskell高尔夫。它的作用与到目前为止的所有答案相同(嗯,不是完全正确:它仅计算每个排列中有效对的最长前缀的长度,但这是等效的,实际上是我最初的CJam代码所做的)。

对于额外的修饰度,每当置换的前两个元素为有效对时,通过递归生成后缀的所有置换,效率也将降低。


f=必要吗?
Alex A.

@AlexA。我不确定Haskell中用于未命名函数的PPCG的标准策略是什么,但是我检查了其他一些Haskell答案,它们使用了命名函数。同样,如果您想将其用作未命名的函数,则从技术上讲,您必须在函数周围使用括号,因此我猜想这将是相同的字节数。
马丁·恩德

@nimi感谢您告诉我。:)您还有其他可以缩短的地方吗?的导入chunksOf非常痛苦。我真的不知道Haskell的标准库是否能够判断是否有一个较短的等效函数。我尝试自己实现它,但是它比导入要长两到三个字节。
Martin Ender

哦~~,既醒目[],并[_]在通过将同时g x=[]第二个是真聪明。我会尝试的。谢谢:)
马丁·恩德

看起来较短,以递归方式定义整个函数:f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1]
xnor

3

CJam,22 18字节

q~e!{2/::%0e=}%:e>

在线尝试。

期望以CJam样式列表的形式输入。

有点对于较大的列表,低效(除非您提供更多的Java内存,否则Java可能会用光内存)。

说明

q~     e# Read and evaluate input.
e!     e# Get all distinct permutations.
{      e# Map this block onto each permutation...
  2/   e#   Split the list into (consecutive) pairs. There may be a single element at the
       e#   end, which doesn't participate in any pair.
  ::%  e#   Fold modulo onto each chunk. If it's a pair, this computes the modulo, which
       e#   yields 0 if the first element is a multiple of the second. If the list has only
       e#   one element, it will simply return that element, which we know is positive.
  0e=  e#   Count the number of zeroes (valid pairs).
}%
:e>    e# Find the maximum of the list by folding max() onto it.

它不会提供输出,[1 2 3 4 5 6 7 8 9 10]但是[7 1 9 9 4 9 9 1 3 9 8 1]列表较长,可以正常工作。这是为什么?
ghosts_in_the_code 2015年

@ghosts_in_the_code因为前者具有更多不同的排列。10! = 3628800但是12! / 5! / 3! = 665280。因此,第一种情况会耗尽内存。如果您使用Java解释器从控制台运行它,则可以告诉Java使用更多的内存,第一种情况也可以工作(尽管可能需要一段时间,但不知道)。
马丁·恩德

3

Pyth,13个字节

eSm/%Mcd2Z.pQ

时间和存储的复杂性确实很糟糕。我要做的第一件事是创建一个包含原始列表所有排列的列表。这需要n*n!存储。长度为9的输入列表已经花费了很长时间。

在线尝试:演示测试套件

说明:

eSm/%Mcd2Z.pQ
            Q   read the list of integer
          .p    create the list of all permutations
  m             map each permutation d to:
      cd2          split d into lists of length 2
    %M             apply modulo to each of this lists
   /     Z         count the zeros (=number of pairs with the first 
                   item divisible by the second)
 S              sort these values
e               and print the last one (=maximum)

2

Mathematica,95 93 87 83 79 60 58字节

Max[Count[#~Partition~2,{a_,b_}/;a∣b]&/@Permutations@#]&

较大的示例需要花费几秒钟。


0

Matlab(120 + 114 = 234)

  function w=t(y,z),w=0;for i=1:size(z,1),w=max(w,1+t([y,z(i,:)],feval(@(d)z(d(:,1)&d(:,2),:),~ismember(z,z(i,:)))));end

主要:

  a=input('');h=bsxfun(@mod,a,a');v=[];for i=1:size(h,1) b=find(~h(i,:));v=[v;[(2:nnz(b))*0+i;b(b~=i)]'];end;t([],v)

  • topper函数由主要部分调用。

  • 输入形式为 [. . .]


0

Matlab的(365)

  j=@(e,x)['b(:,' num2str(e(x)) ')'];r=@(e,y)arrayfun(@(t)['((mod(' j(e,1) ',' j(e,t) ')==0|mod(' j(e,t) ',' j(e,1) ')==0)&',(y<4)*49,[cell2mat(strcat(r(e(setdiff(2:y,t)),y-2),'|')) '0'],')'],2:y,'UniformOutput',0);a=input('');i=nnz(a);i=i-mod(i,2);q=0;while(~q)b=nchoosek(a,i);q=[cell2mat(strcat((r(1:i,i)),'|')) '0'];q=nnz(b(eval(q(q~=0)),:));i=i-2;end;fix((i+2)/2)

  • 这显然更长一些,但却是一个班轮和高管,我设法逃避了perms职能,因为它要花很长时间。

  • 由于使用匿名功能,此功能需要花费大量的精力才能使其安静运行,我欢迎在这里提出建议:)

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.