Dada uma lista de intervalos, faça a união deles e reduza as sobreposições. Isso significa que as peças sobrepostas são reduzidas. ([a, b] U [c, d] = [a, d]
se b > c
) Assumindo todos a <b em todos os intervalos [a, b]
. Implementar como uma função de uma lista de intervalos de entrada -> lista de intervalos de saída. O menor código vence. Você não pode usar nenhuma biblioteca existente.
Esclarecimentos:
- Intervalos abertos e fechados não são diferenciados.
- Intervalos para números reais, não números inteiros. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - Não há necessidade de ordenar intervalos de saída
- A ordem se as entradas não importam
- Entradas ilegais são apenas
[a, b]
ondeb >= a
, não tem nada a ver com a ordem dos intervalos de entrada e o número de intervalos de entrada. - Você não precisa mostrar uma mensagem de erro sobre comportamentos indefinidos
Exemplos (com linhas numéricas)
[2, 4], [7, 9] --> [2, 4], [7, 9]
234
789
-> 234 789
[1, 5], [2, 10] --> [1, 10] (overlapping [2, 5] reduced)
12345
234567890
-> 1234567890
[2, 4], [3, 6], [8, 9] -> [2, 6], [8, 9]
234
3456
89
-> 23456 89
[4, 2], [2, 2] -> (undefined behavior: against the assumption)
Respostas:
GolfScript, 32
[[2 4] [3 5]]
Programa de teste completo:
Exemplo de invocação:
fonte
Haskell (103)
Eu acho que é muito detalhado para Haskell. Agradecemos a Hoa Long Tam por sua função de classificação.
Em Haskell, um intervalo de
a
ab
é indicado por[a..b]
. Minha notação é muito semelhante à notação matemática. Use-o assim:fonte
Ok, aqui está o meu crack de 250 caracteres.
A função pega uma matriz int e opera in-situ. A matriz é finalizada com um 0 e os intervalos podem ser dados em qualquer ordem.
Saída de amostra:
Programa de exemplo:
fonte
perform the union of them
deve levar a(1,11) (13,18)
, não deveria?([a, b] U [c, d] = [a, d] if b > c)
. E, nesse caso, nem (1, 5) (5, 6) seriam combinados.and
reduz as sobreposições - nãoif they overlap
. OK - os seguintesthat means ...
pontos novamente na direção oposta.Python, 100 caracteres
gera
Toma todos os pontos finais dos intervalos, remove todos os que estão estritamente dentro de outro intervalo, os unifica e os classifica e os emparelha.
fonte
Haskell, 55 caracteres
Se a entrada não estiver classificada, 88 caracteres:
Execuções de teste:
Estou assumindo que "não é possível usar nenhuma biblioteca existente" impede a importação
List
e a chamadasort
. Se isso fosse legal, a versão não classificada teria apenas 71 caracteres.fonte
List
do pacoteHaskell98
seria suficiente IMHO.Scala, 272 caracteres
Uso:
Cria uma matriz e insere 1 para cada início de intervalo e -1 para cada final de intervalo. Em seguida, percorre a matriz adicionando os valores a um contador, dando início sempre que o contador passa de 0 a 1 e termina quando passa de 1 a 0. Provavelmente, é desnecessariamente complicado.
Resultado:
fonte
Perl
(146)(92)(90)jogou até 90 caracteres, usando o mecanismo regex de forma criativa
exemplo de uso:
vamos explicar um pouco esse código.
essa sub-rotina recebe uma matriz de arrayrefs, cada uma apontando para uma matriz contendo dois elementos, início e fim do intervalo:
([2, 4], [3, 6], [8, 9])
para cada aref, geramos uma matriz de elementos do primeiro ao último
($_->[0] .. $_->[1])
. então usamos map para definir elementos desses índices em @h para 1.depois disso,
@h
conterá os (por intervalos) ou os undefs, descritos abaixo como hífens para maior clareza.Em seguida, criamos uma string a partir de @h, adicionando 0 para substituir undefs por algo mais útil (undef + 0 = 0).
$w .= $_+0 for @h;
$ w contém
011111011
agora.é hora de abusar um pouco do mecanismo de expressão regular.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
após as correspondências bem-sucedidas, as matrizes @ - e @ + contêm respectivamente as posições de início e fim de cada partida; O 0º elemento é usado para toda a partida, primeiro por US $ 1, segundo por US $ 2 e assim por diante.
$+[0]
na verdade, contém a posição do primeiro caractere não correspondente, então precisamos subtrair um.@r
contém(2, 6, 8, 9)
agora.@r
para fazer o sub retorno
@r
.fonte
[2,3],[4,5]
rendimentos2 5
Scala
305279 caracteres sem invocação:invocação:
fonte
Braquilog , 12 bytes
Experimente online!
Uma solução deliciosamente declarativa, recebendo entrada como uma lista de listas através da variável de entrada e produzindo uma lista de listas através da variável de saída.
fonte
Clojure, 138 bytes
Isso reduz para 119 bytes se a entrada for mais flexível, ou seja, uma lista dos pontos iniciais dos intervalos E uma lista dos pontos finais dos intervalos:
Tem que haver uma maneira melhor.
fonte
Japt , 18 bytes
Isso parece muito longo. E / S conforme ordenado, matriz 2D de intervalos.
Tente
fonte
Perl 5
-MList::Util=max -n
, 89 bytesExperimente online!
fonte