Schrift
[thread]6731[/thread]

Inhalte von Array vergleichen

Leser: 2


<< >> 9 Einträge, 1 Seite
renee
 2005-02-23 01:50
#51959 #51959
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#! /usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @array;
while(my $line = <DATA>){
push(@array,[split(/\&\&/,$line)];
}

my @uberschneidungen;
for(1..$#array){
push(@uberschneidungen,[$array[$_-1]->[2],$array[$_]->[2]]) if($array[$_-1]->[1] > $array[$_]->[0]);
}

print "Anzahl: ",scalar(@uberschneidungen);
print Dumper(\@uberschneidungen);

_ _DATA_ _
0800&&0900&&Text
0930&&1015&&Text
1000&&1100&&Text
1045&&1145&&Text
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2005-02-23 09:20
#51960 #51960
Hi,
es gibt aber noch mehr Überschneidungsarten.

Termin 1 von 09:00 bis 10:00
Termin 2 von 08:00 bis 11:00

Ich habe so einen Terminplaner in MySQL realisiert. Da kannst Du prima über SQL-Statements die vier möglichen Überschneidungen prüfen.
cu
Martin
Mic
 2005-02-23 00:20
#51961 #51961
User since
2005-02-22
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Einen wunderschönen,

ich habe folgendes Problem:
Ich habe ein Array, welches mit Terminen gefüllt ist. Das sieht ungefähr so aus:
1.: 0800&&0900&&Text
2.: 0930&&1015&&Text
3.: 1000&&1100&&Text
4.: 1045&&1145&&Text
Die erste Ziffernfolge legt die Anfangszeit und die zweite die Endzeit fest. Jetzt möchte ich das Array dahingehend überprüfen, ob sich Zeiten überschneiden.
Im o.g. Beispiel wäre das der zweite und dritte Eintrag, sowie der dritte und vierte. Für die Ausgabe muss ich zum einen jetzt wissen, wie viele gleichzeitige Überschneidungen es insgesamt gibt und welche Einträge sich überschneiden. In diesem Fall wären es zwei gleichzeitige Überschneidungen. Ich habe mal ein Screenshot vorbereitet, denn Bilder sagen oft mehr als Worte. ;)
http://www.veen.de/images/foren/kalender_screensho...

Kann mir jemand weiterhelfen?
Wenn Vergangenheit, Gegenwart und Zukunft nichts weiter sind als verlorene Ideen aus einer anderen Ära, etwa wie Boote auf einem ausgetrockneten See, dann ist die Beendigung eines Prozesses nie zu definieren.
esskar
 2005-02-23 04:32
#51962 #51962
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das klappt aber nur, wenn die daten richtig sortiert sind, und z.B. eintrag 1 nicht mit 3 überschneidet

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#! /usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @dates = ();
while(my $line = <DATA>) {
my @parts = split(/&&/,$line);

push @dates, {
Start => $parts[0],
End => $parts[1],
Text => $parts[2],
};
}

my @colitions = ();
for(my $i = 0; $i < @dates; ++$i) {
for(my $j = $i+1; $j < @dates; ++$j) {
if($dates[$i]->{Start} >= $dates[$j]->{Start} && $dates[$i]->{End} <= $dates[$j]->{End} ||
$dates[$j]->{Start} >= $dates[$i]->{Start} && $dates[$j]->{End} <= $dates[$i]->{End})
{
push @colitions, [{%{$dates[$i]}}, {%{$dates[$j]}}];
}
}
}

print "Anzahl: ", scalar @colitions, "\n",
print Dumper(\@colitions);

exit(0);

_ _DATA_ _
0800&&0900&&Eintrag1
0930&&1015&&Eintrag2
1000&&1100&&Eintrag3
1045&&1145&&Eintrag4
0800&&0830&&Eintrag5
0930&&1050&&Eintrag6
1051&&1141&&Eintrag7
1045&&1145&&Eintrag8
pq
 2005-02-23 12:34
#51963 #51963
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
was hat denn das mit CGI zu tun? *verschieb*
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2005-02-23 20:14
#51964 #51964
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Huhu Mic, willkommen im Perlforum :D

Wahrscheinlich möchtest Du dann auch eine Berechnung, wieviele Spalten Du minimal brauchst und eine entsprechende Zuordnung der Termine zu den Spalten?!\n\n

<!--EDIT|Crian|1109182536-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Mic
 2005-02-23 23:22
#51965 #51965
User since
2005-02-22
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dank Euch für die Hilfe! Damit komme ich bestimmt schon weiter.

Huhu Zolde.. äh Crian. ;)
Da hast du Recht, so was schwebt mir vor.
Wenn Vergangenheit, Gegenwart und Zukunft nichts weiter sind als verlorene Ideen aus einer anderen Ära, etwa wie Boote auf einem ausgetrockneten See, dann ist die Beendigung eines Prozesses nie zu definieren.
Crian
 2005-02-23 23:50
