Couvrir un ensemble de multiples


14

Permet de prendre un ensemble de nombres entiers supérieurs à 1 et appeler X . Nous définirons S (i) comme l'ensemble de tous les membres de X divisible par ii> 1 . Voudrait choisir parmi ces sous-ensembles un groupe d'ensembles tels que

  • Leur union est l'ensemble X

  • Aucun élément de X ne figure dans deux des ensembles.

Par exemple , nous pouvons regrouper {3..11}comme

      {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}

Certains ensembles ne peuvent pas être exprimés de cette façon. Par exemple, si nous prenons {3..12}, 12est un multiple de 3 et 4 empêchant nos ensembles de s'exclure mutuellement.

Certains ensembles peuvent être exprimés de plusieurs manières, par exemple {4..8}peuvent être représentés comme

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

mais il peut également être représenté comme

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

Tâche

Notre objectif est d'écrire un programme qui prendra un ensemble en entrée et produira le plus petit nombre de sous-ensembles qui le couvrent de cette façon. S'il n'y en a pas, vous devez sortir une valeur autre qu'un entier positif (par exemple 0).

Il s'agit d'une question de donc les réponses seront notées en octets, avec moins d'octets étant mieux.

Les tests

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

S'il n'y en a pas, vous devez sortir une valeur autre qu'un entier positif (par exemple 0). Notre programme ne peut-il pas entraîner un comportement non défini à la place?
M. Xcoder

Pouvez-vous également ajouter un cas de test comme [5..5]? Pouvons-nous recevoir des choses comme [8..4]?
M. Xcoder

@ Mr.Xcoder Non, il se peut que non. Les programmes devraient être capables d'identifier les cas impossibles, pas seulement de boucler éternellement ou de planter dessus.
Post Rock Garf Hunter

1
" 12est un multiple des deux 3et 4empêche nos ensembles de s'exclure mutuellement ": pourquoi? Je ne vois rien d'autre dans l'énoncé du problème qui nécessite 12d'aller dans les deux sous-ensembles.
Peter Taylor

1
Aussi, quels sont les cas de test? [22,24,26,30]sont tous des multiples de 2. Êtes-vous sûr qu'il ne serait pas préférable de le supprimer et de le mettre en sandbox?
Peter Taylor

Réponses:


6

Python 2 , 167 octets

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*

Essayez-le en ligne!

-9 octets grâce à Zacharý
-4 octets grâce à M. Xcoder
-2 octets en utilisant des listes au lieu d'ensembles
-5 octets en utilisant a in [...]plutôt que any([a == ...]).
-2 octets grâce à M. Xcoder
-8 octets en fusionnant les déclarations
-5 octets grâce à M. Xcoder
-7 octets grâce à M. Xcoder / Zacharý
+7 octets pour corriger le bogue
-1 octet grâce aux ovs

Remarque

Ceci est extrêmement lent pour des nombres maximums plus importants car il n'est en aucun cas optimisé; il n'a pas été dans les 2 minutes sur l'appareil de M. Xcoder pour [22, 24, 26, 30].


5

Clingo , 51 octets

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

Démo

$ 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

Cela semble ne pas détecter les cas sans solutions comme x(3..12).(ou dois-je mettre à jour?). BTW, pouvez-vous suggérer une bonne introduction au clingo?
Christian Sievers

1
@ChristianSievers Oups, c'était un bug, que j'ai maintenant corrigé. Il devrait sortir UNSATISFIABLEdans un tel cas. J'ai surtout utilisé le guide Potassco .
Anders Kaseorg

4

Mathematica, 105 octets

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


Essayez-le en ligne,
copiez et collez le code avec ctrl + v,
collez l'entrée à la fin du code,
appuyez sur Maj + Entrée pour exécuter

contribution

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

prend une liste comme
sorties d' entrée 0 s'il n'y en a pas


Check
Bonne

Pourquoi n'avez-vous pas supprimé votre première réponse une fois que vous avez eu une version de travail?
Neil

Parce que c'était une approche totalement nouvelle? Y a-t-il un problème?
J42161217

4

Haskell, 136 octets

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

Essayez-le en ligne!

Comment ça fonctionne

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

Prenez beaucoup de temps {22,24,26,30}.


3

Gelée, 38 35 34 33 31 28 25 24 23 20 19 octets

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

-5 octets grâce à Leaky Nun

Essayez-le en ligne!

Je pense que le troisième cas de test fonctionne, mais il est très lent. 0est émis en l'absence de solutions.

Explication (peut-être que cette explication est fausse):

ṀḊŒ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


Merci! Et merci de ne pas l'avoir soumis vous-même!
Zacharý

J'ai une solution différente de 18 octets plus proche de l'original, je préfère celle-ci:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý

Woah ... ṀḊest en fait un truc vraiment cool!
Zacharý

Oups, cela ne fonctionne pas, et ma réécriture non plus! Cela devrait produire 0, pas 1
Zacharý

2

Julia, 91 octets

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

Euh ... avez-vous oublié d'inclure un lien dans le nom de la langue, ou est-il réellement nommé "[Julia]"?
Zacharý

Vous avez raison, le nom est Julia sans parenthèses
Tanj

Vous voudrez peut-être aussi corriger cela dans vos autres réponses!
Zacharý

Wow, c'était beaucoup de réponses! Et si vous voulez insérer un lien, la syntaxe est[Text to display](link to website)
Zacharý
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.