Dados conjuntos múltiples, por ejemplo s1={2,3,7}
, s2={1,2,4,7,8}
y s3={4,7}
, un diagrama de Venn visualiza cada conjunto mediante una curva cerrada y establece elementos que están dentro o fuera del perímetro de la curva, dependiendo de si son elementos del conjunto o no. Como todos los elementos del conjunto aparecen solo una vez en el diagrama de Venn, las curvas que representan cada conjunto deben superponerse si hay un elemento presente en más de un conjunto. Llamamos a cada uno de estos superpuestos una celda del diagrama de Venn.
Esta explicación puede ser un poco confusa, así que echemos un vistazo a un ejemplo.
Ejemplo
Un diagrama de Venn para conjuntos s1
, s2
y s3
podría verse así:
Las células de este diagrama de Venn se (leen de arriba a abajo, de izquierda a derecha) {1,8}
, {2}
, {7}
, {4}
, {3}
, {}
y {}
.
En la práctica, comúnmente se encuentran solo diagramas de Venn de dos o tres conjuntos, porque la representación de los diagramas de Venn de cuatro o más conjuntos no es muy clara. Sin embargo, existen, por ejemplo, para seis conjuntos:
CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309
La tarea
Dado un conjunto no vacío de conjuntos de enteros positivos en cualquier representación razonable, devuelva el conjunto de celdas del diagrama de Venn de los conjuntos de entrada. Específicamente, no se necesita una representación gráfica.
- Puede escribir un programa completo o una función.
- Puede devolver tantos conjuntos vacíos como celdas vacías (es decir, una lista de todas las celdas) en lugar de solo un conjunto vacío (es decir, el conjunto de celdas).
- Algunas formas razonables de entrada para el ejemplo de arriba incluyen, pero no se limitan a
{{2,3,7},{1,2,4,7,8},{4,7}}
,[[2,3,7],[1,2,4,7,8],[4,7]]
,"2,3,7;1,2,4,7,8;4,7"
o"2 3 7\n1 2 4 7 8\n4 7"
. Si tiene dudas sobre si el formato de entrada elegido es aceptable, no dude en preguntar en un comentario. - Su formato de salida debe coincidir con su formato de entrada, si es posible. Tenga en cuenta que esta regla requiere que su formato pueda mostrar conjuntos vacíos sin ambigüedad.
- Este es el código de golf , así que trate de usar la menor cantidad de bytes posible en el idioma que elija. Para alentar la competencia por idioma en lugar de entre idiomas, no aceptaré una respuesta.
Casos de prueba
Aquí hay algunas entradas junto con posibles salidas:
input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}
fuente
{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}
?Respuestas:
Haskell , 71 bytes
Una función anónima que toma una lista de listas de enteros y devuelve una lista similar.
Usar como
(foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]]
.Pruébalo en línea!
Cómo funciona
\\
(diferencia) yintersect
deData.List
.[]
.x
es el conjunto actual que se agregará al diagrama yr
es la lista de celdas ya construidas.x\\(id=<<r)
es el subconjunto de elementosx
que no se encuentran en ninguna de las celdas ya construidas.[intersect x,(\\x)]<*>r
divide cada celdar
según si sus elementos están dentrox
o no.fuente
Jalea ,
1417 bytesPruébalo en línea!
Envío de funciones (porque el formato en el que Jelly imprime las listas por defecto no es de ida y vuelta, no puede leer su propio formato de salida, sino que una función entra y sale en el mismo formato). El enlace TIO contiene un pie de página que ejecuta la función e imprime su salida en el mismo formato en que se analiza la entrada.
Explicación
El requisito de que generemos al menos un conjunto vacío si no se usan todas las secciones del diagrama de Venn logra ocupar más de la mitad del programa aquí (es responsable de
’
eso, se asegura de que tengamos al menos un grupo para elementos que no coincidan, lo que nos permite para realizar un seguimiento de cuántos conjuntos había originalmente, más los últimos nueve bytes del código fuente, excepto elĠ
). La forma básica en que lo implementamos es asegurarnos de que todos los subconjuntos del diagrama de Venn 2 ^ n tengan al menos una entrada, agregando una entrada ficticia que llene la sección "sin conjuntos" y (más adelante) una entrada ficticia para cada otra sección, luegoĠ
generará un grupo para cada subconjunto, que podemos eliminar usandoṖṖ€
.fuente
Perl 5, 79 bytes
Toma información como una lista de matrices anónimas como ([2,3,7], [1,2,4,7,8], [4,7]). Produce un hash donde las claves son etiquetas y los valores son matrices anónimas correspondientes a los conjuntos de salida.
Como parte de un programa completo:
Explicación:
Da a cada conjunto un número entero como una etiqueta,
$.
. Crea un hash que almacena un número entero para cada elemento único$_
. Agrega2**$.
para cada conjunto que$_
aparece en, haciendo efectivamente un mapa binario que muestra en qué conjuntos aparece cada elemento. Finalmente, crea una matriz anónima para cada celda del diagrama de Venn y empuja los elementos que aparecen en los conjuntos correspondientes a la matriz. Entonces, cada elemento de cada matriz existe en los mismos conjuntos y, por lo tanto, en la misma celda del diagrama de Venn.fuente
Pyth , 11 bytes
Banco de pruebas.
Cómo funciona
Cada región del diagrama de Venn representa elementos que están en [ciertas combinaciones de los conjuntos] pero no en [los otros conjuntos].
Entonces, generamos todas las combinaciones posibles (y eliminamos las combinaciones vacías) al encontrar el conjunto de potencia de la entrada.
Para cada combinación generada, encontramos la intersección de los conjuntos en la combinación y filtramos los elementos que están en los otros conjuntos.
fuente
JavaScript (ES6), 123 bytes
fuente