Copri un set con multipli


14

Consente di prendere una serie di numeri interi maggiori di 1 e lo chiamano X . Definiremo S (i) come l'insieme di tutti i membri di X divisibili per i dove i> 1 . Vorrei scegliere tra questi sottogruppi un gruppo di insiemi tale che

  • La loro unione è l'insieme X

  • Nessun elemento di X è in due dei set.

Ad esempio possiamo raggruppare {3..11}come

      {3,4,5,6,7,8,9,10,11}
S(3): {3,    6,    9,     }
S(4): {  4,      8,       }
S(5): {    5,        10,  }
S(7): {        7,         }
S(11):{                 11}

Alcuni set non possono essere espressi in questo modo. Ad esempio, se prendiamo {3..12}, 12è un multiplo di 3 e 4 che impedisce ai nostri set di escludersi a vicenda.

Alcuni insiemi possono essere espressi in più modi, ad esempio {4..8}possono essere rappresentati come

      {4,5,6,7,8}
S(4): {4,      8}
S(5): {  5,     }
S(6): {    6,   }
S(7): {      7, }

ma può anche essere rappresentato come

      {4,5,6,7,8}
S(2): {4,  6,  8}
S(5): {  5,     }
S(7): {      7, }

Compito

Il nostro obiettivo è scrivere un programma che prenderà un set come input e produca il minor numero di sottoinsiemi che lo coprono in questo modo. Se non ce ne sono, dovresti generare un valore diverso da un numero intero positivo (ad esempio 0).

Questa è una domanda di quindi le risposte verranno classificate in byte, con meno byte migliori.

test

{3..11}       -> 5
{4..8}        -> 3
{22,24,26,30} -> 1
{5}           -> 1

Se non ce ne sono, è necessario generare un valore diverso da un numero intero positivo (ad esempio 0). Il nostro programma non può invece comportare un comportamento indefinito?
Mr. Xcoder,

Inoltre, puoi aggiungere un test case come [5..5]? Possiamo ricevere cose come [8..4]?
Mr. Xcoder,

@ Mr.Xcoder No, non è possibile. I programmi dovrebbero essere in grado di identificare casi impossibili, non solo loop per sempre o crash su di essi.
Post Rock Garf Hunter,

1
" 12è un multiplo di entrambi 3e 4impedisce ai nostri set di escludersi a vicenda ": perché? Non vedo nient'altro nella dichiarazione del problema che richiede 12di andare in entrambi i sottoinsiemi.
Peter Taylor,

1
Inoltre, cosa succede con i casi di test? [22,24,26,30]sono tutti multipli di 2. Sei sicuro che non sarebbe meglio eliminare questo e sandbox?
Peter Taylor,

Risposte:


6

Python 2 , 167 byte

lambda a:([q for q in range(a[-1])if a in[sorted(sum(j,[]))for j in combinations([[p for p in a if p%i<1]for i in range(2,1+a[-1])],q)]]+[0])[0]
from itertools import*

Provalo online!

-9 byte grazie a Zacharý
-4 byte grazie a Mr. Xcoder
-2 byte usando gli elenchi anziché gli insiemi
-5 byte usando a in [...]anziché any([a == ...]).
-2 byte grazie a Mr. Xcoder
-8 byte unendo le dichiarazioni
-5 byte grazie a Mr. Xcoder
-7 byte grazie a Mr. Xcoder / Zacharý
+7 byte per correggere bug
-1 byte grazie a ovs

Nota

Questo è estremamente lento per numeri massimi più grandi perché non è in alcun modo ottimizzato; non è stato eseguito entro 2 minuti sul dispositivo di Mr. Xcoder per [22, 24, 26, 30].


5

Clingo , 51 byte

{s(2..X)}:-x(X).:-x(X),{s(I):X\I=0}!=1.:~s(I).[1,I]

dimostrazione

$ echo 'x(3..11).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) s(3) s(4) s(5) s(7) s(11)
Optimization: 5
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 5
Calls        : 1
Time         : 0.003s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.010s
$ echo 'x(4..8).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(4) x(5) x(6) x(7) x(8) s(3) s(4) s(5) s(7)
Optimization: 4
Answer: 2
x(4) x(5) x(6) x(7) x(8) s(2) s(5) s(7)
Optimization: 3
OPTIMUM FOUND

Models       : 2
  Optimum    : yes
