Bölünebilirlik ilişkisinde maksimum eşleştirmeyi bulun


16

Size bir dizi pozitif tamsayı verilir. Onları çiftler halinde düzenlemelisiniz:

  • Her çift, biri diğerinin katları olan 2 sayı içerir. Örneğin, 8, 4'ün katıdır ve 9, 9'un katıdır.
  • Aynı sayı ilk kümede birçok kez ortaya çıkarsa, çiftlerde birçok kez kullanılabilir; bir sayı, aynı sayının başka bir örneğiyle bile eşleştirilebilir
  • Mümkün olan en fazla çift sayısı elde edilir.

Çıktı, çift sayısı olmalıdır. En kısa kod kazanır.

Örnek veri

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
Bu sorunun NP-tam olup olmadığını bilen var mı? Bence en küçük “sert” set 2,3,4,8,9,18. (Bu listedeki her sayı, listedeki en az iki diğer sayının bir faktörü ve / veya katlarıdır, ancak yalnızca bir çözümü vardır.)
Neil

Yanıtlar:


6

Haskell, 109 107 76 70 bayt

33 bayt kurtarıp bana biraz daha Haskell öğrettiği için nimi'ye teşekkürler. :)
Başka 6 bayt kaydettiği için xnor'a teşekkürler.

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

Yay, ilk Haskell golfüm. Şimdiye kadar olan tüm cevaplarla aynı şekilde çalışır (iyi, tam olarak değil: sadece her permütasyondaki geçerli çiftlerin en uzun önekinin uzunluğunu sayar, ancak bu eşdeğerdir ve aslında orijinal CJam kodumun yaptığı şeydir).

Ekstra golfitude için, bir permütasyonun ilk iki unsuru geçerli bir çift olduğunda, son ekin tüm permütasyonlarını tekrar tekrar üreterek ekstra verimsizdir.


f=gerekli?
Alex A.

@AlexA. Haskell'deki adlandırılmamış işlevler için PPCG'deki standart politikanın ne olduğundan emin değilim, ancak birkaç diğer Haskell yanıtını kontrol ettim ve adlandırılmış işlevleri kullandılar. Ayrıca, adsız bir işlev olarak kullanmak isterseniz, işlevin etrafında parantez kullanmanız gerekir, bu yüzden sanırım yine de aynı bayt sayısı olurdu.
Martin Ender

@nimi Bana bildirdiğiniz için teşekkürler. :) Kısaltılabilecek başka bir şey görüyor musunuz? İthalat chunksOfacı verici. Haskell'in standart kütüphanesinin daha kısa bir eşdeğer fonksiyon olup olmadığını anlayabilmeyi gerçekten bilmiyorum. Kendim uygulamayı denedim, ancak ithalattan iki veya üç bayt daha uzun çıktı.
Martin Ender

ohhh, ikisini birden yakalamak []ve [_]aynı zamanda ikinciyi yakalamak g x=[]gerçekten zekidir. Bunu deneyeceğim. Teşekkürler :)
Martin Ender

Yinelemeli bütün işlevini tanımlamak için biraz daha kısa görünüyor: f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1].
xnor

3

CJam, 22 18 bayt

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

Çevrimiçi deneyin.

CJam stil listesi biçiminde girdi bekler.

Bu, daha büyük listeler için biraz verimsizdir (ve daha fazla vermedikçe Java'nın belleği tükenir).

açıklama

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.

İçin O çıktı vermez [1 2 3 4 5 6 7 8 9 10]Ancak [7 1 9 9 4 9 9 1 3 9 8 1]daha uzun bir liste olan düzgün çalışıyor. Neden?
ghosts_in_the_code

@ghosts_in_the_code Çünkü öncekinin daha belirgin permütasyonları var. 10! = 3628800, ama 12! / 5! / 3! = 665280. Yani ilk durum için hafızası tükeniyor. Java yorumlayıcıyla konsoldan çalıştırdıysanız, Java'ya daha fazla bellek kullanmasını söyleyebilirsiniz ve ilk durum da işe yarayacaktır (biraz zaman alabilir, bilmiyorum).
Martin Ender

3

Pyth, 13 bayt

eSm/%Mcd2Z.pQ

Zaman ve depolama karmaşıklığı gerçekten korkunç. İlk yaptığım ilk listenin tüm permütasyonları ile bir liste oluşturmak. Bu n*n!depolamayı gerektirir. 9 uzunluğundaki giriş listeleri zaten oldukça uzun sürüyor.

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

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 bayt

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

Daha büyük örnekler için birkaç saniye sürer.


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

ana:

  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)

  • kaban işlevi ana kısım tarafından çağrılır.

  • giriş formda [. . .]


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)

  • Görünüşe göre daha uzun, ama oneliner ve yönetici ve permssonsuza kadar sürdüğü için işlevden kaçmayı başardım .

  • Bu işlev anonim işlevler nedeniyle sessiz çalışması için birçok reprises alır, ben burada önerilere açık m :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.