可分性関係の最大一致を見つける


16

正の整数のセットが与えられます。次のようなペアに配置する必要があります。

  • 各ペアには2つの数字が含まれており、その1つは別の倍数です。たとえば、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。(そのリスト内の各数値は、リスト内の少なくとも2つの他の数値の要素および/または倍数ですが、解決策は1つだけです。)
Neil

回答:


6

Haskell、109 107 76 70バイト

33バイトを節約し、Haskellを教えてくれたnimiに感謝します。:)
さらに6バイトを保存してくれたxnorに感謝します。

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

イェイ、私の最初のHaskellゴルフ。これは、これまでのすべての回答と同じように機能します(完全ではありません:各順列で有効なペアの最長プレフィックスの長さをカウントするだけですが、それは同等であり、実際には元のCJamコードが実行したものです)。

余分なゴルフの場合は、順列の最初の2つの要素が有効なペアであるたびに、接尾辞のすべての順列を再帰的に生成することにより、非効率的です。


であるf=必要?
アレックスA.

@AlexA。Haskellの名前のない関数に対するPPCGの標準ポリシーが何であるかはわかりませんが、他のHaskellの回答をいくつか確認し、名前付き関数を使用しました。また、関数を名前のない関数として使用する場合は、技術的に括弧を使用する必要があるため、とにかく同じバイト数になります。
マーティンエンダー

@nimi教えてくれてありがとう。:)他に短縮できるものはありますか?のインポートchunksOfは苦痛です。Haskellの標準ライブラリが、より短い同等の関数があるかどうかを知ることができるかどうか、私は本当に知りません。自分で実装してみましたが、インポートよりも2〜3バイト長くなりました。
マーティンエンダー

ああ、両方[]をキャッチ[_]すると同時に、g x=[]2番目を入れることは本当に賢い。それを試してみます。ありがとう:)
マーティン・エンダー

関数全体を再帰的に定義するには、少し短く見えます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

@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それが永遠にかかるので機能をエスケープすることができました。

  • この関数は、匿名関数のために静かに実行するために多くの修正を必要とします。ここで提案を受け付けています:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.