Gérer des horraires

J’ai un truc ultra urgent pour hier à faire et je bloc sur un problème alacon©.

Je dois gérer des horraires par exemple : 08:00 - 12:00 ; 13:00 - 17:00 et je dois vérifier que ces horraires ne se chevauchent pas. Comment faire ?

Ex à la con qui pose problème :

A B C D 20:00 - 01:00; 02:00 - 06:00 pas de chevauchement 20:00 - 23:00; 00:00 - 05:00 cheuvauchement 17:00 - 01:00; 03:00 - 18:00 cheuvauchement

Dans le second exemple, où est le chevauchement ?

Sinon, il faudrait pas que:

(premier horaire seconde tranche > seconde horaire premiere tranche) ET (second horaire deuxieme tranche < premier horaire premiere tranche)

pour que ce soit ok ?

(ceci est une réponse rapide :stuck_out_tongue: )

[quote=« alt3, post:2, topic: 27697 »]Dans le second exemple, où est le chevauchement ?

Sinon, il faudrait pas que:

(premier horaire seconde tranche > seconde horaire premiere tranche) ET (second horaire deuxieme tranche < premier horaire premiere tranche)

pour que ce soit ok ?

(ceci est une réponse rapide :stuck_out_tongue: )[/quote]

Oui mais non, regarde les exemple lorsque le mec fini à 23:00 et recommence à 00:00 ou lorsque le mec fini à 00:00 et qui reprend à 01:00 dans un cas B > C et dans l’autre B > C

Ben ou est le chevauchement là ?

idem, pour moi ca chevauche pas :stuck_out_tongue:

il faut aussi verifier l’inclusion totale

NON (heure 2eme debut < heure 1er debut ET
heure 2eme fin > heure 1er fin) ET
NON (heure 1er debut < heure 2eme debut ET
heure 1er fin > heure 2eme fin) )

avec une vérification du changement de jour pour éviter tout problème, genre si les 2h sont inférieur au début et fin des autres jeurs, on ajoute un jour

(réponse rapide aussi)

[quote=“alt3, post:4, topic: 27697”]Ben ou est le chevauchement là ?
idem, pour moi ca chevauche pas :P[/quote]

Ben justement, il n’y a pas de chevauchement pourtant :

ne fonctionne pas car 23:00 > 00:00, c’est ce que je voulais t’expliquer.

[quote=« ZGoblin, post:6, topic: 27697 »]Ben justement, il n’y a pas de chevauchement pourtant :
ne fonctionne pas car 23:00 > 00:00, c’est ce que je voulais t’expliquer.[/quote]

Ou 00:00 ca fait aussi la 24:00 :stuck_out_tongue:

et 01:00 ca fait aussi 25:00, faudrai peut-être joué sur des modulos…

Et utiliser un retenue quant tu passes un jour ?

Koubiak

Et en mélangeant un peu toutes les idées ?
Est ce que ca ne permettrait pas de determiner si tu viens de passer un jour ?

int add = 0; si (date de debut du deuxieme horaire < date debut du premier horaire && date de debut du deuxieme horaire < date fin du premier horaire) add = 24;

et apres on fait des test classique :

La solution en vb, le format des horraires est ##:##

[code]’---------------------------------------------------------------------------------------
’ Function F_B_PlageHoraire
’---------------------------------------------------------------------------------------

’---------------------------------------------------------------------------------------
'
Function PlageHorraire(Debut1 As String, Fin1 As String, Debut2 As String, Fin2 As String) As Boolean
Dim DebutSec1 As Long
Dim FinSec1 As Long
Dim DebutSec2 As Long
Dim FinSec2 As Long

Dim Total1 As Long
Dim Total2 As Long

’ Convertion
DebutSec1 = CSeconde(Debut1)
FinSec1 = CSeconde(Fin1)
DebutSec2 = CSeconde(Debut2)
FinSec2 = CSeconde(Fin2)

’ Calcul
Total1 = IIf(((FinSec1 - DebutSec1) < 0), (FinSec1 - DebutSec1) + 86400, (FinSec1 - DebutSec1)) - IIf(((DebutSec2 - DebutSec1) < 0), (DebutSec2 - DebutSec1) + 86400, (DebutSec2 - DebutSec1))
Total2 = IIf(((FinSec2 - DebutSec2) < 0), (FinSec2 - DebutSec2) + 86400, (FinSec2 - DebutSec2)) - IIf(((DebutSec1 - DebutSec2) < 0), (DebutSec1 - DebutSec2) + 86400, (DebutSec1 - DebutSec2))

’ Résultat
PlageHorraire = Total1 > 0 Or Total2 > 0
End Function

‘---------------------------------------------------------------------------------------
’ Function CSeconde
’---------------------------------------------------------------------------------------

’---------------------------------------------------------------------------------------
'
Function CSeconde(Heure As String) As Long
CSeconde = CLng(Split(Heure, “:”)(0)) * 3600 + CLng(Split(Heure, “:”)(1)) * 60
End Function[/code]

L’algo est connu : c’est planning strategy
Par exemple il sert a minimiser le nombre de vol pour les avions tout en couvrant tout les horraires.
T’as juste à verifier dans ton cas qu’un seul avion a etait utilisé…

//edit

Bon aller je trouve pas sur google, mon prof semble renommer les algos :confused:

Tu trie les horraire par heure de depart.
On prend la premiere plage horraire (PH1) on la fou dans le premier avion (A1).
Ensuite si PH2 se superpose a PH1 en comparant heure de debut de PH2 et heure de fin de PH1 on le fout dans un deuxieme avion.
Si on le met allah suite et rebelote… en partant du premier avion

O(nlog(n)).
si tu as utiliser un avion c’est que tes horraires se superposent pas.

Moi j’ai une idée (peut-etre pas la plus optimisée, mais la plus simple à coder).
Son gros avantage, c’est qu’elle ne se limite pas à la vérification de 2 plages horaires, mais d’une infinité :
tu fais une liste de clé / valeur avec comme clé, l’heure de début et comme valeur l’heure de fin de tes inervalles.
ensuite tu prends toutes tes horaires dans une autre liste et tu les tris et tu n’as plus qu’a faire :

[code]Dictionnary<DateTime,DateTime> liste1; // Heures de fin / heures de début d’intervalle
List liste2; // toutes les heures

/*

Ici il faut remplir les listes

*/

liste2.Sort();

for(int i=0; i< liste2.Count; i+=2)
{
if(!liste1.ContainsKey(liste2[i]) || liste1[liste2[i]] != liste2[i+1])
return false;
}
return true;[/code]

Bon ce bout de code est en C#, mais ca peut se faire dans n’importe quel langage.
Attention, niveau perf, je pense pas que ce soit la meilleur façon de faire.

if(!liste1.ContainsKey(liste2[i]) || liste1[liste2[i]] != liste2[i+1])
return false;

C’est pas ?? :

if(!liste1.ContainsKey(liste2[i]) || liste1[liste2[i]] [b]<[/b] liste2[i+1])
  return false;

Non non, c’est bien la première proposition.
En fait les deux reviennent au même mais la première est plus rapide (un test d’égalité / inégalité est plus simple à réaliser qu’un test infériorité / supériorité)

Il faut utiliser les dates concaténées aux heures et pas simplement les heures sinon on ne s’en sort pas au niveau des changements de jours, d’années etc…