#51966 #51966
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Dein Problem könnte man graphentheoretisch angehen. Jeder Termin ist eine Ecke, zwei Ecken sind benachbart, wenn die Termine sich überlappen (dazu wäre zu klären, ob sich 8-10 mit 10-11:30 überlappt oder nicht, aber das nur am Rande).
Dann musst Du den Graphen nur noch so einfärben, dass benachbarte Ecken verschiedene Farben bekommen. (Die Farben entsprechen dann den Spalten Deines Kalenders.)

Dieses Problem ist bekannter Weise NP-hart, allerdings wirst Du ja wahrscheinlich keine riesigen Terminmengen pro Tag haben, so dass Du Dir eventuell die exakte Backtracking-Lösung (laufzeittechnisch) leisten kannst.
Falls nicht, kann ich Dir einen ganzen Haufen an schnelleren (aber nicht optimalen) Algorithmen nennen, denn über Färbungsalgorithmen von Graphen habe ich meine Diplomarbeit geschrieben. Ich schreib zunächst mal den Backtracking-Algorithmus ab, wahrscheinlich reicht der:

(Ist allerdings C++)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Vertex backtrackingColoring(const Graph &g, CSet &c)
{
   Vertex k = 0;
   bool success = false;
   
   while (!success) {
       ++k;
       success = kBacktracking(g, k, c);
   }

   return k;
} /* backtrackingColoring */

bool kBacktracking(const Graph &g, const Color k, CSet &c)
{
   if (k < 1)
       error("kBacktracking", "Farbe %d zu klein.", k);

   /**************************************************************************
   * Initialisierungen:                                                      *
   **************************************************************************/
   const Vertex n = g.getn();
   c.resize(n);
   for (Vertex i=0; i<n; ++i)
       c[i] = 0;

   /**************************************************************************
   * Aufruf der rekursiven Untersuchung:                                     *
   **************************************************************************/
   return btcTry(g, 0, k, c);
} /* kBacktracking */

bool btcTry(const Graph &g, const Vertex i, const Color k, CSet &c)
{
   /**************************************************************************
   * Initialisierungen:                                                      *
   **************************************************************************/
   const Vertex n = g.getn();
   Color color = 0;
   bool q = false;

   /**************************************************************************
   * Fehler abfangen:                                                        *
   **************************************************************************/
   if (i >= n)
       error("btcTry", "Ecke i = %d ist außerhalb des zulässigen Bereiches "
           "[0, %d]", i, n-1);
   if (k < 1 || k > static_cast<Color>(n))
       error("btcTry", "Farbe k = %d ist außerhalb des zulässigen Bereiches "
           "[1, %d]", k, n);

   /**************************************************************************
   * Schleife:                                                               *
   **************************************************************************/
   while (q == false && color != k) {
       ++color;
       /*** Abbruch, falls i==0 und color>1: ***/
       if (i == 0 && color > 1)
           break;
       if (btcPossible(g, i, color, c)) {
           c[i] = color;
           if (i < n-1) {
               q = btcTry(g, i+1, k, c);
               if (!q)
                   c[i] = 0;
           }
           else
               q = true;
       }
   }

   return q;
} /* btcTry */

bool btcPossible(const Graph &g, const Vertex i, const Color color,
   const CSet &c)
{
   VSet N;
   g.getNeighbours(i, N);
   for (Vertex j=0; j<N.size(); ++j)
       if (c[N[j]] == color)
           return false;

   return true;
} /* btcPossible */  


Ich hoffe, das ist zumindestens ein Einstiegspunkt :-)
Ich kann aber gern auch bei einer Perl-Umsetzung helfen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Mic
 2005-02-24 01:05
#51967 #51967
User since
2005-02-22
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Crian,23.02.2005, 22:50]Ich hoffe, das ist zumindestens ein Einstiegspunkt :-)[/quote]Äh, nicht wirklich, aber danke für die Vorführung. ;)

Als ich so den halben Tag vor dem Problem saß, fragte mich meine Freundin, wie oft es denn vorkommen würde, dass sich bei mir Termine überschneiden und ob ich mich dann an zwei Stellen gleichzeitig befinden könnte. Ich mag zwar derartiges "Feature-Fucking", aber ihr Einwand ist durchaus berechtigt.
Daher bin ich mir mittlerweile gar nicht mehr so sicher, ob ich das wirklich brauche.

Freundinnen machen immer alles kaputt. ;)
Wenn Vergangenheit, Gegenwart und Zukunft nichts weiter sind als verlorene Ideen aus einer anderen Ära, etwa wie Boote auf einem ausgetrockneten See, dann ist die Beendigung eines Prozesses nie zu definieren.
<< >> 9 Einträge, 1 Seite



View all threads created 2005-02-23 01:50.