Trouver l'intersection de 2 ensembles dans la notation d'intervalle unifié
Étant donné deux ensembles de nombres réels décrits comme l'union d'intervalles, affichez une description de l'intersection de ces deux ensembles comme une union du même type d'intervalle.
Les ensembles d'entrée seront toujours constitués d'unions d'intervalles de sorte que chaque intervalle commence et se termine à un entier différent (c'est-à-dire qu'aucun intervalle n'a la mesure zéro). Cependant, différents intervalles dans le même ensemble peuvent commencer ou se terminer au même entier ou se chevaucher.
L'ensemble de sortie doit également être une union d'intervalles qui commencent et se terminent à des entiers, mais aucun intervalle dans la sortie ne peut se chevaucher, même à un seul entier.
L'entrée peut prendre n'importe quelle forme adaptée à la langue de votre choix, à condition qu'elle se compose de deux listes de paires d'entiers.
Par exemple, vous pouvez représenter l'ensemble comme:
[-10,-4]u[1,5]u[19,20]
Ou comme:
[[-10,-4],[1,5],[19,20]]
Ou comme:
[-10,-4;1,5;19,20]
Votre représentation de sortie doit être identique à votre représentation d'entrée (sauf qu'il ne s'agit que d'une liste d'intervalles au lieu de deux).
Exemples / cas de test:
Contribution:
[[[-90,-4],[4,90]],[[-50,50]]]
Production:
[[-50,-4],[4,50]]
En d'autres termes, nous croisons l'ensemble qui contient tous les nombres réels entre -90 et -4 et tous les nombres réels entre 4 et 90 avec l'ensemble qui contient tous les nombres réels entre -50 et 50. L'intersection est l'ensemble contenant tous les nombres réels entre -50 et -4 et tous les nombres réels entre 4 et 50. Une explication plus visuelle:
-90~~~~~-4 4~~~~~90 intersected with
-50~~~~~~~~50 yields:
-50~-4 4~~50
Contribution:
"[-2,0]u[2,4]u[6,8]
[-1,1]u[3,5]u[5,9]"
Production:
"[-1,0]u[3,4]u[6,8]"
Contribution:
[-9,-8;-8,0;-7,-6;-5,-4]
[-7,-5;-1,0;-8,-1]
Production:
[-8,0]
Sortie non valide (même si elle représente le même ensemble):
[-8,0;-7,-5;-5,0]
Notation:
C'est le code-golf, donc la source la plus courte en octets gagne, comme potentiellement modifiée par le bonus suivant.
Prime:
-15% si vous supportez également l'infini positif et négatif comme bornes d'intervalles. Vous pouvez choisir quel (s) jeton (s) représentent ces numéros. (Et oui, l'infini est un nombre dans les hyperréalités; P)
la source
[[[4,90],[-90,-4]],[[-50,50]]]
Réponses:
Mathematica, 41 octets - 15% = 34,85
Mathematica a une fonction intégrée pour l'intersection d'intervalles.
Exemple:
la source
Interval
.Haskell, 145 octets
Exemple d'utilisation:
[(-2.0,0.0),(2.0,4.0),(5.0,6.0),(6.0,8.0)] # [(-1.0,1.0),(3.0,5.0),(5.0,9.0)]
->[(-1.0,0.0),(3.0,4.0),(5.0,8.0)]
.Comment ça fonctionne:
Je mets les -values « demi »
x.5
dans la liste, parce que je dois distinguer(1,2),(3,4)
de(1,4)
. Sansx.5
, les deux deviendraient[1,2,3,4]
, mais avecx.5
le 1er devient[1,1.5,2,3,3.5,4]
(qui manque2.5
) et le second[1,1.5,2,2.5,3,3.5,4]
.la source
Rubis, 90 octets
Mappe chacun des deux ensembles à un tableau plat, obtient l'intersection de l'ensemble de ces tableaux, puis découpe le résultat en morceaux continus et mappe chaque morceau dans le premier et le dernier élément. Peasy facile.
Usage:
la source
s = [[[1,2],[3,4]], [[1,2],[3,4]]]
? (Ma version rubis n'a passlice_when
, donc je ne peux pas me tester)[[1, 4]]
. Laslice_when
méthode a été ajoutée quelque part autour de Ruby 2.2 je pense.2.2
n'est donc pas dans l'entrées = [[[1,2],[3,4]], [[1,2],[3,4]]]
, mais dans votre sortie[[1, 4]]
.