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

ghosts_in_the_code
źródło
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ą.

Martin Ender
źródło
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.
Martin Ender
źródło
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)
Jakube
źródło
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.

LegionMammal978
źródło
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 [. . .]

Abr001am
źródło
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 :)

Abr001am
źródło