Connor: Algorithmus gesucht KO-System

Hallöchen. Ich mal wieder :)

Weis jemand wie man einen Algoritmus erstellen kann auf folgender Basis:

Max. Anzahl im Array: 8 oder 16 oder 32 oder 64 usw.

Dann immer: Erster gegen Letzen, Zweiter gegen vorletzten usw.

Bsp bei 8 im array:
Runde:1
Sp1: 1 gegen 8
Sp2: 2 gegen 7
Sp3: 3 gegen 6
Sp4: 4 gegen 5

Runde 2:
Sp5: Sieger Sp1 gegen Sieger Sp2
Sp6: Sieger Sp3 gegen Sieger Sp4

Runde 3:
Sp7: Verlierer Sp5 gegen Verlierer Sp6

Runde 4:
Sp8: Sieger Sp5 gegen Sieger Sp6

Das gleiche dann bei den anderen Werten(16 od 32 od 64).

Mit if-abfragen gehts es zwar, aber das ist sehr aufwendig.

Habe das hier:
http://connormcleod.saarmikey.de/flc/tuni/
programmiert mit if-abfragen.

Danke und Gruss Connor

  1. Soweit bin ich schon mal.
    Was mich noch stört, ist das ich in der FOR-Schleife die $anzahl immer wieder addieren muss.
    Ob das elleganter geht ? * :-)

      
    /* Max Anzahl: 8, 16, 32, 64 */  
    $maxanzahl = 64;  
    $spieler = range(1, $maxanzahl);  
    /* Spiel um Platz 3 ? Coding fehlt noch */  
    $platz_3 = false;  
    /*  
    foreach ($spieler as $werte)  
    {  
    print "<pre>";  
    print_r ($werte);  
    print "</pre>";  
    }  
    Folgt noch */  
      
    $anzahl = count($spieler);  
      
    $out = "Gesamt Spieler: $anzahl<br>";  
    $out .= "<br>";  
    $out .=  "Runde 1: ".($anzahl/2)." Spiele<br>";  
    for($count = 1; $count <= $anzahl/2; $count++)  
    {  
     $out .= "Spiel ".$count."<br>";  
    }  
      
    $out .= "<br>";  
      
    $out .=   "Runde 2: ".($anzahl/4)." Spiele<br>";  
    for($count = $count; $count <= ($anzahl/2)+($anzahl/4); $count++)  
    {  
    $out .= "Spiel ".($count)."<br>";  
    }  
      
    $out .= "<br>";  
      
    $out .= "Runde 3: ".($anzahl/8)." Spiele<br>";  
    for($count = $count; $count <= ($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)  
    {  
    $out .= "Spiel ".($count)."<br>";  
    }  
    $out .= "<br>";  
      
    if (!is_float($anzahl/16) ){  
    $out .=   "Runde 4: ".($anzahl/16)." Spiele<br>";  
    for($count = $count; $count <= ($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)  
    {  
    $out .= "Spiel ".($count)."<br>";  
    }  
    $out .= "<br>";  
    }  
      
    if (!is_float($anzahl/32)){  
    $out .= "Runde 5: ".($anzahl/32)." Spiele<br>";  
    for($count = $count; $count <= ($anzahl/32)+($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)  
    {  
    $out .= "Spiel ".($count)."<br>";  
    }  
    $out .= "<br>";  
    }  
      
    if (!is_float($anzahl/64)){  
    $out .= "Runde 6: ".($anzahl/64)." Spiele<br>";  
    for($count = $count; $count <= ($anzahl/64)+($anzahl/32)+($anzahl/16)+($anzahl/8)+($anzahl/4)+($anzahl/2); $count++)  
    {  
    $out .= "Spiel ".($count)."<br>";  
    }  
      
    }  
    echo $out;  
    
    

    Gruss Connor

  2. Warum zählst du nicht einfach die Einträge und prüfst, ob der wert ein glatte potentierte 2 ist (Stichwort log())

    Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?

    ob das dann 4, 8 oder 1024 Mannschaften sind, spielt da keine Rolle mehr - zudem ist der Code vermutlich nur mehr 1/3 deines Codes.

    1. Hallo suit und danke für deine Antwort

      Warum zählst du nicht einfach die Einträge und prüfst, ob der wert ein glatte potentierte 2 ist (Stichwort log())

      Aus dem PHP-Manual:
      float log ( float $arg [, float $base = M_E ] )

      Berechnet den natürlichen Logarithmus von arg beziehnugsweise den Logarithmus von arg zur Basis base falls der optionale zweite Parameter base gegeben ist.

      Das werde ich natürlich testen :-)

      Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?

      Oha, leider war ich in Mathe nicht so gut.
      Könntest du mir bitte genauer beschreiben wie du das meinst?

      ob das dann 4, 8 oder 1024 Mannschaften sind, spielt da keine Rolle mehr - zudem ist der Code vermutlich nur mehr 1/3 deines Codes.»»

      Genau das ist mein Ziel :-)

      Gruss Connor

      1. Danach läufst du das Array ungeachtet der Länge mit einer for-schleife durch, aber nur n/2 Durchläufe und nimmst jeweils i+1 und n-i bis du durch bist?

        Oha, leider war ich in Mathe nicht so gut.
        Könntest du mir bitte genauer beschreiben wie du das meinst?

        n steht in diesem Fall für die Anzahl der Einträge in deinem Array, also Anzahl der Teilnehmer oder Teams oder whatever.

        i ist der Zähler, welchen du für deine Schleife verwendest.

        Du hast n/2 Durchläufe, d. h. halb so viele Durchläufe wie Einträge. Das kommt daher, dass du bei jedem Schleifendurchlauf zwei Werte abgreifen wirst.

        Beim ersten Schleifendurchlauf ist i+1 der erste Teilnehmer. Der Teilnehmer, der an Platz Eins gesetzt ist. (i+1 weil die Schleife bei 0 zu zählen beginnt).

        n-i solltest Du dir selbst erschließen können. Überlege einfach, welche Werte sich beim ersten und beim zweiten Schleifendurchlauf ergeben. Dann sollte das System klar werden.

        Gruß Fabulit