Avatar billede showsource Seniormester
13. april 2010 - 11:57 Der er 16 kommentarer og
1 løsning

Mulige forskellige talkombinationer

Hej
Hvis nu der er fra 1 til 10, og man gerne vil finde mulige "3-talskombinationer" indenfor 1 til 10, hvordan gør man det nemmest?

Altså:
123
124
125
126
o.s.v.
234
235
236

F.eks. vil flg. finde de 2 tals kombinationer der er:

function kombinationer($max=10) {

$mulige = array();

    for($i = 1; $i < $max; $i++) {
    $mulige[$i] = array();

        for($a = ($i+1); $a <= $max; $a++) {
        $mulige[$i][] = $a;
        }
    }

return $mulige;

}

Men den duer jo kun til to talskombinationer.
Hvordan laver man en funktion som finder mulige antal x talskombinationer ? F.eks. 3 eller 4 tals kombinationer.
Avatar billede michael_stim Ekspert
13. april 2010 - 12:15 #1
Her er den matematiske formel (på side 10):

http://www.math.auc.dk/~jgr/teaching/statI508/slides1.pdf
Avatar billede showsource Seniormester
13. april 2010 - 12:25 #2
Hmm, ja, bortset fra jeg har glemt ALT om matematik fra HF af :O)
Og resultatet skal ikke være antal gange, men mulige kombinationer.

(10*9*8)/(3'2'1)
Avatar billede showsource Seniormester
13. april 2010 - 12:42 #3
Jeg skal ud af døren, men den er der næsten:

function create_combs($max, $antal=2) {

$mulige = array();
$start = ($antal > 1 ? (($max+1)-$antal) : $max);

    for($i = 1; $i < $start; $i++) {
    $mulige[$i] = array();
    $next = ($i+1);

        for($a = $next; $a <= $start; $a++) {

            if($antal > 1) {
            $tal = array();
            $nextnr = ($a+1);

                while($nextnr <= $max) {
                $tal[] = $a;
                $tal[] = ($nextnr);
                $nextnr = ($nextnr+1);
                }
            // Her skal fixes
            $mulige[$i][] = implode(",",$tal);
            }else{
            $mulige[$i][] = $a;
            }

        }
    }

return $mulige;

}

Vil gerne ha' et array med key for hvert tal, og komma mellem hvert tal i kombination.

Array
(
    [1] => Array
        (
            [0] => 2,3
            [1] => 2,4
            [2] => 2,5
            [3] => 2,6
            [4] => 2,7
            [5] => 2,8
            [6] => 2,9
            [7] => 2,10
        }
}
Avatar billede showsource Seniormester
13. april 2010 - 12:43 #4
Hov, det skal jo blot være $nextnr++ i while
Avatar billede michael_stim Ekspert
13. april 2010 - 12:44 #5
for($a=1; $a<10; $a++){
for($b=1; $b<10; $b++){
  for($c=1; $c<10; $c++){
  echo $a.$b.$c."<br>";
  }
}
}
Avatar billede showsource Seniormester
13. april 2010 - 12:52 #6
Knap og nap
Troede ellers lige at det var så simpelt, men den rammer ikke rigtigt.
Avatar billede michael_stim Ekspert
13. april 2010 - 13:00 #7
Fandt denne her (OBS ikke testet):

http://www.zend.com//code/codex.php?ozid=1419&single=1
Avatar billede jantzen88 Nybegynder
13. april 2010 - 18:37 #8
Tror det her virker.. test gerne efter med lommeregner :)

Der hvor der står 10 under $fact1 er det antal kobinationer.
og under $fact2 (10-3) 10 er igen det samme og 3 er med det antal du vil have (3-talskombinationer).

Måden den regner på er ved at sige fact(10) - 10 * 9 * 8 ... * 1

Regner med du selv kan udbygge det lidt.

<?php

$fact1 = fact(10);
$fact2 = fact((10-3));

$fact = $fact1 / $fact2;

function fact($num) {
    if (is_numeric($num) && $num > 0) {
        $result = $num;
        for($x = $num-1; 0 < $x; $x--) {
            $result = $result * $x;
        }
        return $result;
    }
    echo "ERROR";
}

?>
Avatar billede showsource Seniormester
14. april 2010 - 17:14 #9
Det på zend.com tager også 123 og 132 o.s.v.  så det kan ikke bruges.
jantzen88 => jeg er ikke helt med ? :O)

