Mitte von zwei Bereichen in einem String
Rolf
- php
Hallo,
ein ständig wechselnden String sieht z.B. so aus:
<?php
$test = array(
'_________####____________####_____',
'____###______________#######______',
'__________######__________###_____');
?>
Mein Problem ist es in jeder #-Gruppe die Mitte zu ermitteln.
Das wäre in diesem Beispiel:
$a1 = 10, 26
$a2 = 4, 23
$a3 = 12, 26
Nur wie ich das mit PHP hinbekomme, fällt mir nicht ein.
Kann natürlich auch nur an meiner Grippe liegen ... :-(
mbG Rolf
Hi,
ein ständig wechselnden String sieht z.B. so aus:
<?php
$test = array(
'########',
'____###_#######',
'#########');
?>
> Mein Problem ist es in jeder #-Gruppe die Mitte zu ermitteln.
Was ist eine "#-Gruppe", und was deren "Mitte"?
(Was wird gruppiert, geht's um die ###, oder den Inhalt dazwischen, ...?)
> Das wäre in diesem Beispiel:
> $a1 = 10, 26
> $a2 = 4, 23
> $a3 = 12, 26
Leuchtet mir nicht ein, woher du diese Zahlen nimmst.
MfG ChrisB
Hello Chris,
Was ist eine "#-Gruppe", und was deren "Mitte"?
(Was wird gruppiert, geht's um die ###, oder den Inhalt dazwischen, ...?)
Das ist inzwischen eine Insider-Aufgabe. Rolf hätte erwähnen sollen, dass das hier die Fortsetzung aus einer Gesamtaufgabe war...
Liebe Grüße
Tom vom Berg
Hallo Tom,
Das ist inzwischen eine Insider-Aufgabe.
Rolf hätte erwähnen sollen, dass das hier die Fortsetzung aus einer Gesamtaufgabe war...
hätte ich wohl!
Daraus hätten sich aber sofort wieder ein Haufen weitere Fragen ergeben.
Und ob bei dem Palaver was brauchbares rausgekommen wäre, weiss man nicht.
Aber dieses Teilproblem ist soweit gelöst. Nun muss ich überprüfen, ob die
Teillösung den erwarteten Durchbruch bei der eigentlichen Aufgabe bringt.
Es geht immer noch darum, einen Flusslauf automatisch zu erfassen.
Also nicht irgendwie eine Menge an Koordinaten zu ermitteln, sondern
immer schön der Reihe nach, wie eine Perlenkette ...
mbG Rolf
Hello,
'_________####____________####_____',
'____###______________#######______',
'__________######__________###_____');
Du lässt einen Zähler laufen $pos
Du lässt einen Zähler starten $offs, wenn das erste # kommt
Du lässt den Zähler $offs stoppen, wenn kein # mehr kommt
und die Miette ausrechnen:
$mitte[] = ($pos-$offs/2);
$offs zurücksetzen und das Spiel weiterspielen bis zum Ende des Strings.
Liebe Grüße
Tom vom Berg
gudn tach!
alternative loesung via preg_match und strlen:
for($i=count($test)-1;$i>=0;--$i){
$nom = preg_match_all('/#+/', $test[$i], $mat, PREG_OFFSET_CAPTURE);
for($j=$nom-1;$j>=0;--$j)
$erg[$i][$j] = floor((strlen($mat[0][$j][0])-2)/2)+$mat[0][$j][1];
}
hmm, geht das nicht vielleicht auch noch etwas huebscher?
in perl sieht das irgendwie mal wieder viel angenehmer aus (und sogar ohne wirklich perlish zu schreiben):
my @erg;
my $i = -1;
for(@test){
while(/(#+)/g){
push @{$erg[++$i]}, pos()-int((length($1)+3)/2);
}
}
prost
seth
Hello Rolf,
dann ist Deine Aufgabe doch jetzt auf simpelste Weise gelöst?
Einmal rastern in X-Richtung
Einmal rastern in X-Richtung
Beide Ergebnisse zusammenführen und in der Ergebnismenge den Pfad durch eine Epsilon-Umgebung finden. Solange sich da nichts überschneidet, sollte das Ergebnis leicht zu finden sein.
Liebe Grüße
Tom vom Berg
Hello,
da war doch wieder der man-in-the-middle aktiv *tztz*
Einmal rastern in X-Richtung
Einmal rastern in Y-Richtung
Beide Ergebnisse zusammenführen und in der Ergebnismenge den Pfad durch eine Epsilon-Umgebung finden. Solange sich da nichts überschneidet, sollte das Ergebnis leicht zu finden sein.
Liebe Grüße
Tom vom Berg
Hi,
da war doch wieder der man-in-the-middle aktiv *tztz*
Na ja, dass der sich bei einem Thread mit dieser Ueberschrift mit reinhaengt, ist doch sein gutes Recht.
MfG ChrisB