Cubra um conjunto com múltiplos


14

Vamos dar um conjunto de inteiros superior a 1 e chamá-lo de X . Definiremos S (i) como o conjunto de todos os membros de X divisíveis por i onde i> 1 . Gostaria de escolher dentre esses subconjuntos um grupo de conjuntos que

  • Sua união é o conjunto X

  • Nenhum elemento de X está em dois dos conjuntos.

Por exemplo, podemos reagrupar {3..11}como

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

Alguns conjuntos não podem ser expressos dessa maneira. Por exemplo, se usarmos {3..12}, 12é um múltiplo de 3 e 4, impedindo que nossos sets sejam mutuamente exclusivos.

Alguns conjuntos podem ser expressos de várias maneiras, por exemplo, {4..8}podem ser representados como

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

mas também pode ser representado como

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

Tarefa

Nosso objetivo é escrever um programa que terá um conjunto como entrada e produzirá o menor número de subconjuntos que o cobrem dessa maneira. Se não houver, você deve gerar algum valor que não seja um número inteiro positivo (por exemplo 0).

Esta é uma questão de para que as respostas sejam pontuadas em bytes, com menos bytes sendo melhores.

Testes

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

Se não houver nenhum, você deve gerar algum valor que não seja um número inteiro positivo (por exemplo, 0). Nosso programa não pode resultar em comportamento indefinido?
Mr. Xcoder

Além disso, você pode adicionar um caso de teste como [5..5]? Podemos receber coisas como [8..4]?
Mr. Xcoder

@ Mr.Xcoder Não, não pode. Os programas devem ser capazes de identificar casos impossíveis, não apenas repetir para sempre ou travar neles.
Post Rock Garf Hunter

1
" 12é um múltiplo de ambos 3e 4impede que nossos sets sejam mutuamente exclusivos ": por quê? Não vejo mais nada na declaração do problema que exija 12entrar nos dois subconjuntos.
22417 Peter Peter

1
Além disso, o que há com os casos de teste? [22,24,26,30]são todos múltiplos de 2. Tem certeza de que não seria melhor excluí-lo e colocá-lo na caixa de areia?
22417 Peter Peter

Respostas:


6

Python 2 , 167 bytes

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*

Experimente online!

-9 bytes graças a Zacharý
-4 bytes graças ao Sr. Xcoder
-2 bytes usando listas em vez de conjuntos
-5 bytes usando em a in [...]vez de any([a == ...]).
-2 bytes graças ao Sr. Xcoder
-8 bytes ao mesclar instruções
-5 bytes graças ao Sr. Xcoder
-7 bytes graças ao Sr. Xcoder / Zacharý
+7 bytes para corrigir o erro
-1 byte graças aos ovs

Nota

Isso é extremamente lento para números máximos maiores porque não é de forma alguma otimizado; não em 2 minutos no dispositivo do Sr. Xcoder para [22, 24, 26, 30].


5

Clingo , 51 bytes

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

Demo

$ 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

Isso parece não detectar casos sem soluções como x(3..12).(ou preciso atualizar?). BTW, você pode sugerir uma boa introdução ao clingo?
Christian Sievers

1
@ChristianSievers Opa, isso foi um bug que eu consertei agora. Deverá produzir UNSATISFIABLEnesse caso. Eu principalmente usei o guia Potassco .
Anders Kaseorg 17/07

4

Mathematica, 105 bytes

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


Experimente
copiar e colar o código com ctrl + v,
cole a entrada no final do código,
pressione Shift + Enter para executar

entrada

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

recebe uma lista como entrada
0, se não houver


Bom uso deCheck
Keyu Gan

Por que você não cancelou sua primeira resposta depois de ter uma versão funcional?
Neil

Porque essa era uma abordagem totalmente nova? Existe algum problema?
J42161217

4

Haskell, 136 bytes

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

Experimente online!

Como funciona

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

Tome muito tempo para {22,24,26,30}.


3

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

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

-5 bytes graças a Leaky Nun

Experimente online!

Acho que o terceiro caso de teste funciona, mas é muito lento. 0é emitido quando não há soluções.

Explicação (pode ter entendido errado esta explicação):

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


Obrigado! E obrigado por não enviar isso você mesmo!
Zachary

Eu tenho uma solução diferente de 18 bytes mais perto do meu original, eu pessoalmente gosto mais deste:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý

Woah ... ṀḊna verdade é um truque muito legal!
Zacharý

Opa, isso não funciona, e nem minha reescrita! Isso deve
gerar

2

Julia, 91 bytes

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

Hum ... você esqueceu de incluir um link no nome do idioma, ou é realmente chamado "[Julia]"?
Zacharý

Você está certo, o nome é Julia sem parênteses
Tanj 16/07/17

Você também pode corrigir isso em suas outras respostas!
Zacharý

Uau, isso foi muitas respostas! E se você deseja inserir um link, a sintaxe é[Text to display](link to website)
Zacharý
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.