나누기 관계에서 최대 매칭 찾기


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-complete인지 아는 사람이 있습니까? 가장 작은 "하드"세트는이라고 생각합니다 2,3,4,8,9,18. (해당 목록에있는 각 숫자는 목록에있는 두 개 이상의 다른 숫자의 요소 및 / 또는 배수이지만 하나의 솔루션 만 있습니다.)
Neil

답변:


6

하스켈 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 코드와 동일합니다).

추가 골프 공의 경우 순열의 처음 두 요소가 유효한 쌍일 때마다 접미어의 모든 순열을 재귀 적으로 생성하여 비효율적입니다.


인가 f=필요?
Alex A.

@AlexA. Haskell의 명명되지 않은 함수에 대한 PPCG의 표준 정책이 무엇인지 잘 모르겠지만 몇 가지 다른 Haskell 답변을 확인하고 명명 된 함수를 사용했습니다. 또한 이름없는 함수로 사용하려면 함수 주위에 괄호를 사용해야하므로 어쨌든 같은 바이트 수입니다.
Martin Ender

@nimi 알려 주셔서 감사합니다. :) 단축 될 수있는 다른 것이 있습니까? 수입 chunksOf은 고통 스럽습니다. 나는 더 짧은 동등한 기능이 있는지 알 수있는 Haskell의 표준 라이브러리를 실제로 모른다. 직접 구현하려고 시도했지만 가져 오기보다 2 ~ 3 바이트 길어졌습니다.
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에 메모리가 부족할 수 있습니다).

설명

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에 더 많은 메모리를 사용하도록 지시 할 수 있으며 첫 번째 경우도 잘 작동합니다 (시간이 걸리더라도 알 수 없음).
Martin Ender

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

수학, 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)

  • 이것은 분명히 더 길지만 oneliner와 executive이며, perms영원히 걸리기 때문에 기능 을 벗어날 수 있었습니다 .

  • 이 기능은 익명의 기능으로 인해 조용히 실행하는 데 많은 재난이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.