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)));z∈t?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.