Znajdź maksymalne dopasowanie w relacji podzielności


16

Otrzymujesz zestaw dodatnich liczb całkowitych. Musisz ułożyć je w pary, aby:

  • Każda para zawiera 2 liczby, z których jedna jest wielokrotnością innej. Na przykład 8 to wielokrotność 4, a 9 to wielokrotność 9.
  • Jeśli ta sama liczba występuje wiele razy w zestawie początkowym, można jej użyć wiele razy w parach; numer można nawet powiązać z innym wystąpieniem tego samego numeru
  • Uzyskuje się maksymalną możliwą liczbę par.

Dane wyjściowe muszą być liczbą par. Najkrótszy kod wygrywa.

Przykładowe dane

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
Czy ktoś wie, czy ten problem jest NP-zupełny? Myślę, że najmniejszym „twardym” zestawem jest 2,3,4,8,9,18. (Każda liczba na tej liście jest współczynnikiem i / lub wielokrotnością co najmniej dwóch innych liczb na liście, ale ma tylko jedno rozwiązanie.)
Neil

Odpowiedzi:


6

Haskell, 109 107 76 70 bajtów

Dzięki nim za uratowanie 33 bajtów i nauczenie mnie więcej Haskell. :)
Dzięki xnor za zapisanie kolejnych 6 bajtów.

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

Tak, mój pierwszy golf Haskell. Działa tak samo jak wszystkie dotychczasowe odpowiedzi (cóż, niezupełnie: liczy tylko długość najdłuższego prefiksu prawidłowych par w każdej permutacji, ale jest to równoważne i tak naprawdę zrobił mój oryginalny kod CJam).

Dla dodatkowej golfa jest to również wyjątkowo nieefektywne poprzez rekurencyjne generowanie wszystkich permutacji sufiksu za każdym razem, gdy pierwsze dwa elementy permutacji są prawidłową parą.


Czy to f=konieczne?
Alex A.,

@AlexA. Nie jestem pewien, jakie są standardowe zasady PPCG dla nienazwanych funkcji w Haskell, ale sprawdziłem kilka innych odpowiedzi Haskell i użyli nazwanych funkcji. Ponadto technicznie musisz użyć nawiasów wokół funkcji, jeśli chcesz użyć jej jako funkcji bez nazwy, więc i tak będzie to ta sama liczba bajtów.
Martin Ender,

@nimi Dziękujemy za poinformowanie mnie. :) Czy widzisz coś jeszcze, co można by skrócić? Import chunksOfjest bolesny. Naprawdę nie znam standardowej biblioteki Haskella, aby móc stwierdzić, czy istnieje krótsza równoważna funkcja. Próbowałem go zaimplementować sam, ale wyszło dwa lub trzy bajty dłużej niż import.
Martin Ender

ohhh, łapanie obu jednocześnie []i [_]stawianie na g x=[]drugim miejscu jest naprawdę sprytne. Spróbuję. Dzięki :)
Martin Ender

Wygląda nieco krótszy, aby zdefiniować cały funkcję rekurencyjnie: f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1].
xnor

3

CJam, 22 18 bajtów

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

Wypróbuj online.

Oczekuje danych wejściowych w postaci listy w stylu CJam.

To jest trochę nieefektywne w przypadku większych list (a Java prawdopodobnie zabraknie pamięci, chyba że dasz jej więcej).

Wyjaśnienie

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.

Nie daje wyniku dla [1 2 3 4 5 6 7 8 9 10]Jednak, [7 1 9 9 4 9 9 1 3 9 8 1]która jest dłuższą listą, działa poprawnie. Dlaczego?
ghosts_in_the_code

@ghosts_in_the_code Ponieważ ten pierwszy ma bardziej wyraźne permutacje. 10! = 3628800, ale 12! / 5! / 3! = 665280. Więc zabrakło pamięci dla pierwszego przypadku. Jeśli uruchomisz go z konsoli za pomocą interpretera Java, możesz powiedzieć Javie, aby używała więcej pamięci, a pierwszy przypadek również by działał (chociaż może to chwilę potrwać, nie wiem).
Martin Ender

3

Pyth, 13 bajtów

eSm/%Mcd2Z.pQ

Czas i złożoność przechowywania jest naprawdę okropna. Pierwszą rzeczą, którą robię, jest utworzenie listy ze wszystkimi permutacjami pierwotnej listy. To wymaga n*n!miejsca do przechowywania. Listy wejściowe o długości 9 zajmują już dość dużo czasu.

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

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 bajtów

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

Większe przykłady trwają kilka sekund.


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

Główny:

  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)

  • funkcja cylinder jest wywoływana przez część główną.

  • dane wejściowe są w formie [. . .]


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)

  • To najwyraźniej jest dłuższe, ale oneliner i wykonawczy, i udało mi się uciec perms funkcji, ponieważ trwa to wiecznie.

  • Ta funkcja wymaga wielu ponownych uruchomień, aby działać cicho ze względu na anonimowe funkcje, jestem otwarty na sugestie tutaj :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.