Optimization : 3
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(22;24;26;30).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(22) x(24) x(26) x(30) s(5) s(8) s(22) s(26)
Optimization: 4
Answer: 2
x(22) x(24) x(26) x(30) s(3) s(22) s(26)
Optimization: 3
Answer: 3
x(22) x(24) x(26) x(30) s(2)
Optimization: 1
OPTIMUM FOUND

Models       : 3
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.004s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(5).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(5) s(5)
Optimization: 1
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

Questo sembra non rilevare casi senza soluzioni come x(3..12).(o devo aggiornare?). A proposito, puoi suggerire una buona introduzione al clingo?
Christian Sievers,

1
@ChristianSievers Oops, quello era un bug, che ora ho risolto. Dovrebbe uscire UNSATISFIABLEin tal caso. Ho usato principalmente la guida di Potassco .
Anders Kaseorg,

4

Mathematica, 105 byte

Length@Select[Subsets@Table[Select[s,Mod[#,i]==0&],{i,2,Max[s=#]}],Sort@Flatten@#==Sort@s&][[1]]~Check~0&


Provalo online
copia e incolla il codice con ctrl + v,
incolla l'input alla fine del codice,
premi Maiusc + Invio per eseguire

ingresso

[{} 3,4,5,6,7,8,9,10,11]

prende un elenco come input
output 0 se non ce ne sono


Buon uso diCheck
Keyu Gan,

Perché non hai ripristinato la tua prima risposta una volta che hai avuto una versione funzionante?
Neil,

Perché questo era un approccio totalmente nuovo? C'è un problema?
J42161217,

4

Haskell, 136 byte

import Data.List
f l|m<-maximum l=(sort[n|(n,c)<-[(length s,[i|j<-s,i<-[j,2*j..m],elem i l])|s<-subsequences[2..m]],c\\l==l\\c]++[0])!!0

Provalo online!

Come funziona

f l     =                           -- input set is l
   |m<-maximum l                    -- bind m to maximum of l
       [   |s<-subsequences[2..m]]  -- for all subsequences s of [2..m]
        (length s, )                -- make a pair where the first element is the length of s
            [i|j<-s,i<-[j,2*j..m],elem i l]
                                    -- and the second element all multiples of the numbers of s that are also in l
     [n|(n,c)<-       ,c\\l==l\\c]  -- for all such pairs (n,c), keep the n when c has the same elements as l, i.e. each element exactly once
   sort[ ]++[0]                     -- sort those n and append a 0 (if there's no match, the list of n is empty)
 (     )!!0                         -- pick the first element

Prenditi molto tempo per {22,24,26,30}.


3

Gelatina, 38 35 34 33 31 28 25 24 23 20 19 byte

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ

-5 byte grazie a Leaky Nun

Provalo online!

Penso che il terzo caso di test funzioni, ma è molto lento. 0viene emesso quando non ci sono soluzioni.

Spiegazione (potrebbe aver sbagliato questa spiegazione):

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ     (input z)
ṀḊ                      - 2 .. max(z)
  ŒP                    - powerset
    ð                   - new dyadic chain
     %þ@⁹               - modulo table of z and that
         ¬              - logical not
          S             - sum
           ḟ1           - filter out 1's
             ðÐḟ        - filter out elements that satisfy that condition
                L€      - length of each element
                  Ḣ     - first element


Grazie! E grazie per non averlo inviato tu!
Zacharý,

Ho una soluzione a 18 byte diversa più vicina al mio originale, mi piace di più questa personale:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý

Woah ... in ṀḊrealtà è un trucco davvero fantastico!
Zacharý,

Spiacenti, non funziona e nemmeno la mia riscrittura! Questo dovrebbe produrre 0, non 1
Zacharý

2

Julia, 91 byte

x->(t=[];for i in x z=findfirst(x->x==0,i%(2:maximum(x)));zt?1:push!(t,z) end;length(t))

Uhm ... hai dimenticato di includere un link nel nome della lingua o in realtà si chiama "[Julia]"?
Zacharý,

Hai ragione, il nome è Julia senza parentesi
Tanj

Potresti voler aggiustarlo anche sulle altre tue risposte!
Zacharý,

Wow, sono state molte le risposte! E se si desidera inserire un collegamento, la sintassi è[Text to display](link to website)
Zacharý,
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.