Encuentre la intersección de 2 conjuntos en notación de intervalo unido
Dados dos conjuntos de números reales descritos como la unión de intervalos, genera una descripción de la intersección de estos dos conjuntos como una unión del mismo tipo de intervalo.
Los conjuntos de entrada siempre consistirán en uniones de intervalos de modo que cada intervalo comience y termine en un número entero diferente (es decir, ningún intervalo tiene medida cero). Sin embargo, diferentes intervalos en el mismo conjunto pueden comenzar o terminar en el mismo entero o superponerse.
El conjunto de salida también debe ser una unión de intervalos que comienzan y terminan en enteros, pero ningún intervalo en la salida puede solaparse con ningún otro, incluso en un solo entero.
La entrada puede tomar cualquier forma que sea adecuada para su idioma de elección, siempre que consista en dos listas de pares de enteros.
Por ejemplo, puede representar el conjunto como:
[-10,-4]u[1,5]u[19,20]
O como:
[[-10,-4],[1,5],[19,20]]
O como:
[-10,-4;1,5;19,20]
Su representación de salida debe ser idéntica a su representación de entrada (excepto que es solo una lista de intervalos en lugar de dos).
Ejemplos / Casos de prueba:
Entrada:
[[[-90,-4],[4,90]],[[-50,50]]]
Salida:
[[-50,-4],[4,50]]
En otras palabras, estamos intersectando el conjunto que contiene todos los números reales entre -90 y -4 y todos los números reales entre 4 y 90 con el conjunto que contiene todos los números reales entre -50 y 50. La intersección es el conjunto que contiene todos números reales entre -50 y -4 y todos los números reales entre 4 y 50. Una explicación más visual:
-90~~~~~-4 4~~~~~90 intersected with
-50~~~~~~~~50 yields:
-50~-4 4~~50
Entrada:
"[-2,0]u[2,4]u[6,8]
[-1,1]u[3,5]u[5,9]"
Salida:
"[-1,0]u[3,4]u[6,8]"
Entrada:
[-9,-8;-8,0;-7,-6;-5,-4]
[-7,-5;-1,0;-8,-1]
Salida:
[-8,0]
Salida no válida (aunque represente el mismo conjunto):
[-8,0;-7,-5;-5,0]
Puntuación:
Este es el código de golf, por lo que la fuente más corta en bytes gana, tal como se modifica potencialmente con el siguiente bono.
Prima:
-15% si también admite infinito positivo y negativo como límites de intervalos. Puede elegir qué token (s) representan estos números. (Y sí, el infinito es un número en los hiperreales; P)
fuente
[[[4,90],[-90,-4]],[[-50,50]]]
Respuestas:
Mathematica, 41 bytes - 15% = 34.85
Mathematica tiene una función incorporada para la intersección de intervalos.
Ejemplo:
fuente
Interval
.Haskell, 145 bytes
Ejemplo de uso:
[(-2.0,0.0),(2.0,4.0),(5.0,6.0),(6.0,8.0)] # [(-1.0,1.0),(3.0,5.0),(5.0,9.0)]
->[(-1.0,0.0),(3.0,4.0),(5.0,8.0)]
.Cómo funciona:
Estoy poniendo los-valores "medio"
x.5
en la lista, porque necesito distinguir(1,2),(3,4)
entre(1,4)
. Sinx.5
, ambos se convertirían[1,2,3,4]
, pero conx.5
el primero se convierte[1,1.5,2,3,3.5,4]
(que falta2.5
) y el segundo[1,1.5,2,2.5,3,3.5,4]
.fuente
Rubí, 90 bytes.
Asigna cada uno de los dos conjuntos a una matriz plana, obtiene la intersección establecida de esas matrices, luego divide el resultado en fragmentos continuos y asigna cada fragmento al primer y último elemento. Pan comido.
Uso:
fuente
s = [[[1,2],[3,4]], [[1,2],[3,4]]]
? (Mi versión ruby no tieneslice_when
, así que no puedo[[1, 4]]
. Elslice_when
método fue agregado en algún lugar alrededor de Ruby 2.2, creo.2.2
lo que no está en la entradas = [[[1,2],[3,4]], [[1,2],[3,4]]]
, sino en su salida[[1, 4]]
.