Matthias Apsel: Haskell Lösung

Beitrag lesen

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; 
?>
// Ausgabe13. 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.