Trova la corrispondenza massima nella relazione di divisibilità


16

Ti viene dato un set di numeri interi positivi. È necessario disporli in coppie in modo tale che:

  • Ogni coppia contiene 2 numeri, uno dei quali è un multiplo dell'altro. Ad esempio, 8 è un multiplo di 4 e 9 è un multiplo di 9.
  • Se lo stesso numero si presenta più volte nel set iniziale, può essere usato più volte nelle coppie; un numero può anche essere associato a un'altra ricorrenza dello stesso numero
  • Si ottiene il numero massimo possibile di coppie.

L'output deve essere il numero di coppie. Il codice più corto vince.

Dati di esempio

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
Qualcuno sa se questo problema è NP-completo? Penso che il più piccolo set "difficile" sia 2,3,4,8,9,18. (Ogni numero in quell'elenco è un fattore e / o multiplo di almeno altri due numeri nell'elenco, ma ha solo una soluzione.)
Neil

Risposte:


6

Haskell, 109 107 76 70 byte

Grazie a nimi per aver salvato 33 byte e avermi insegnato un po 'di più Haskell. :)
Grazie a xnor per aver salvato altri 6 byte.

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

Sì, il mio primo golf Haskell. Funziona allo stesso modo di tutte le risposte finora (beh, non del tutto: conta solo la lunghezza del prefisso più lungo delle coppie valide in ogni permutazione, ma è equivalente ed è effettivamente quello che ha fatto il mio codice CJam originale).

Per maggiore golfitude è anche inefficace in quanto genera ricorsivamente tutte le permutazioni del suffisso ogni volta che i primi due elementi di una permutazione sono una coppia valida.


È f=necessario?
Alex A.

@AlexA. Non sono sicuro di quale sia la politica standard su PPCG per le funzioni senza nome in Haskell, ma ho controllato alcune altre risposte di Haskell e hanno usato funzioni denominate. Inoltre, tecnicamente dovresti usare le parentesi attorno alla funzione se volessi usarla come una funzione senza nome, quindi credo che lo stesso numero di byte sarebbe lo stesso.
Martin Ender,

@nimi Grazie per avermelo fatto notare. :) Vedi qualcos'altro che potrebbe essere abbreviato? L'importazione per chunksOfè dolorosa. Non conosco davvero la libreria standard di Haskell per essere in grado di dire se esiste una funzione equivalente più breve. Ho provato a implementarlo da solo, ma è uscito due o tre byte in più rispetto all'importazione.
Martin Ender,

ohhh, catturare entrambi []e [_]allo stesso tempo mettere il g x=[]secondo è davvero intelligente. Ci proverò. Grazie :)
Martin Ender il

Sembra un po 'più breve per definire l'intera funzione in modo ricorsivo: f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1].
xnor

3

CJam, 22 18 byte

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

Provalo online.

Prevede input sotto forma di un elenco in stile CJam.

Questo è un po ' inefficiente per elenchi più grandi (e Java probabilmente esaurirà la memoria a meno che tu non lo dia di più).

Spiegazione

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.

Non fornisce output per [1 2 3 4 5 6 7 8 9 10]Tuttavia, [7 1 9 9 4 9 9 1 3 9 8 1]che è un elenco più lungo, funziona correttamente. Perché?
ghosts_in_the_code il

@ghosts_in_the_code Perché il primo ha permutazioni più distinte. 10! = 3628800, ma 12! / 5! / 3! = 665280. Quindi esaurisce la memoria per il primo caso. Se lo avessi eseguito dalla console con l'interprete Java, potresti dire a Java di usare più memoria e anche il primo caso funzionerebbe (anche se potrebbe volerci un po ', non lo so).
Martin Ender,

3

Pyth, 13 byte

eSm/%Mcd2Z.pQ

Il tempo e la complessità di archiviazione sono davvero terribili. La prima cosa che faccio è creare un elenco con tutte le permutazioni dell'elenco originale. Questo richiede n*n!archiviazione. Gli elenchi di input con lunghezza 9 richiedono già molto tempo.

Provalo online: dimostrazione o suite di test

Spiegazione:

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 byte

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

Richiede alcuni secondi per gli esempi più grandi.


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

principale:

  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)

  • la funzione topper è chiamata dalla parte principale.

  • l'input è nella forma [. . .]


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)

  • Apparentemente è più lungo, ma diretto ed esecutivo, e sono riuscito a sfuggire alla permsfunzione perché ci vuole sempre.

  • Questa funzione richiede molte riprese per funzionare in modo silenzioso a causa di funzioni anonime, sono aperto ai suggerimenti qui :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.