Avatar billede Slettet bruger
27. januar 2013 - 18:24 Der er 7 kommentarer og
1 løsning

Lav x puljer med de tilmeldt

Hej,

Jeg skal have lavet en lille script, som kan dele mine deltager ind i nogle puljer. Deltager antallet er varierende og man kan godt være tilmeldt 2 gange. Hver pulje skal være på 10 og den samme tilmeldt må ikke stå 2 gange i den samme pulje.

Så hvis der fx er 34 deltager, så skal der laves 3 puljer med 10 og en pulje med 4. Så puljerne skal som udgangspunkt fyldes op med 10.

Er der nogen som kan hjælpe med knække denne opgave?
27. januar 2013 - 18:41 #1
Hvor har du de tilmeldte stående?  I en mysql database tabel?

På hvilken måde skal de tilmeldte inddeles i puljer?  Bare i den orden de står i database tabellen (hvilket vel afspejler den rækkefølge de tilmeldte sig i) eller skal de blandes tilfældigt?

Kan en deltager være tilmeldt maksimalt 2 gange, eller kan man være tilmeldt mange gange?  Hvad skal der ske, hvis der er for eksempel 19 tilmeldinger hvoraf 3 fra den samme person?
Avatar billede Slettet bruger
27. januar 2013 - 19:40 #2
Deltagerne står i mysql og deltagerne skal inddeles i puljerne tilfældigt.

I teorien kan man tilmelde sig ubegrænset antal gange, men tror det skal ændres til maks 2. Og jeg har også lige set det problem du omtaler og tror vi tager den lette løsning - Vi udskriver bare "puljerne kunne ikke laves pga ......"
27. januar 2013 - 21:02 #3
hansen, beklager, jeg troede jeg kunne finde en løsning, men det er ikke lykkedes.  Jeg bakker ud.  Vi må håbe at andre kommer ind som kan klare opgaven.
Avatar billede arne_v Ekspert
28. januar 2013 - 04:46 #4
Mit forslag:


<?php
function loadraw() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    $stmt = $con->prepare('SELECT id,person_id FROM grp ORDER BY RAND()');
    $stmt->execute();
    $res = $stmt->get_result();
    $raw = $res->fetch_all(MYSQLI_ASSOC);
    $res->free();
    $stmt->close();
    $con->close();
    return $raw;
}

function init(&$onegroup, &$ingroup, &$dupl) {
    $onegroup = array();
    $ingroup = array();
    $dupl = array();
}

function process_row($row, &$ingroup, &$onegroup, &$dupl, &$groups, $max) {
    if(array_key_exists($row['person_id'], $ingroup)) {
        $dupl[] = $row;
    } else {
        $onegroup[] = $row;
        $ingroup[$row['person_id']] = true;
    }
    if(count($onegroup) == $max) {
        $groups[] = $onegroup;
        $olddupl = $dupl;
        init($onegroup, $ingroup, $dupl);
        foreach($olddupl as $row) {
            process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
        }
        if(count($dupl) > 0) throw new Exception("Could not complete grouping");
    }
}

function dogrouping($raw, $max)
{
    $groups = array();
    init($onegroup, $ingroup, $dupl);
    foreach($raw as $row) {
        process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
    }
    $olddupl = $dupl;
    $dupl = array();
    foreach($olddupl as $row) {
        process_row($row, $ingroup, $onegroup, $dupl, $groups, $max);
    }
    if(count($dupl) > 0) throw new Exception("Could not complete grouping");
    if(count($onegroup) > 0) {
        $groups[] = $onegroup;
    }
    return $groups;
}

$raw = loadraw();
echo "Raw:\r\n";
foreach($raw as $row) {
    echo $row['id'] . ' ' . $row['person_id'] . "\r\n";
}

echo "\r\n";

$grouped = dogrouping($raw, 10);
$gn = 1;
foreach($grouped as $group) {
    echo "Group $gn:\r\n";
    foreach($group as $row) {
        echo '  ' . $row['id'] . ' ' . $row['person_id'] . "\r\n";
    }
    $gn++;
}

?>



CREATE TABLE grp (id INTEGER NOT NULL, person_id INTEGER NOT NULL, PRIMARY KEY(id));
INSERT INTO grp VALUES(1, 1005);
INSERT INTO grp VALUES(2, 1021);
INSERT INTO grp VALUES(3, 1002);
INSERT INTO grp VALUES(4, 1018);
INSERT INTO grp VALUES(5, 1015);
INSERT INTO grp VALUES(6, 1001);
INSERT INTO grp VALUES(7, 1022);
INSERT INTO grp VALUES(8, 1019);
INSERT INTO grp VALUES(9, 1006);
INSERT INTO grp VALUES(10, 1026);
INSERT INTO grp VALUES(11, 1014);
INSERT INTO grp VALUES(12, 1029);
INSERT INTO grp VALUES(13, 1003);
INSERT INTO grp VALUES(14, 1025);
INSERT INTO grp VALUES(15, 1017);
INSERT INTO grp VALUES(16, 1007);
INSERT INTO grp VALUES(17, 1028);
INSERT INTO grp VALUES(18, 1011);
INSERT INTO grp VALUES(19, 1027);
INSERT INTO grp VALUES(20, 1002);
INSERT INTO grp VALUES(21, 1012);
INSERT INTO grp VALUES(22, 1012);
INSERT INTO grp VALUES(23, 1027);
INSERT INTO grp VALUES(24, 1005);
INSERT INTO grp VALUES(25, 1016);
INSERT INTO grp VALUES(26, 1010);
INSERT INTO grp VALUES(27, 1024);
INSERT INTO grp VALUES(28, 1004);
INSERT INTO grp VALUES(29, 1016);
INSERT INTO grp VALUES(30, 1013);
INSERT INTO grp VALUES(31, 1009);
INSERT INTO grp VALUES(32, 1008);
INSERT INTO grp VALUES(33, 1023);
INSERT INTO grp VALUES(34, 1020);
Avatar billede arne_v Ekspert
28. januar 2013 - 19:16 #5
uforstaaelig kode?
Avatar billede Slettet bruger
30. januar 2013 - 21:45 #6
Tak for forslag. Jeg prøver at tage et kig på det. Dog har jeg løst problemet vha et Java program, men det var mest en nødløsning.
Smid et svar
Avatar billede arne_v Ekspert
31. januar 2013 - 00:55 #7
svar
05. februar 2013 - 09:01 #8
Hvad så, hansen.dk, lukker du spørgsmålet igen?  Så det ikke længere står åbent i min (og andres) liste af indlæg.  (Iøvrigt skylder du points.)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester