Sua tarefa aqui é simples:
Dada uma lista de conjuntos inteiros, encontre a união do conjunto. Em outras palavras, encontre a lista mais curta de conjuntos inteiros que contêm todos os elementos na lista original de conjuntos (mas nenhum outro elemento). Por exemplo:
[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
Os conjuntos são anotados usando a notação de intervalo: [1,4]
significa os números inteiros 1,2,3,4
. Os conjuntos também podem ser ilimitados: [3,]
significa todos os números inteiros >= 3
e [,-1]
todos os números inteiros <= -1
. É garantido que o primeiro elemento do intervalo não será maior que o segundo.
Você pode escolher conjuntos na notação de seqüência de caracteres ou usar tuplas de 2 elementos, usando um constante não inteiro como o valor "infinito". Você pode usar duas constantes distintas para representar o limite superior infinito e o limite inferior infinito. Por exemplo, em Javascript, você pode usar [3,{}]
para anotar todos os números inteiros >= 3
, desde que você use consistentemente {}
em todos os casos de teste.
Casos de teste:
[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]
Isso é código-golfe , então faça sua resposta o mais curta possível!
fonte
Infinity
vez disso{}
?[1.0, 3.0]
vez de[1, 3]
?[1.0, 3.0], [4.0, 5.0]
, ainda deve se tornar[1.0, 5.0]
Infinity
e-Infinity
como entrada, ele pode receber-999999
e999999
(ou ainda maior / menor)?Respostas:
R +
intervals
,90 8781 bytesExperimente online!
Entrada é uma lista de intervalos.
-Inf
eInf
são R embutidos para menos / mais infinito. Saída é uma matriz de colunas de intervalos.Geralmente não é um fã do uso de bibliotecas não padrão, mas essa foi divertida. O TIO não está
intervals
instalado. Você pode experimentá-lo em sua própria instalação ou em https://rdrr.io/snippets/O
intervals
pacote suportatype = "Z"
intervalos reais e inteiros ( ) e areduce
função é incorporada ao que o desafio deseja, mas a saída parece padrão para abrir intervalos, portanto, é necessário para obter o resultado desejado.close_intervals
+c(1,-1)
A versão antiga tinha exemplos na lista de listas que podem ser convenientes, por isso deixei o link aqui.
fonte
function(...)close_intervals(reduce(Intervals(rbind(...),type="Z")))
. Ou melhor ainda, você pode verificar com op se eles permitem uma matriz como entrada.reduce
eReduce
lá dentro.f=function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1)
:?JavaScript (ES6), 103 bytes
Guardou 1 byte graças a @Shaggy Guardou
1 byte graças a @KevinCruijssen
Espera
+/-Infinity
valores infinitos.Experimente online!
Quão?
Primeiro, ordenamos os intervalos pelo limite inferior, do mais baixo para o mais alto. Os limites superiores são ignorados.
No final do processo, criamos um último intervalo com os limites atuais .[ m , M]
Comentado
fonte
p<=M+1
pode serp<M+2
?Python 2 ,
118113112111106105104101 bytesEconomizou um byte graças a Mr.Xcoder, um graças a Jonathan Frech e três graças a Dead Possum.
Experimente online!
fonte
(b,c),
salva um byte.g
significa que sua funçãof
não é reutilizável e, portanto, é inválida?return
transformaçõesprint
para outro byte.Ruby ,
8976 bytesExperimente online!
Classifique a matriz e achatar anexando todas as faixas à primeira: se uma faixa se sobrepuser à anterior, descarte 2 elementos dos últimos 3 (mantendo apenas o máximo).
Desprenda tudo no final.
fonte
Pascal (FPC) ,
367362357 bytesExperimente online!
Um procedimento que utiliza uma matriz dinâmica de registros que consiste em 2 limites de faixa, modifica a matriz no local e a grava na saída padrão, uma faixa por linha. (Desculpe por essa frase distorcida.) Usa
1/0
para ligar e-1/0
desligar ilimitado.Versão legível
Seria bom apenas retornar a matriz com o número corrigido de elementos, mas a matriz dinâmica passada para a função / procedimento não é mais uma matriz dinâmica ... Primeiro, eu achei isso , depois há uma excelente e impressionante explicação .
Essa é a melhor estrutura de dados que eu encontrei para reduzir o código. Se você tiver melhores opções, sinta-se à vontade para fazer uma sugestão.
fonte
Wolfram Language (Mathematica) , 57 bytes
Experimente online!
Recebe a entrada como uma lista de listas que
{a,b}
representam o intervalo[a,b]
, ondea
pode estar-Infinity
eb
pode estarInfinity
.Usa o built-in
IntervalUnion
, mas é claro que temos que massagear os intervalos primeiro. Para fingir que os intervalos são inteiros, adicionamos 1 ao limite superior (certificando-se de que a união de[1,3]
e[4,9]
seja[1,9]
). No final, desfazemos esta operação e transformamos o resultado novamente em uma lista de listas.Há também uma abordagem completamente diferente, com 73 bytes :
Aqui, após classificar os intervalos, apenas substituímos dois intervalos consecutivos pela união deles sempre que esse fosse um intervalo único e repetimos até que não haja mais nenhuma operação a ser feita.
fonte
05AB1E (herdado) ,
887978 bytesO infinito é inserido como o alfabeto em minúsculas (
'abcdefghijklmnopqrstuvwxyz'
).Experimente online ou verifique todos os casos de teste .
Nota importante: Se houvesse um real
Infinity
e-Infinity
, teria sido4342 bytes . Tãopouco mais de 50% emtorno de 30% é uma solução alternativa para a falta deInfinity
..Experimente on-line (com
Infinity
substituído por9999999999
e-Infinity
substituído por-9999999999
).Definitivamente pode ser jogado golfe substancialmente. No final, ficou muito, muito feio, cheio de soluções alternativas. Mas, por enquanto, estou feliz que esteja funcionando.
Explicação:
fonte
C (clang) ,
346342 bytesBandeiras do compilador
-DP=printf("(%d,%d)\n"
,-DB=a[i+1]
e,-DA=a[i]
Experimente online!
fonte
i
valor global da.while(A)i++;
deve serfor(i=0;A;)i++;
definido explicitamentei=0
antes de usá-lo no loop while, em vez de usar seu0
valor padrão no nível global. Não sei mais por que, mas é necessário de acordo com as meta regras. Principalmente porque os métodos devem ser independentes / reutilizáveis, sem a necessidade de redefinir os valores globais entre as chamadas de método, IIRC.i
valor globalStax ,
4639 bytesExecute e depure
Este programa recebe entrada na notação de string especificada originalmente.
fonte