Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

O algorytmach w życiu codziennym.

Jak wszystkim zaznajomionym w temacie programowania wiadomo, najważniejsze są algorytmy. To dzięki algorytmice posiadamy coraz to lepsze rozwiązania problemów w programowaniu.

Na studiach nauczyłem się już wiele rzeczy. Długo by wymieniać. Mianowicie podczas ostatnich moich zabaw programistycznych napotkałem ciekawy problem. Mianowicie robiąc sobie "grę" postanowiłem, że moja postać będzie musiała się obracać aby spełniać inne czynności. Wszystko ładnie pięknie. Do pewnego momentu oczywiście, a co gdy chcę się obrócić w danym kierunku więcej niż raz? Wygląda to np tak.

turn left - aby obrócić się w lewo raz
turn left 9 - aby zrobić to 9 razy.

r   e   k   l   a   m   a

Oczywiście wynik działania byłby taki sam, jednak skoro można to napisać to czemu nie spróbować?

Nie wspomniałem wcześniej, że moja postać może się obracać tylko w 4 kierunkach oznaczonych kolejno zgodnie z kierunkiem wskazówek zegara 0,1,2 i 3 zaczynając od północy. A więc każdą cyfrę po komendzie turn left muszę potraktować działaniem modulo 4 (%4) aby wynik był poprawny. Idąc dalej tym tokiem myślenia rozpisałem sobie obracanie na kartce. Wynikiem rozpiski były permutacje (załączam dwie trudniejsze).

Jak każdy widzi problem nie taki łatwy na jaki wygląda. Pierwsza myśl była aby napisać


x=koniec.komendy%4
switch(x)
{case 0:{zmien.kierunek(3); break;}
case 1:{zmien.kierunek(0); break;}
case 2:{zmien.kierunek(1); break;}
case 3:{zmien.kierunek(2); break;}
}

Można to zastąpić instrukcjami if else. Jednak ja nie lubię tracić miejsca, a takich permutacji miałem 8. Jedne prostsze inne trudne jak te powyżej. Tutaj w grę weszły wszelkie umiejętności z algebry liniowej jakie nabyłem w trakcie studiowania a także trochę logiki. Postanowiłem więc poświęcić trochę czasu i znaleźć wzory na te permutacje. Faktem jest, że zajęło mi wszystko razem parę ładnych godzin jednak efekt jest porażający. Całego powyższego switcha udało się zastąpić jednym wzorem co na pewno przyśpiesza program, chociaż na pierwszy rzut oka czytelność kodu spada. Rozwiązaniem dla powyższych permutacji są kolejno wzory


1. ((4+(-3-x)%4)%4)
2. ((4+(-((2+x)%4)))%4)

Na pewno wzory te nie należą do najłatwiejszych ale rozwiązują wiele problemów. Między innymi zamiast pisać 8 funkcji switch napisałem 8 wzorów równie trudne jak te powyżej lub/i łatwiejszych.

Oczywiście gdybym przyjął 8 kierunków wzory byłyby dużo bardziej trudniejsze. Jeśli postać miałaby się obracać tak jak w realnym świecie na pewno ten sposób byłby do niczego, jednak dla 4 kierunków wydawał mi się on jak najbardziej najlepszy.

Z każdym krokiem w moim kursie programowania dowiaduje się, że kolejne działy matematyki, które uważałem za mało użyteczne pojawiają się coraz częściej.

Osobiście jestem ciekaw kiedy sięgnę po wykorzystanie całek aby rozwiązywać problemy.

Pozdrawiam. 

Komentarze