Cubra un conjunto con múltiplos

14

Vamos a echar un conjunto de números enteros mayores que 1 y lo llaman X . Definiremos S (i) como el conjunto de todos los miembros de X divisible por i donde i> 1 . Me gustaría elegir de estos subconjuntos un grupo de conjuntos de manera que

  • Su unión es el conjunto X

  • Ningún elemento de X está en dos de los conjuntos.

Por ejemplo, podemos reagruparnos {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}

Algunos conjuntos no se pueden expresar de esta manera. Por ejemplo, si tomamos {3..12}, 12es un múltiplo de 3 y 4 que impide que nuestros conjuntos sean mutuamente excluyentes.

Algunos conjuntos se pueden expresar de múltiples maneras, por ejemplo, {4..8}se pueden representar como

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

pero también se puede representar como

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

Tarea

Nuestro objetivo es escribir un programa que tome un conjunto como entrada y salida con el menor número de subconjuntos que lo cubren de esta manera. Si no hay ninguno, debe generar algún valor que no sea un entero positivo (por ejemplo 0).

Esta es una pregunta de , por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.

Pruebas

{3..11}       -> 5
{4..8}        -> 3
{22,24,26,30} -> 1
{5}           -> 1
Post Rock Garf Hunter
fuente
Si no hay ninguno, debe generar algún valor que no sea un entero positivo (por ejemplo, 0). ¿No puede nuestro programa generar un comportamiento indefinido?
Sr. Xcoder
Además, ¿puedes agregar un caso de prueba como [5..5]? ¿Podemos recibir cosas como [8..4]?
Sr. Xcoder
@ Mr.Xcoder No, no puede. Los programas deberían ser capaces de identificar casos imposibles, no solo recorrerlos para siempre o chocar con ellos.
Post Rock Garf Hunter
1
" 12es un múltiplo de ambos 3y 4evita que nuestros sets sean mutuamente excluyentes ": ¿por qué? No veo nada más en la declaración del problema que requiera 12entrar en ambos subconjuntos.
Peter Taylor
1
Además, ¿qué pasa con los casos de prueba? [22,24,26,30]son todas múltiplos de 2. ¿Estás seguro de que no sería mejor eliminar esto y ponerlo a prueba?
Peter Taylor

Respuestas:

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*

Pruébalo en línea!

-9 bytes gracias a Zacharý
-4 bytes gracias al Sr. Xcoder
-2 bytes utilizando listas en lugar de conjuntos
-5 bytes utilizando en a in [...]lugar de any([a == ...]).
-2 bytes gracias al Sr. Xcoder
-8 bytes fusionando declaraciones
-5 bytes gracias al Sr. Xcoder
-7 bytes gracias al Sr. Xcoder / Zacharý
+7 bytes para corregir el error
-1 byte gracias a los ovs

Nota

Esto es extremadamente lento para números máximos mayores porque de ninguna manera está optimizado; no lo hizo dentro de 2 minutos en el dispositivo del Sr. Xcoder para [22, 24, 26, 30].

Hiperneutrino
fuente
5

Clingo , 51 bytes

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

Manifestación

$ 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
Anders Kaseorg
fuente
Esto parece no detectar casos sin soluciones como x(3..12).(¿o necesito actualizar?). Por cierto, ¿puedes sugerir una buena introducción al clingo?
Christian Sievers
1
@ChristianSievers Vaya, eso fue un error, que ahora he solucionado. Debería salir UNSATISFIABLEen tal caso. Principalmente utilicé la guía Potassco .
Anders Kaseorg
4

Mathematica, 105 bytes

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


Pruébelo en línea,
copie y pegue el código con Ctrl + V,
pegue la entrada al final del código,
presione Mayús + Intro para ejecutar

entrada

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

toma una lista como
salidas de entrada 0 si no hay ninguna

J42161217
fuente
Buen uso deCheck
Keyu Gan
¿Por qué no recuperaste tu primera respuesta una vez que tuviste una versión funcional?
Neil
¿Porque este era un enfoque totalmente nuevo? ¿Hay algún 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

Pruébalo en línea!

Cómo 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

Tómese mucho tiempo para {22,24,26,30}.

nimi
fuente
3

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

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

-5 bytes gracias a Leaky Nun

Pruébalo en línea!

Creo que el tercer caso de prueba funciona, pero es muy lento. 0se emite cuando no hay soluciones.

Explicación (podría haber entendido mal esta explicación):

ṀḊŒ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
Zacharý
fuente
1
18 bytes
Leaky Nun
¡Gracias! ¡Y gracias por no enviar eso usted mismo!
Zacharý
Tengo una solución diferente de 18 bytes más cercana a mi original, me gusta más esta:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý
Woah ... en ṀḊrealidad es un truco genial!
Zacharý
¡Vaya, eso no funciona, y mi reescritura tampoco! Esto debería generar 0, no 1
Zacharý
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))
Tanj
fuente
Um ... ¿olvidó incluir un enlace dentro del nombre del idioma, o en realidad se llama "[Julia]"?
Zacharý
Tienes razón, el nombre es Julia sin corchetes
Tanj
¡Es posible que desee corregir eso en sus otras respuestas también!
Zacharý
¡Vaya, esas fueron muchas respuestas! Y si desea insertar un enlace, la sintaxis es[Text to display](link to website)
Zacharý