Encontre a interseção de 2 conjuntos na notação de intervalo unido
Dados dois conjuntos de números reais descritos como a união de intervalos, produza uma descrição da interseção desses dois conjuntos como uma união do mesmo tipo de intervalo.
Os conjuntos de entrada sempre consistem em uniões de intervalos, de modo que cada intervalo comece e termine em um número inteiro diferente (ou seja, nenhum intervalo tem a medida zero). No entanto, diferentes intervalos no mesmo conjunto podem começar ou terminar no mesmo número inteiro ou se sobrepor.
O conjunto de saída também deve ser uma união de intervalos que começam e terminam em números inteiros, mas nenhum intervalo na saída pode se sobrepor a nenhum outro mesmo em um único número inteiro.
A entrada pode assumir qualquer formato que seja adequado ao seu idioma de escolha, contanto que consista em duas listas de pares de números inteiros.
Por exemplo, você pode representar o conjunto como:
[-10,-4]u[1,5]u[19,20]
Ou como:
[[-10,-4],[1,5],[19,20]]
Ou como:
[-10,-4;1,5;19,20]
Sua representação de saída deve ser idêntica à sua representação de entrada (exceto que é apenas uma lista de intervalos em vez de dois).
Exemplos / casos de teste:
Entrada:
[[[-90,-4],[4,90]],[[-50,50]]]
Resultado:
[[-50,-4],[4,50]]
Em outras palavras, estamos cruzando o conjunto que contém todos os números reais entre -90 e -4 e todos os números reais entre 4 e 90 com o conjunto que contém todos os números reais entre -50 e 50. A interseção é o conjunto que contém todos números reais entre -50 e -4 e todos os números reais entre 4 e 50. Uma explicação mais 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]"
Resultado:
"[-1,0]u[3,4]u[6,8]"
Entrada:
[-9,-8;-8,0;-7,-6;-5,-4]
[-7,-5;-1,0;-8,-1]
Resultado:
[-8,0]
Saída inválida (mesmo que represente o mesmo conjunto):
[-8,0;-7,-5;-5,0]
Pontuação:
Isso é código-golfe pelo que a fonte mais curta em bytes vence, potencialmente modificada pelo seguinte bônus.
Bônus:
-15% se você também suporta infinito positivo e negativo como limites de intervalos. Você pode escolher quais tokens representam esses números. (E sim, infinito é um número nos hiperreais; P)
fonte
[[[4,90],[-90,-4]],[[-50,50]]]
Respostas:
Mathematica, 41 bytes - 15% = 34,85
O Mathematica possui uma função interna para interseção de intervalos.
Exemplo:
fonte
Interval
.Haskell, 145 bytes
Exemplo 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)]
.Como funciona:
Estou colocando os valores A "meia"
x.5
na lista, porque eu preciso distinguir(1,2),(3,4)
a partir(1,4)
. Semx.5
, ambos se tornariam[1,2,3,4]
, mas comx.5
o primeiro se torna[1,1.5,2,3,3.5,4]
(o que falta2.5
) e o segundo[1,1.5,2,2.5,3,3.5,4]
.fonte
Ruby, 90 bytes
Mapeia cada um dos dois conjuntos para uma matriz plana, obtém a interseção do conjunto dessas matrizes e, em seguida, divide o resultado em partes contínuas e mapeia cada parte no primeiro e no último elemento. Mole-mole.
Uso:
fonte
s = [[[1,2],[3,4]], [[1,2],[3,4]]]
? (Minha versão rubi não temslice_when
, por isso não posso me testar)[[1, 4]]
. Oslice_when
método foi adicionado em torno do Ruby 2.2, eu acho.2.2
não está na entradas = [[[1,2],[3,4]], [[1,2],[3,4]]]
, mas na sua saída[[1, 4]]
.