À partir d'une liste d'intervalles, effectuez l'union de ceux-ci et réduisez les chevauchements. Cela signifie que les parties qui se chevauchent sont réduites. ( [a, b] U [c, d] = [a, d]
si b > c
) En supposant tout a <b dans tous les intervalles [a, b]
. Implémenter en fonction d'une liste d'intervalles d'entrée -> liste d'intervalles de sortie. Le code le plus court gagne. Vous ne pouvez utiliser aucune bibliothèque existante.
Clarifications:
- Les intervalles ouverts et fermés ne sont pas distingués.
- Intervalles pour des nombres réels, pas des entiers. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - Pas besoin de trier les intervalles de sortie
- L'ordre si les entrées n'ont pas d'importance
- Les entrées illégales ne sont
[a, b]
là queb >= a
, cela n'a rien à voir avec l'ordre des intervalles d'entrée et le nombre d'intervalles d'entrée. - Vous n'avez pas besoin d'afficher un message d'erreur sur les comportements non définis
Exemples (avec des lignes numériques)
[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)
Réponses:
GolfScript, 32
[[2 4] [3 5]]
Programme de test complet:
Exemple d'appel:
la source
Haskell (103)
Je pense que c'est beaucoup trop verbeux pour Haskell. Merci à Hoa Long Tam pour sa fonction de tri.
Dans Haskell, un intervalle de
a
àb
est désigné par[a..b]
. Ma notation est très similaire à la notation mathématique. Utilisez-le comme ceci:la source
Ok, voici mon crack de 250 caractères.
La fonction prend un tableau int et opère sur celui-ci in situ. Le tableau se termine par un 0 et les intervalles peuvent être donnés dans n'importe quel ordre.
Exemple de sortie:
Exemple de programme:
la source
perform the union of them
devrait conduire à(1,11) (13,18)
, non?([a, b] U [c, d] = [a, d] if b > c)
. Et d'ailleurs, même (1, 5) (5, 6) ne serait pas combiné.and
réduisez les chevauchements - pasif they overlap
. OK - lesthat means ...
points suivants à nouveau dans la direction opposée.Python, 100 caractères
génère
Prend tous les points de terminaison des intervalles, supprime ceux qui se trouvent strictement dans un autre intervalle, les unifie et les trie, et les associe.
la source
Haskell, 55 personnages
Si l'entrée n'est pas triée, alors 88 caractères:
Essais:
Je suppose que "ne peut utiliser aucune bibliothèque existante" empêche l'importation
List
et l'appelsort
. Si c'était légal, la version non triée ne compterait que 71 caractères.la source
List
partir du paquetHaskell98
serait suffisante à mon humble avis.Scala, 272 caractères
Usage:
Crée un tableau et insère un 1 pour chaque début d'intervalle et un -1 pour chaque fin d'intervalle. Parcourt ensuite le tableau en ajoutant les valeurs à un compteur produisant un début chaque fois que le compteur passe de 0 à 1 et une fin lorsqu'il passe de 1 à 0. Probablement inutilement compliqué.
Production:
la source
Perl
(146)(92)(90)joué à 90 caractères, en utilisant de manière créative le moteur regex
exemple d'utilisation:
expliquons un peu ce code.
ce sous-programme reçoit un tableau de références de tableau, chacun pointant vers un tableau contenant deux éléments, début et fin de l'intervalle:
([2, 4], [3, 6], [8, 9])
pour chaque aref, nous générons un tableau d'éléments du premier au dernier
($_->[0] .. $_->[1])
. nous utilisons ensuite map pour définir les éléments de ces index dans @h à 1.après cela,
@h
contiendra soit ceux (pour les intervalles) ou undefs, représentés ci-dessous comme des tirets pour plus de clarté.ensuite, nous construisons une chaîne à partir de @h, en ajoutant 0 pour remplacer undefs par quelque chose de plus utile (undef + 0 = 0).
$w .= $_+0 for @h;
$ w contient
011111011
maintenant.il est temps d'abuser un peu du moteur d'expression régulière.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
après des correspondances réussies, les tableaux @ - et @ + contiennent respectivement la position de début et de fin de chaque correspondance; Le 0ème élément est utilisé pour la correspondance entière, d'abord pour $ 1, deuxième pour $ 2 et ainsi de suite.
$+[0]
contient en fait la position du premier caractère non correspondant, nous devons donc en soustraire un.@r
contient(2, 6, 8, 9)
maintenant.@r
pour faire le sous-retour
@r
.la source
[2,3],[4,5]
rendements réels2 5
Scala
305279 caractères sans invocation:invocation:
la source
Brachylog , 12 octets
Essayez-le en ligne!
Une solution délicieusement déclarative, prenant l'entrée comme une liste de listes via la variable d'entrée et sortant une liste de listes via la variable de sortie.
la source
Clojure, 138 octets
Cela raccourcit à 119 octets si l'entrée est plus flexible, à savoir une liste de points de départ d'intervalles ET une liste de points de fin d'intervalles:
Il doit y avoir une meilleure façon.
la source
Japt , 18 octets
Cela semble beaucoup trop long. E / S triées, tableau d'intervalles 2D.
Essayez-le
la source
Perl 5
-MList::Util=max -n
, 89 octetsEssayez-le en ligne!
la source