Kolejną rzeczą, bez której nie ruszymy dalej z zadaniami, jest okiełznanie dzielenia modulo (czyli reszty z dzielenia). Postaramy się to wyjaśnić.

Ok, mały test:

console.log(1 % 26); //1
console.log(5 % 26); //5
console.log(15 % 26); //15
console.log(25 % 26); //25
console.log(26 % 26); //0

Taki wyrywkowy test o niczym nie świadczy, ale ja już mam to przerobione, więc zasada jest taka:

  • Jeżeli to co dzielimy modulo (dzielna) jest mniejsze niż dzielnik to zwracamy liczbę bez żadnych ceregieli
  • Jeżeli dzielna i dzielnik są takie same to zero (nie ma reszty z dzielenia)
  • Jeżeli dzielna jest większa niż dzielnik to czarna magia (na razie).

Ok, nasza funkcja:

function modulo(dividend, divisor){
    if(dividend < divisor)
        return dividend;
    else if(dividend === divisor)
        return 0;
    else
        return "not implemented yet";
}

Dobra, teraz zobaczmy co i jak z dzielną większą niż dzielnik:

console.log(27 % 26); //1
console.log(28 % 26); //2
console.log(29 % 26); //3
console.log(30 % 26); //4

Wygląda jakbyśmy odejmowali dzielnik od dzielnej, jeżeli tak myślimy, to jesteśmy na dobrym tropie, ale nie do końca…

console.log(10 % 4); //2
console.log(12 % 4); //0
console.log(10 % 9); //1
console.log(30 % 9); //3

Cóż, 10 – 9 to jest 1, ale inne liczby się nie zgadzają. To jak to w zasadzie działa?

Działa tak – bierzemy dzielną większą od dzielnika i odejmujemy od niej dzielnik tak długo, aż dostaniemy coś mniejszego od dzielnika. Algorytmicznie to się zgadza, matematycznie też:

  • Algorytmicznie, 10 mod 4, 10 -4 to 6, 6 – 4 to 2, pasuje
  • Matematycznie: 10 podziel przez 4 bez reszty i zwróć resztę… 10/4 bez reszty to 8, reszta 2.

Możemy zatem napisać naszą funkcję:

function modulo(dividend, divisor){
    if(dividend === divisor)
        return 0;
    else {
        let result = dividend;

        while(result >= divisor){
            result = result - divisor;
        }

        return result;
    }
     
}

Możemy sprawdzić, jak działa:

console.log(modulo(25,26)); //25
console.log(modulo(26,26)); //0
console.log(modulo(27,26)); //1
console.log(modulo(28,26)); //2
console.log(modulo(29,26)); //3
console.log(modulo(30,26)); //4
console.log(modulo(10,4)); //2

Okiełznanie modulo (nawet jeśli na początku nie zrozumiemy wszystkiego) daje nam ogromne możliwości, co zobaczymy w następnych lekcjach.