Har dog fået brygget noget sammen:

function create_combs($max, $antal=2) {

$mulige = array();
$start = ($antal > 1 ? (($max+1)-$antal) : $max);

    for($i = 1; $i < $start; $i++) {
    $mulige[$i] = array();
    $next = ($i+1);

        for($a = $next; $a <= $start; $a++) {

            if($antal > 1) {
            $tal = array();
            $nextnr = ($a+1);

                while($nextnr <= $max) {
                $tal[] = $a;
                $tal[] = ($nextnr);
                $nextnr++;
                }

            $new = array_chunk($tal, $antal);
            $ialt = count($new);

                for($u = 0; $u < $ialt; $u++) {
                $mulige[$i][] = implode(",", $new[$u]);
                }

            }else{

            $mulige[$i][] = $a;

            }

        }
    }

return $mulige;

}

$talarray = create_combs(10,2);

echo "<pre>";
print_r($talarray);
echo"</pre>";


Det fungerer udmærket hvis jeg skal bruge mulige kombinationer mellem f.eks. 1 til 10

12
13
14

o.s.v
Ligeledes hvis det skal være

123
124
125

Men hvis jeg vil ha'

1234
1245
1256

er jeg nødt til at ændre antal i array_chunk()
Hvorfor nu det ?
Avatar billede jantzen88 Nybegynder
16. april 2010 - 19:16 #10
"Hvordan laver man en funktion som finder mulige antal x talskombinationer ? F.eks. 3 eller 4 tals kombinationer."

f.eks. tal række 1 til 10

$resultat = fact(10) / fact((10-3));

$resultat er så 720 dvs. der er 720 forskellige muligheder på en tal række 1 til 10 med 3 tal. 123 124 256 osv.
Avatar billede showsource Seniormester
16. april 2010 - 19:46 #11
jantzen88 => Kan godt se din logik, men hvordan får du dem udskrevet ?
Avatar billede showsource Seniormester
16. april 2010 - 19:50 #12
Lad os sige 5 er højeste tal.
Så skal alle kombinationer med to tal hentes.

12
13
14
15
23
24
25
34
35
45
Avatar billede showsource Seniormester
16. april 2010 - 19:51 #13
Og 12 og 21 er en og samme kombination.
Avatar billede jantzen88 Nybegynder
16. april 2010 - 22:15 #14
Kunne godt være jeg skulle give dig den rigtige formel..

fact(10) / (fact(3) * fact(10 - 3))
som så blir 120.
og med
fact(5) / (fact(2) * fact(5 - 2))
som blir 10.

Du kan ikke skrive kombinationer, kun hvor mange
Avatar billede showsource Seniormester
17. april 2010 - 06:31 #15
På et stykke papir ville det være:

5*4 = 20
2*1 = 2

20/2 = 10

"Du kan ikke skrive kombinationer, kun hvor mange"
er noget vrøvl.
Avatar billede showsource Seniormester
19. april 2010 - 19:37 #16
Nåh, er kommet frem til flg.

<?php
function combinations($max, $antal) {

$mulige = array();
$start = ($antal > 1 ? (($max+1)-$antal) : $max);

    for($i = 1; $i < $start; $i++) {
    $mulige[$i] = array();
    $next = ($i+1);

        for($a = $next; $a <= $start; $a++) {

            if($antal > 1) {
            $tal = array();
            $nextnr = ($a+1);

                while($nextnr <= $max) {
                $tal[] = $a;
                $tal[] = $nextnr;
                $nextnr++;
                $subnr = $nextnr;

                    for($n = 0; $n < ($antal-2); $n++) {
                    $tal[] = $subnr;
                    $subnr++;
                    }
                }

            $new = array_chunk($tal, ($antal));
            $ialt = count($new);
            $delkey = ($antal-1);

                for($u = 0; $u < $ialt; $u++) {
                    if($new[$u][$delkey] > $max) {
                    continue;
                    }
                $mulige[$i][] = implode(",", $new[$u]);
                }

            }else{
            $mulige[$i][] = $a;
            }
   
        }
    }

return $mulige;

}

$vars = combinations(6,3);

echo "<pre>";
print_r($vars);
echo"</pre>";

?>

Hvis der er en som kan forenkle koden, er der point.
Avatar billede showsource Seniormester
21. april 2010 - 19:29 #17
Lukker her
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