Hallo 1unitedpower,
Zeigst du uns deine Lösung denn trotzdem?
<?php
/**
Aus einer Liste mit N Elementen soll fortlaufend jedes K. Element entfernt
werden bis nur noch (K-1) Elemente übrig sind. Der Prozess beginnt an
einer beliebigen Stelle S.
**/
$n = 1000;
$k = 3;
$s = 0; // wenn ungleich null, muss umgestellt werden
$toskip = $k - 1; // Anzahl der zu überspringenden Elemente
for ($i = 0; $i < $n; $i++) :
$list[$i]= $i + 1;
endfor;
echo "<h3>0. Durchlauf</h3>";
echo "<pre>";var_dump($list);echo "</pre>";
if ($s > 0) :
for ($i = 0; $i < $s - 1; $i++) :
$list[$n + $i] = $list[$i]; // vordere Elemente hinten anhängen
endfor;
array_splice($list, 0, $s - 1); // und vorn entfernen
endif;
echo "<h3>0. Durchlauf</h3>";
echo "<pre>";var_dump($list);echo "</pre>";
$len = sizeof($list);
$start = $toskip; // erstes Element, das entfernt wird
$durchlauf = 0;
while ($len > $toskip) : // solange noch Elemente übersprungen werden können
$durchlauf++;
// markiere die entsprechenden Listenelemente
for ($i = 0; $k * $i + $start < $len; $i++) :
$list[$k * $i + $start] = 0;
endfor;
// in der Liste sind noch $rest Elemente übrig, die zu beachten sind
$rest = $len - 1 - ($k * ($i-1) + $start);
// entferne die markierten Listenelemente
for ($i = sizeof($list) - 1; $i >= 0; $i--) :
if ($list[$i] == 0) array_splice($list, $i, 1);
endfor;
$len = sizeof($list); // neue Länge
$start = $toskip - $rest; // neuer Start
echo "<h3>$durchlauf. Durchlauf</h3>";
echo "<pre>";var_dump($list);echo "</pre>";
endwhile;
?>
// Ausgabe
…
13. Durchlauf
array(5) {
[0]=>
int(226)
[1]=>
int(377)
[2]=>
int(604)
[3]=>
int(706)
[4]=>
int(949)
}
14. Durchlauf
array(3) {
[0]=>
int(226)
[1]=>
int(604)
[2]=>
int(706)
}
15. Durchlauf
array(2) {
[0]=>
int(226)
[1]=>
int(604)
}
Bis demnächst
Matthias
--
Pantoffeltierchen haben keine Hobbys.
Pantoffeltierchen haben keine Hobbys.