Autor Zpráva
Weiron
Profil
Dobrý den,

na diskuzi jsem našel téma, které řeší můj problém, ale příliš jsem tomu kódu neporozuměl.

Kód:
$pocetTymu = 12;  
$n = (($pocetTymu & 1) == 0) ? $pocetTymu : $pocetTymu + 1;
 
$soupiska = array();
for ($i = 1; $i <= ($n - 1); $i++) {
    if (($pocetTymu & 1)==0)
        $soupiska[$i][] = "$i - $n";
      
    for ($j = 1; $j < ($n / 2); $j++) {
        $tym1 = (($n - $j + $i - 2) % ($n - 1)) + 1;
        $tym2 = (($i + $j - 1) % ($n - 1)) + 1;
        $soupiska[$i][] = "$tym1 - $tym2";
    }
}
print_r($soupiska);

Je tam na mě moc proměnných na jednom místě, jsem z toho kódu trochu "vyděšený", nedokázal by mi někdo nějak ty řádky popsat polopatě nebo dokonce by se někdo nepokusil to celé nějakým způsobem "zlehčit"?

Budu rád za každou radu či pomoc.

S pozdravem,
Weiron
Joker
Profil
Weiron:
Konstrukce, které vnímám jako pro začátečníka hůř pochopitelné:

(($pocetTymu & 1) == 0)
Udělá bitový AND s jedničkou, což je jeden možný způsob, jak určit, jestli je číslo sudé, nebo liché.
Dvojkový zápis lichých čísel vždy končí jedničkou, dvojkový zápis sudých čísel vždy končí nulou. Čili výsledkem číslo & 1 je 0 pokud je číslo sudé a 1 pokud je číslo liché.

Takže $n je vlastně počet týmů, „zaokrouhlený“ na sudé číslo (když $pocetTymu = 12, pak n = 12, kdyby $pocetTymu = 13, tak n = 14).

Pak se dělá jeden cyklus přes všechny týmy, to je asi jasné, a druhý cyklus jen pro polovinu týmů (protože kdyby se dělal i vnitřní cyklus přes všechny týmy, bude tam zápas A proti B a zápas B proti A, což je ten samý).

Dál vezmeme výpočet $tym2: Základ je ($i + $j - 1): To vlastně začne u týmu, na který zrovna ukazuje vnější cyklus (to je $i) a ve vnitřním cyklu postupně bere týmy, které jsou za ním, až nabere polovinu celkového počtu týmů. Čili když mám 12 týmů a ve vnějším cyklu jsem zrovna u týmu 2, vnitřní cyklus se udělá 5x a výsledek tohohle výrazu bude 2, 3, 4, 5, 6.

Má to ale háček, protože když budu v hlavním cyklu někde u konce, budou vznikat vyšší čísla, než počet týmů (třeba pro 10. tým to v jednotlivých cyklech vyjde 10, 11, 12, 13, 14).
Proto tam je ta druhá část, to modulo ($n - 1), což tu řadu „restartuje“ zase od začátku (10, 11, 0, 1, 2)… Tím ale dostáváme čísla 0-11 a týmy jsou 1-12, takže se ještě přičte 1.

Výpočet $tym1 je v podstatě to samé, jen se postupuje z opačné strany (od týmu 12 směrem dolů).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0