Hilfe bei (mathematischen) Algorithmus (Gruppenteilung)

02/23/2021 19:25 papierkorp#1
Servus,

ich mach mir grad privat für eine LAN Party (sobald Corona mal vorbei ist..) so eine kleine Turnierwebsite.

Das dient hauptsächlich dazu ein bisschen zu programmieren um die Skills ned zu verlernen.

Jetzt hab ich grad folgendes Problem:

Ich kenn die Anzahl aller Teilnehmer am Turnier.
Und ich weiß wieviele Spieler maximal bei einem Spiel gemeinsam zocken können (z.B. Worms sind max. 4 Spieler, Counter-Strike 10 Spieler..)
Und ich kann ausrechnen wieviele Gruppen insgesamt benötigt werden.

Jetzt würde ich gerne abhängig von der Anzahl Teilnehmer und den MaxSpieler pro Spiel automatisch Gruppen erstellen lassen (zumindest die Größen der einzelnen Gruppen).

Was ich schon weiß:

Wenn AnzahlTeilnehmer // maxSpieler == 0 können alle mitspielen
Wenn AnzahlTeilnehmer // maxSpieler == 1 werden alle Teilnehmer einfach in 2 Gruppen gesplittet
Sonst AnzahlTeilnehmer // maxSpieler + 1 = Anzahl der benötigten Gruppen

Jetzt kommt mein Problem, wenn das Ergebnis > 1 ist, kann ich die Anzahl der Gruppen rausfinden, weiß aber nicht wie ich die per Algorithmus immer ausgeglichen hin bekomm.

Als Beispiel:

Teilnehmer Maximal Spieler möglich Gewünschte Gruppenteilung
9 4 3,3,3
10 4 4,3,3
11 4 4,4,3
12 4 4,4,4
13 4 4,3,3,3
9 6 5,4
10 6 5,5
11 6 6,5
12 6 6,6
13 6 5,4,4

Ich hoffe ihr versteht was ich mein :D, vielleicht hat hier einer ne Idee wie man das machen könnte <3


Gruß
Markus
02/24/2021 08:17 Jeoni#2
Naja, wenn du die Anzahl der Gruppen hast, kannst du die Anzahl der Teilnehmer dort einfach aufteilen. Zuerst wieviele Teilnehmer jede Gruppe mindestens hat:
Floor(AnzahlTeilnehmer / AnzahlGruppen) = TeilnehmerProGruppe
Dann wie viele Gruppen +1 Teilnehmer haben, um den Überschuss / Divisionsrest aufzuteilen:
AnzahlGruppenMitEinemTeilnehmerMehr = AnzahlTeilnehmer - TeilnehmerProGruppe * AnzahlGruppen (oder auch AnzahlGruppenMitEinemTeilnehmerMehr = AnzahlTeilnehmer % TeilnehmerProGruppe ).
Das war's.

Beispiel mit der Zeile 11 | 4 | 4,4,3:
AnzahlGruppen hast du ja bereits mit deiner Formel berechnet, das sind 3.
TeilnehmerProGruppe = Floor(11 / 3) = 3
AnzahlGruppenMitEinemTeilnehmerMehr = 11 % 3 = 2
Also jede der drei Gruppen hat 3 Teilnehmer und zwei der Gruppen haben einen Teilnehmer mehr (also 4) -> 4,4,3
02/25/2021 07:08 papierkorp#3
Das ich da nicht selber dran gedacht hab -.-'

Hat funktioniert vielen Dank! :handsdown:

Hier der Code in Python3 falls es wen interessiert:

Code:
Teilnehmer=18;
maxSpieler=6;

def Gruppenrechner(Teilnehmer,maxSpieler):
    Teilnehmergruppe=[];
    
    if isinstance(Teilnehmer, str) or Teilnehmer <= 0:
        return "Keine erlaubte Eingabe!";
    elif Teilnehmer <= maxSpieler:
        Teilnehmergruppe.append(Teilnehmer);
    elif Teilnehmer // maxSpieler == 1:
        if Teilnehmer % 2 == 0:
            Teilnehmergruppe.append(Teilnehmer//2);
            Teilnehmergruppe.append(Teilnehmer//2);
        else:
            Teilnehmergruppe.append(Teilnehmer//2);
            Teilnehmergruppe.append(Teilnehmer//2+1);
    elif Teilnehmer % maxSpieler == 0:
        AnzahlGruppen = Teilnehmer//maxSpieler;
        MindestanzahlinGruppe = Teilnehmer//AnzahlGruppen;
        for i in range(AnzahlGruppen):
            Teilnehmergruppe.append(MindestanzahlinGruppe);
    else:
        AnzahlGruppen = Teilnehmer//maxSpieler + 1;
        MindestanzahlinGruppe = Teilnehmer//AnzahlGruppen;
        AnzahlGruppenUeberschuss = Teilnehmer % AnzahlGruppen;
        for i in range(AnzahlGruppenUeberschuss):
            Teilnehmergruppe.append(MindestanzahlinGruppe+1)
        for i in range(AnzahlGruppen-AnzahlGruppenUeberschuss):
            Teilnehmergruppe.append(MindestanzahlinGruppe);
    return Teilnehmergruppe;

for i in range(20):
    print ("Teilnehmer:", i, Gruppenrechner(i,maxSpieler));
    
if not isinstance(Gruppen, str):
    #go on