Su tarea aquí es simple:
Dada una lista de conjuntos enteros, encuentre la unión de conjuntos. En otras palabras, encuentre la lista más corta de conjuntos enteros que contenga todos los elementos en la lista original de conjuntos (pero no otros elementos). Por ejemplo:
[1,5] and [3,9] becomes [1,9] as it contains all of the elements in both [1,5] and [3,9]
[1,3] and [5,9] stays as [1,3] and [5,9], because you don't want to include 4
Los conjuntos se anotan usando notación de rango: [1,4]
significa los enteros 1,2,3,4
. Los conjuntos también pueden ser ilimitados: [3,]
significa todos los enteros >= 3
y [,-1]
significa todos los enteros <= -1
. Se garantiza que el primer elemento del rango no será mayor que el segundo.
Puede optar por tomar conjuntos en notación de cadena, o puede usar tuplas de 2 elementos, usando un constante no entero como el valor "infinito". Puede usar dos constantes distintas para representar el límite superior infinito y el límite inferior infinito. Por ejemplo, en Javascript, puede usar [3,{}]
para anotar todos los enteros >= 3
, siempre y cuando lo haya usado {}
en todos los casos de prueba.
Casos de prueba:
[1,3] => [1,3]
[1,] => [1,]
[,9] => [,9]
[,] => [,]
[1,3],[4,9] => [1,9]
[1,5],[8,9] => [1,5],[8,9]
[1,5],[1,5] => [1,5]
[1,5],[3,7] => [1,7]
[-10,7],[1,5] => [-10,7]
[1,1],[2,2],[3,3] => [1,3]
[3,7],[1,5] => [1,7]
[1,4],[8,] => [1,4],[8,]
[1,4],[-1,] => [-1,]
[1,4],[,5] => [,5]
[1,4],[,-10] => [1,4],[,-10]
[1,4],[,] => [,]
[1,4],[3,7],[8,9],[11,20] => [1,9],[11,20]
Este es el código de golf , ¡así que haga su respuesta lo más breve posible!
fuente
Infinity
en su lugar{}
?[1.0, 3.0]
lugar de[1, 3]
?[1.0, 3.0], [4.0, 5.0]
, todavía debería convertirse en[1.0, 5.0]
Infinity
y-Infinity
como entrada, ¿está permitido tomar-999999
y999999
(o incluso más grande / más pequeño) en su lugar?Respuestas:
R +
intervals
,90 8781 bytesPruébalo en línea!
La entrada es una lista de intervalos.
-Inf
yInf
son R incorporados para menos / más infinito. La salida es una matriz de columnas de intervalos.Por lo general, no soy fanático del uso de bibliotecas no estándar, pero esta fue divertida. TIO no tiene
intervals
instalado. Puede probarlo en su propia instalación o en https://rdrr.io/snippets/El
intervals
paquete admitetype = "Z"
intervalos reales y enteros ( ) y lareduce
función está integrada para lo que el desafío quiere, pero la salida parece tener intervalos predeterminados para abrirse, por lo que es necesaria para obtener el resultado deseado.close_intervals
+c(1,-1)
La versión anterior tenía ejemplos en la lista de listas que podrían ser convenientes, así que he dejado el enlace aquí.
fuente
function(...)close_intervals(reduce(Intervals(rbind(...),type="Z")))
. O incluso mejor, puede verificar con op si permiten una matriz como entrada.reduce
yReduce
allí.f=function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1)
:?JavaScript (ES6), 103 bytes
Guardado 1 byte gracias a @Shaggy
Guardado 1 byte gracias a @KevinCruijssen
Espera
+/-Infinity
valores infinitos.Pruébalo en línea!
¿Cómo?
Primero clasificamos los intervalos por su límite inferior, de menor a mayor. Los límites superiores se ignoran.
Luego iteramos sobre los intervalos ordenados[pn,qn] , mientras hacemos un seguimiento de los límites inferior y superior actuales m y M , inicializados en p1 y q1 respectivamente.
Para cada intervalo[pn,qn] :
Al final del proceso, creamos un último intervalo con los límites actuales[m,M] .
Comentado
fuente
p<=M+1
puede serp<M+2
?Pitón 2 ,
118113112111106105104101 bytesAhorré un byte gracias a Mr.Xcoder, uno gracias a Jonathan Frech y tres gracias a Dead Possum.
Pruébalo en línea!
fuente
(b,c),
Guarda un byte.g
significa que su funciónf
no es reutilizable y, por lo tanto, no es válida?return
cambiosprint
para otro byte.Rubí ,
8976 bytesPruébalo en línea!
Ordene la matriz, luego aplánela agregando todos los rangos al primero: si un rango se superpone al anterior, descarte 2 elementos de los últimos 3 (manteniendo solo el máximo).
Despliega todo al final.
fuente
Pascal (FPC) ,
367362357 bytesPruébalo en línea!
Un procedimiento que toma una matriz dinámica de registros que consta de 2 límites de rango, modifica la matriz en su lugar y luego la escribe en la salida estándar, un rango por línea. (Perdón por esa frase retorcida).
1/0
para arriba y-1/0
abajo sin límite.Versión legible
Sería bueno simplemente devolver la matriz con el número corregido de elementos, pero la matriz dinámica pasada a la función / procedimiento ya no es una matriz dinámica ... Primero encontré esto , luego está esto excelente explicación alucinante .
Esta es la mejor estructura de datos que pude encontrar para acortar el código. Si tiene mejores opciones, no dude en hacer una sugerencia.
fuente
Wolfram Language (Mathematica) , 57 bytes
Pruébalo en línea!
Toma la entrada como una lista de listas que
{a,b}
representan el intervalo[a,b]
, dondea
puede-Infinity
yb
puede estarInfinity
.Utiliza el incorporado
IntervalUnion
, pero, por supuesto, primero tenemos que masajear los intervalos para darle forma. Para pretender que los intervalos son enteros, agregamos 1 al límite superior (asegurándonos de que la unión de[1,3]
y[4,9]
sea[1,9]
). Al final, deshacemos esta operación y volvemos el resultado a una lista de listas.También hay un enfoque completamente diferente, que registra 73 bytes :
Aquí, después de ordenar los intervalos, simplemente reemplazamos dos intervalos consecutivos por su unión siempre que sea un intervalo único, y repetimos hasta que no quede tal operación por hacer.
fuente
05AB1E (heredado) ,
887978 bytesEl infinito se ingresa como el alfabeto en minúsculas (
'abcdefghijklmnopqrstuvwxyz'
).Pruébelo en línea o verifique todos los casos de prueba .
Nota importante: si hubiera un real
Infinity
y-Infinity
, en su lugar, habría sido4342 bytes . Tanpoco más del 50%,alrededor del 30%, es una solución temporal por la falta deInfinity
...Pruébelo en línea (con
Infinity
reemplazado por9999999999
y-Infinity
reemplazado por-9999999999
).Definitivamente se puede jugar al golf sustancialmente. Al final resultó muy, muy feo, lleno de soluciones. Pero por ahora me alegra que esté funcionando.
Explicación:
fuente
C (sonido metálico) ,
346342 bytesOpciones del compilador
-DP=printf("(%d,%d)\n"
,-DB=a[i+1]
y-DA=a[i]
Pruébalo en línea!
fuente
i
el valor global de.while(A)i++;
debefor(i=0;A;)i++;
establecerse explícitamentei=0
antes de usarlo en el ciclo while, en lugar de usar su0
valor predeterminado a nivel global. Ya no estoy seguro de por qué, pero se requiere de acuerdo con las meta reglas. Principalmente porque los métodos deben ser autocontenidos / reutilizables, sin tener que restablecer los valores globales entre llamadas a métodos, IIRC.i
valor globalStax ,
4639 bytesEjecutar y depurarlo
Este programa toma la entrada en la notación de cadena especificada originalmente.
fuente