PHP :: Aufgabe #125

1 Lösung Lösung öffentlich

Paarungstabellen für Rundenturniere

Anfänger - PHP von hollst - 01.09.2016 um 12:34 Uhr
Bei Sportarten nach einem System "Jeder gegen Jeden" (bspw. Hinrunde Fußballbundesliga) mit N Teilnehmern (N sei gerade, falls nicht, wird ein "Dummyakteur" hinzugefügt) werden insgesamt N - 1 Runden a N/2 Spiele ausgetragen. Zur Festlegung der Paarungen einer Runde kann auf verschiedene Art und Weise vorgegangen werden, bspw. mittels Auslosung. Allerdings ist das Losverfahren unfair (u. a. keine Balance der Heim- und Auswärtsspiele) und findet aus diesem Grunde so gut wie keine praktische Anwendung. Besser geeignet und bspw. bei Schachturnieren Basis sind sogenannte Paarungstabellen nach Berger (siehe z. B. www.schachfreunde-markgraeflerland.de/media/pdf/Turniersysteme.pdf), nachfolgend als Beispiel für ein Turnier mit 10 Teilnehmern aufgelistet:

1. Runde 1-10 2-9 3-8 4-7 5-6
2. Runde 10-6 7-5 8-4 9-3 1-2
3. Runde 2-10 3-1 4-9 5-8 6-7
4. Runde 10-7 8-6 9-5 1-4 2-3
5. Runde 3-10 4-2 5-1 6-9 7-8
6. Runde 10-8 9-7 1-6 2-5 3-4
7. Runde 4-10 5-3 6-2 7-1 8-9
8. Runde 10-9 1-8 2-7 3-6 4-5
9. Runde 5-10 6-4 7-3 8-2 9-1

Solche Tabellen wurden bereis vor dem "Computerzeitalter" mühevoll per Hand erstellt (siehe z. B. http://www.schachclub-forchheim.de/pdfs/Paarungstafeln.pdf), wobei i. d. R. bei einer Teilnehmerzahl von weit unter 30 aufgehört wurde.

Aufgabe ist es ein Programm zu schreiben, das solche Paarungstabellen nach Berger automatisch generiert, wobei die Teilnehmerzahl nach oben nicht begrenzt sei.

Lösungen:

vote_ok
von Acta (320 Punkte) - 11.02.2019 um 12:25 Uhr
Quellcode ausblenden PHP-Code
<?php

function paarungssystem($spieler, $runde)
{	
	$gegner = range(1, $spieler);
	if($runde % 2){
		$gegner[0] = $odd = ($runde+1)/2;
		$gegner[1] = $spieler;
	}
	else{
		$gegner[0] = $spieler;
		$gegner[1] = $odd = ($runde+$spieler)/2;
	}
	for ($i=2; $i< $spieler;){
		$gegner[$i++]= ($odd++)%($spieler-1)+1;
		$gegner[$i++]= ($runde-$odd+$spieler-1)%($spieler-1)+1;
	}

	$i = 0;
	for($x = 0; $x < $spieler-1; $x+=2)
	{
		
			$paarung[$i]['w'] = $gegner[$x];
			$paarung[$i]['s'] = $gegner[$x+1];
			$i++;

	}
	return $paarung;
}

$spieler = 29;
if($spieler % 2 != 0)
	{
		$spieler++; }
?>

<html>
<body>

<?php

for($runde = 1; $runde <= $spieler-1; $runde+=1) {
echo "<br><br>";
echo "<b>Runde $runde:</b> ";
echo "<br>";
$paarung = paarungssystem($spieler,$runde); 
foreach($paarung AS $key) {

echo $key["w"] ." - " . $key["s"] . " "; 
echo "<br>";
}}

?>



</body>

</html>
1813505

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.