Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
DEKONSTRUKTIV
Dabei seit: 22.06.2009
Ort: bln
Alter: -
Geschlecht: -
|
Verfasst Di 12.11.2013 12:44
Titel
|
|
|
und das eine ungerade anzahl von menschen nich durch 2 teilbar is, liegt in der natur der sache.
|
|
|
|
|
fyll
Dabei seit: 20.09.2003
Ort: Augsburg
Alter: 39
Geschlecht:
|
Verfasst Di 12.11.2013 13:17
Titel
|
|
|
Viel ändert das aber auch nicht.
Angenommen, du hast so nen Array: Code: | $leute = [
'Klaus' => [],
'Maria' => [],
'Dörte' => [],
'Fin' => [
'Klaus',
'Dörte'
],
'John' => []
]; |
brauchst dann eine Funktion, die dir assocArrays shuffelt (gibts genug Ansätze in den Kommentaren auf php.net bei shuffle()).
Danach würde ich ne Funktion basteln, die dir die Paare ausgibt - oder eben false, falls eine der Bedingungen nicht passt. Die lässt mit while() so oft durchrennen, bis halt mal kein false zurückkommt...
Code: | function paare($leute)
{
$partner = $leute;
$ausgabe = '';
shuffle_assoc($partner);
foreach ($leute as $derTyp => $magDieNicht) {
$seinPartner = key($partner);
if ($seinPartner === $derTyp || in_array($seinPartner, $magDieNicht)) {
return false;
}
$ausgabe .= $derTyp . ' -> ' . $seinPartner . '<br>';
unset($partner[$seinPartner]);
}
return $ausgabe;
} | (Achtung - ungetestet!)
|
|
|
|
|
Anzeige
|
|
|
top
Moderator
Dabei seit: 25.11.2003
Ort: Hedwig Holzbein
Alter: 52
Geschlecht:
|
Verfasst Di 12.11.2013 13:40
Titel
|
|
|
So wie ich das Beispiel hier verstehe werden auch keine richtigen Pärchen gesucht:
Nimroy hat geschrieben: | ...
Gewünschtes Ergebnis:
Klaus kümmert sich um John
Maria kümmert sich um Fin
Dörte kümmert sich um Klaus
Fin kümmert sich um Dörte
John kümmert sich um Maria |
Im Prinzip also eine Zuweisung wie beim Wichteln bei dem jeder etwas schenkt und jeder beschenkt wird. (Und sich nicht selbst beschenken soll.)
Es müsste also reichen, wenn du deine Liste einmal mischt, (nach aufeinanderfolgenden Namen suchst die nicht nacheinander stehen sollen um die Liste so lange neu zu mischen bis es passt,) um dann jedem Eintrag den Eintrag darunter zuzuweisen.
(Der letzte Eintrag verweist dann wieder auf den ersten.)
Was halt nicht mehr passieren kann, ist die Möglichkeit, dass zufällig zwei Teilnehmer sich gegenseitig beschenken. Da musst du wissen ob das ein Nachteil ist.
Also z. B. vor dem Mischen:
A(nton)
B(erta)
C(harli)
D(ora)
E(rna)
F(rida)
G(ünter)
Nach dem Mischen wird jeder darunter liegende Name als Zuweisungsziel definiert:
B(erta) -> D(ora)
D(ora) -> F(rida)
F(rida) -> C(harli)
C(harli) -> G(ünter)
G(ünter) -> A(nton)
A(nton) -> E(rna)
E(rna) -> B(erta)
|
|
|
|
|
pantonine
Dabei seit: 03.03.2011
Ort: gehen Sie bitte weiter…
Alter: -
Geschlecht: -
|
Verfasst Di 12.11.2013 13:56
Titel
|
|
|
Zitat: | Gewünschtes Ergebnis:
Klaus kümmert sich um John
Maria kümmert sich um Fin
Dörte kümmert sich um Klaus
Fin kümmert sich um Dörte
John kümmert sich um Maria | Ist schon wieder ne komplett neue Anforderung. Man merkt dass DU kein Programmierer bist. Denn Pärchen sind das nicht. Im Prinzip ist das eine verkettete Liste.
Zitat: | (nach aufeinanderfolgenden Namen suchst die nicht nacheinander stehen sollen um die Liste so lange neu zu mischen bis es passt,) | Problematischerweise erschaffst Du im worst case so eine Endlosschleife. D.h. Terminiertheit ist nicht gegeben. Das kann zufällig passieren (Shuffle) oder dadurch, dass die Anforderungen (A darf nicht mit B) nicht erfüllbar sind. In dem Fall würfelt Dein Automat unendlich.
Zuletzt bearbeitet von pantonine am Di 12.11.2013 14:01, insgesamt 1-mal bearbeitet
|
|
|
|
|
Nimroy
Community Manager Threadersteller
Dabei seit: 26.05.2004
Ort: zwischen Köln und D'dorf
Alter: 46
Geschlecht:
|
Verfasst Di 12.11.2013 14:48
Titel
|
|
|
okay, dann war das ein Misverständnis. Aber mit dem Beispiel des gewünschten Ergebnisses ist das jetzt aus der Welt geräumt, oder?
Die Endlosschleife sehe ich auch als Möglichkeit. Automat läuft durch, jeder hat einen bedingungsgemäßen Partner, der letzte (Z) wird dem ersten (A) zugewiesen, was jetzt dummerweise nicht sein darf als Bedingung. Dann müsste man die Paarungen verwerfen und neu zuweisen. Damit das nicht endlos läuft einen Counter setzen, der die Gesamtzahl der Durchläufe zählt und ab einer definierten Anzahl abbricht. Hab zur Zeit kein Gefühl, wie sich solche Abbrüche im Verhältnis zur Listenlänge verhalten.
|
|
|
|
|
|
|
|
Ähnliche Themen |
[C4D] Diamanten zufällig ein Wort bilden lassen
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|