Dada una lista de intervalos, realice la unión de ellos y reduzca las superposiciones. Eso significa que las partes superpuestas se reducen. ( [a, b] U [c, d] = [a, d]
si b > c
) Suponiendo todo a <b en todos los intervalos [a, b]
. Implementar en función de una lista de intervalos de entrada -> lista de intervalos de salida. El código más corto gana. No puede usar ninguna biblioteca existente.
Aclaraciones:
- Los intervalos abiertos y cerrados no se distinguen.
- Intervalos para números reales, no enteros. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - No es necesario ordenar los intervalos de salida
- El orden si las entradas no importan
- Las entradas ilegales son solo
[a, b]
dondeb >= a
, no tiene nada que ver con el orden de los intervalos de entrada y el número de intervalos de entrada. - No es necesario que muestre un mensaje de error sobre comportamientos indefinidos
Ejemplos (con líneas 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)
Respuestas:
GolfScript, 32
[[2 4] [3 5]]
Programa de prueba completo:
Ejemplo de invocación:
fuente
Haskell (103)
Creo que es demasiado detallado para Haskell. Gracias a Hoa Long Tam por su función de clasificación.
En Haskell, un intervalo de
a
ab
se denota por[a..b]
. Mi notación es muy similar a la notación matemática. Úselo así:fuente
Ok, aquí está mi crack de 250 caracteres.
La función toma una matriz int y opera en ella in situ. La matriz termina en un 0, y los intervalos pueden darse en cualquier orden.
Salida de muestra:
Programa de muestra:
fuente
perform the union of them
debería conducir a(1,11) (13,18)
, ¿no?([a, b] U [c, d] = [a, d] if b > c)
. Y para el caso, incluso (1, 5) (5, 6) no se combinarían.and
reduzca las superposiciones, noif they overlap
. OK: los siguientesthat means ...
puntos nuevamente en la dirección opuesta.Python, 100 caracteres
genera
Toma todos los puntos finales de los intervalos, elimina los que están estrictamente dentro de otro intervalo, los unifica y los ordena, y los empareja.
fuente
Haskell, 55 caracteres
Si la entrada no está ordenada, entonces 88 caracteres:
Pruebas de funcionamiento:
Supongo que "no se puede usar ninguna biblioteca existente" impide importar
List
y llamarsort
. Si eso fuera legal, la versión sin clasificar tendría solo 71 caracteres.fuente
List
desde el paqueteHaskell98
sería suficiente en mi humilde opinión.Scala, 272 caracteres
Uso:
Crea una matriz e inserta un 1 para cada inicio de intervalo y un -1 para cada final de intervalo. Luego, recorre la matriz agregando los valores a un contador que genera un inicio cada vez que el contador pasa de 0 a 1 y un final cuando pasa de 1 a 0. Probablemente sea innecesariamente complicado.
Salida:
fuente
Perl
(146)(92)(90)Golfé hasta 90 caracteres, usando creativamente el motor regex
ejemplo de uso:
Vamos a explicar un poco este código.
Esta subrutina recibe una matriz de arrayrefs, cada una de las cuales apunta a una matriz que contiene dos elementos, inicio y final del intervalo:
([2, 4], [3, 6], [8, 9])
Para cada aref, generamos una matriz de elementos del primero al último
($_->[0] .. $_->[1])
. luego usamos map para establecer elementos de dichos índices en @h a 1.después de esto,
@h
contendrá unos (para intervalos) o undefs, representados a continuación como guiones para mayor claridad.luego construimos una cadena de @h, agregando 0 para reemplazar undefs con algo más útil (undef + 0 = 0).
$w .= $_+0 for @h;
$ w contiene
011111011
ahora.Es hora de abusar un poco del motor regex.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
después de coincidencias exitosas, las matrices @ - y @ + contienen respectivamente la posición de inicio y finalización de cada coincidencia; El elemento 0 se usa para toda la partida, primero por $ 1, segundo por $ 2 y así sucesivamente.
$+[0]
en realidad contiene la posición del primer carácter no coincidente, por lo que tenemos que restar uno.@r
contiene(2, 6, 8, 9)
ahora.@r
para hacer que el sub regrese
@r
.fuente
[2,3],[4,5]
rendimientos de números reales2 5
Scala
305279 caracteres sin invocación:invocación:
fuente
Brachylog , 12 bytes
Pruébalo en línea!
Una solución deliciosamente declarativa, que toma la entrada como una lista de listas a través de la variable de entrada y genera una lista de listas a través de la variable de salida.
fuente
Clojure, 138 bytes
Esto se acorta a 119 bytes si la entrada es más flexible, es decir, una lista de puntos de inicio de intervalos Y una lista de puntos finales de intervalos:
Tiene que haber una mejor manera.
fuente
Japt , 18 bytes
Esto se siente demasiado tiempo. E / S ordenada, matriz 2D de intervalos.
Intentalo
fuente
Perl 5
-MList::Util=max -n
, 89 bytesPruébalo en línea!
fuente