1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Alle Kombinationen von einer Menge

    • Frage
  • Swoncen
  • 8. Februar 2006 um 16:10
  • Unerledigt
  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 8. Februar 2006 um 16:10
    • #1

    Hallo!

    Entweder ich hab gerade eine völlige Blockade, oder es ist wirklich nicht so leicht. Ich brauch folgendes:

    Ich hab eine zufällig große Menge, sagen wir aus 7 Elementen. Nun möchte ich alle Kombinationen herausfinden, sodass immer 2 Elemente 2 anderen gegenüberstehen.

    Ist jetzt schlecht erklärt, ich erklär wofür ichs brauch. Wir wollen ein Wuzzlturnier machen und es ist nicht klar wieviele Teilnehmer mitspielen. Klar ist jedenfalls, dass wir immer 2 gegen 2 spielen. Es sollten alle Kombinationen gespielt werden. Mir fällt grad nicht ein, wie ich das programmiern soll. Bitte um schnelle Hilfe.

    640K ought to be enough for anybody. :eek2:

  • Lynx
    7
    Lynx
    Mitglied
    Reaktionen
    3
    Punkte
    533
    Beiträge
    105
    • 8. Februar 2006 um 16:26
    • #2

    Du musst zuerst alle Möglichkeiten von 4 Leuten aus der Menge ziehen, also (7 über 4), im Beispiel mit 7 Leuten wären das 35. Dann musst du aus den 4 alle Kombinationen von paarweisen Gegenüberstellungen nehmen. Bei 4 Leuten, die du in 2 gegen 2 einteilen willst, sind das (4 über 2) / 2, also 3 Möglichkeiten.

    Bei 7 Leuten kannst du dich mit 105 Spielen also auf einen langen Abend gefasst machen. Sollten doch 8 Leute kommen, werdens 210 Spiele (wobei man da aber zumindest einige gleichzeitig spielen kann). Wenn ihr Glück habt, kommen nur 6 und ihr müsst nur 45 mal spielen (plant trotzdem schon mal ein Wochenende ein :winking_face: )

    Man kann sich das auch einfach als 11-dimensionale Zigarre vorstellen.

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 8. Februar 2006 um 16:29
    • #3

    Hallo!

    Ja wieviele Spiele es sein werden ist mir schon klar, aber ich hätte gerne die Paarungen. Zum Beispiel

    a, b, c, d

    a+b gegen c+d
    a+c gegen b+d
    a+d gegen b+c

    aber jetzt wo ich das so aufschreib, fällt mir schon was ein. Trotzdem danke für die Hilfe =)

    640K ought to be enough for anybody. :eek2:

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 8. Februar 2006 um 16:48
    • #4

    Ok ich habs soweit. Ist in php geschrieben, und schaut so aus:

    PHP
    for($i=0;$i<sizeof($this->players);$i++)
                for($j=0;$j<sizeof($this->players);$j++)
                    for($k=0;$k<sizeof($this->players);$k++)
                        for($l=0;$l<sizeof($this->players);$l++)
                        {
                            if($i==$j || $i==$k || $i==$l || $j==$k || $j==$l || $k==$l)
                                break;
                            echo $this->players[$i]->name,"+",$this->players[$j]->name," - ";
                            echo $this->players[$k]->name,"+",$this->players[$l]->name,"<BR>";
                        }



    $this->players sind die Spieler, wie man sich denken kann. Das einzige Problem ist, dass es jetzt auch eine Rückrunde gibt. Also bei 6 Spielern sinds nicht 45 Spiele, sondern 90. Wenn jemand eine schnelle Lösung weiß, bitte bescheid sagen.

    640K ought to be enough for anybody. :eek2:

  • Lynx
    7
    Lynx
    Mitglied
    Reaktionen
    3
    Punkte
    533
    Beiträge
    105
    • 8. Februar 2006 um 17:01
    • #5

    fang nicht bei jeder Schleife bei 0 an, sondern bei dem wert der letzten Schleife + 1.

    PHP
    for($i=0;$i<sizeof($this->players);$i++)
                for($j=i+1;$j<sizeof($this->players);$j++)
                    for($k=j+1;$k<sizeof($this->players);$k++)
                        for($l=k+1;$l<sizeof($this->players);$l++)
                        {
                            echo $this->players[$i]->name,"+",$this->players[$j]->name," - ";
                            echo $this->players[$k]->name,"+",$this->players[$l]->name,"<BR>";
                        }


    Das sollte Redundanzen eliminieren.

    ist aber nur mal ein spontaner Einfall, wie er mir so in 5 minuten grad kommt. Passt vielleicht noch nicht 100%ig, aber in die Richtung müssts gehen.

    Man kann sich das auch einfach als 11-dimensionale Zigarre vorstellen.

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 8. Februar 2006 um 17:04
    • #6

    Ja es stimmt nicht ganz, aber es ist ein guter Tipp.. Danke

    640K ought to be enough for anybody. :eek2:

  • Spockman
    5
    Spockman
    Mitglied
    Punkte
    210
    Beiträge
    41
    • 9. Februar 2006 um 01:35
    • #7
    Zitat von Swoncen


    Ist jetzt schlecht erklärt, ich erklär wofür ichs brauch. Wir wollen ein Wuzzlturnier machen und es ist nicht klar wieviele Teilnehmer mitspielen. Klar ist jedenfalls, dass wir immer 2 gegen 2 spielen. Es sollten alle Kombinationen gespielt werden. Mir fällt grad nicht ein, wie ich das programmiern soll. Bitte um schnelle Hilfe.


    Hier in Prolog:

    Code
    :- op(600, xfx, gegen).
    
    
    wuzzel(Ls, Plays) :-
        findall(P, wuzzel_(Ls, P), Plays).
    
    
    wuzzel_(Ls0, Play) :-
        select(A, Ls0, Ls1),
        select(B, Ls1, Ls2),
        B @> A,
        select(C, Ls2, Ls3),
        C @> A,
        select(D, Ls3, _),
        D @> C,
        Play = (A + B) gegen (C + D).
    Alles anzeigen


    Getestet mit SWI-Prolog. Beispiel-Query:

    Code
    ?- wuzzel([a,b,c,d], P).
    
    
    P = [a+b gegen c+d, a+c gegen b+d, a+d gegen b+c] ;
  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 9. Februar 2006 um 11:48
    • #8

    Ich hab keine Ahnung vom Prolog, aber ist egal, ich habs schon geschafft. Ich geb jedem Spieler eine eindeutige Zahl (Potenz von 2) und speicher dann die begegnungen in einem Array. Somit kommts nicht mehr doppelt vor. Habs gestern noch rechtzeitig vorm wuzzeln geschafft =).

    PHP
    for($i=0;$i<sizeof($this->players);$i++)
                $nmb[$i] = pow(2,($i+1));
    
    
            for($i=0;$i<sizeof($this->players);$i++)
                for($j=0;$j<sizeof($this->players);$j++)
                    for($k=0;$k<sizeof($this->players);$k++)
                        for($l=0;$l<sizeof($this->players);$l++)
                        {
                            if($i==$j || $i==$k || $i==$l || $j==$k || $j==$l || $k==$l)
                                break;
    
    
                            if($rem[$nmb[$i]+$nmb[$j]][$nmb[$k]+$nmb[$l]]==true ||
                               $rem[$nmb[$k]+$nmb[$l]][$nmb[$i]+$nmb[$j]]==true)
                                break;
    
    
                            echo = $this->players[$i]->name."+".$this->players[$j]->name."-".$this->players[$k]->name."+".$this->players[$l]->name;
    
    
                            $rem[$nmb[$i]+$nmb[$j]][$nmb[$k]+$nmb[$l]]=true;
                            $rem[$nmb[$k]+$nmb[$l]][$nmb[$i]+$nmb[$j]]=true;
                        }
    Alles anzeigen



    Das Problem ist jetzt, dass die Spiele noch ungeordnet sind. Manche Spieler haben zeitweise viel mehr Spiele als andere, wobei es aber im Endeffekt aufs selbe rauskommt. Trotzdem gibts sicher eine schönere Methode, die zusätzlich noch die Ordnung herstellt.

    640K ought to be enough for anybody. :eek2:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung