elemental_fighters
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| elemental_fighters [2025/10/31 13:55] – mbunic | elemental_fighters [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== Elemental Fighters ==== | + | ==== Zadatak s Hacknite platforme - Elemental Fighters ==== |
| - | Uz zadatak je dan i izvorni kod. \\ | + | Uz zadatak je dan i izvorni kod. |
| - | Spajanjem na zadatak otvara se izbor borca. Mogući izbor su 3 borca i 3 elementa za svakog borca. | + | Spajanjem na zadatak otvara se izbor borca, mogući izbor su 3 borca i 3 elementa za svakog borca. |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | No, analizom | + | Analizom |
| - | Analizom koda, zanimljiva je varijabla **s** (scale), koja određuje koliko će se oslabiti ili ojačati | + | Analizom koda zanimljiva je varijabla **s**, koja je " |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ova varijabla se kasnije u kodu množi s atributima neprijatelja: što je manja, neprijatelji su slabiji; što je veća, neprijatelji su jači. | + | Ova varijabla se kasnije u kodu množi s atributima neprijatelja |
| - | Također, zanimljiv dio koda je **player default**, koji definira varijablu | + | Također zanimljiv dio koda je player default, koji definira |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Najključniji dio koda je funkcija kojom se inicijalizira varijabla | + | Ključan dio koda je funkcija kojom se inicijalizira |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Ovdje se koristi funkcija **eval**, | + | Ovdje se može vidjeti da se koristi funkcija **eval**, |
| - | Sukladno tome, fighteri | + | Može se vidjeti da su fighteri |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Vrijednosti _fighterType_ definirane | + | a fighterType vrijednosti |
| - | To znači da unosom | + | To znači da je unosom |
| - | No, svaki unos prolazi kroz **validate_input**, filter koji određuje koji su unosi dozvoljeni. | + | Svaki unos prolazi kroz validate_input |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Kako bismo provjerili možemo | + | Kako bi provjerili |
| - | <code> | + | <file> |
| + | list(" | ||
| + | </file> | ||
| - | Unos izgleda ovako: | + | Odaberite element borca (Ice, Fire, Acid): aaaa |
| - | + | ||
| - | < | + | |
| - | Odaberite element borca (Ice, Fire, Acid): aaaa | + | |
| Odaberite borca (Zorn, Krev, Milo)list | Odaberite borca (Zorn, Krev, Milo)list | ||
| - | </ | ||
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Program vraća | + | Vidimo da je program vratio |
| - | Slično možemo pozvati: | + | Slično |
| - | <code> | + | <file> |
| + | len(" | ||
| + | </file> | ||
| - | Unos: | + | Poziva se na ovakav način. |
| - | <code> | + | <file> |
| - | Odaberite element borca (Ice, Fire, Acid): aaa | + | Odaberite element borca (Ice, Fire, Acid): aaa |
| Odaberite borca (Zorn, Krev, Milo)len | Odaberite borca (Zorn, Krev, Milo)len | ||
| - | </code> | + | </file> |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Program | + | Vidimo da program |
| - | Flag nije pohranjen | + | Flag nije zapisan niti u jednoj |
| - | Dobar pristup | + | Dobar pristup |
| - | Cijeli unos igrača se izvršava unutar **eval**, | + | Cijeli unos igrača se izvršava unutar |
| - | Potrebno je mijenjati druge varijable u globalnom kontekstu (npr. _s_) unutar eval-a. | + | < |
| + | " | ||
| + | </ | ||
| - | Python razlikuje *expression* i *statement*. *Statement* (npr. `a = 0`) izvršava akciju, ali ne vraća vrijednost | + | vraćena vrijednost |
| - | Dakle, **exec** se može koristiti za mijenjanje globalne varijable **s**. | + | < |
| + | len(" | ||
| + | </ | ||
| - | Primjer pokušaja: | + | vraćena vrijednost je 5, i bilo koja vrijednost koja će biti vraćena nakon izvršavanja ekspresije u **eval** funkciji će biti pridružena varijabli **player** (vidi sliku 4). |
| - | < | + | Potrebno je pronaći način kako mijenjati druge varijable u globalnom kontekstu programa, kao varijablu **s**, unutar **eval** funkcije, čiji se rezultat izvršavanja pridružuje varijabli **player**. |
| - | exec("s=0") | + | |
| - | </ | + | |
| - | Unos: | + | Osim **expression** u Pythonu, koji izvršava izraz i vraća izračunatu vrijednost izraza, postoji i **statement**, |
| - | <code> | + | Primjer **statement-a** |
| + | |||
| + | <file> | ||
| + | a = 0 | ||
| + | </ | ||
| + | |||
| + | , no pošto **statement** ne vraća ništa | ||
| + | |||
| + | < | ||
| + | b = (a = 0) | ||
| + | </ | ||
| + | |||
| + | je neispravan Python kod, kao što bi bilo i da se eval koristio. | ||
| + | |||
| + | < | ||
| + | eval(" | ||
| + | </ | ||
| + | |||
| + | (probajte u Python interpreteru). | ||
| + | |||
| + | Slično funkciji **eval**, postoji funkcija **exec**, koja je upravo namijenjena za izvršavanje **statement** (a može izvršavati i **expression**), | ||
| + | |||
| + | < | ||
| + | exec(" | ||
| + | </ | ||
| + | |||
| + | Pregledom funkcije za validaciju unosa na slici 6 vidi se da funkcija **exec** nije zabranjena. | ||
| + | |||
| + | Znači da se funkcija **exec** može koristiti za mijenjanje vrijednosti scale varijable **s**, koja je globalna varijabla. | ||
| + | |||
| + | Iz ovoga se može zaključiti da potencijalni način rješavanja ovog programa bi bio izvršiti: | ||
| + | |||
| + | < | ||
| + | exec(s=0) | ||
| + | </ | ||
| + | |||
| + | Čime bi unos izgledao ovako: | ||
| + | |||
| + | <file> | ||
| Odaberite element borca (Ice, Fire, Acid): s=0 | Odaberite element borca (Ice, Fire, Acid): s=0 | ||
| Odaberite borca (Zorn, Krev, Milo)exec | Odaberite borca (Zorn, Krev, Milo)exec | ||
| - | </code> | + | </file> |
| - | Pokretanjem | + | Pokretanjem |
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | {{ elemental_fighters: | + | |
| - | Rješenje: koristiti Pythonov | + | Greška je invalid syntax, koju zapravo baca parser |
| - | Primjer: | + | Opisana ponašanja su prikazana na slici 10. |
| - | < | + | {{ elemental_fighters:slika10.png? |
| - | U zagradama postaje validan | + | Na slici je prikazano da **eval** može izvršiti: |
| - | Rješenje unosa: | + | < |
| + | a==3 | ||
| + | </ | ||
| - | < | + | jer je to zapravo validan **expression** koji se evaluira u False. |
| - | Odaberite element borca (Ice, Fire, Acid): s:=0 | + | |
| - | Odaberite borca (Zorn, Krev, Milo)exec | + | |
| - | </ | + | |
| - | Time se postavlja varijabla | + | Način kako se ovo može postići je korištenjem Pythonovog " |
| - | {{ elemental_fighters: | + | Walrus |
| - | {{ elemental_fighters:slika12.png? | + | |
| - | Walrus operator je validan *expression*, | + | {{ elemental_fighters: |
| + | |||
| + | Na slici 11 može se vidjeti kako funkcionira walrus operator: evaluira **expression** "1 == 1", što je `True`, i to prosljeđuje kao rezultat **if izrazu**, ali također tu istu vrijednost postavlja kao vrijednost varijable **a**. | ||
| + | |||
| + | Walrus operatorom se može napisati validan **expression**, | ||
| + | |||
| + | Walrus operator | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | No ako se stave zagrade oko njega, izraz: | ||
| + | |||
| + | < | ||
| + | (a:=3) | ||
| + | </ | ||
| + | |||
| + | postaje | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Ovo je slučaj i u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | To čini ovaj pristup neizvedivim: | ||
| + | |||
| + | < | ||
| + | Odaberite element borca (Ice, Fire, Acid): s=0 | ||
| + | Odaberite borca (Zorn, Krev, Milo)milo | ||
| + | </ | ||
| + | |||
| + | |||
| + | "alrus operator je validan **expression** i namijenjen je za izvršavanje unutar **expressiona**, | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | I zato se također može izvršavati na ovaj način: | ||
| - | {{ elemental_fighters: | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ovaj postupak reproducira originalnu logiku | + | Što je, uz dodavanje zagrada, zapravo ekvivalentno ovom kodu: |
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Odnosno ovome, nakon zamjene stringova da se sve vidi u jednoj liniji: | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | I ovo je format | ||
| + | |||
| + | Nakon toga se mogu raditi daljnje redukcije, zamjenom **eval** funkcije i njenih argumenata s ekvivalentnim kodom, pa primjenom istog postupka za **exec** funkciju s proslijeđenim argumentima. Nakon redukcija ta linija koda postaje ekvivalentna samo walrus operatoru unutar zagrada. | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Rješenje | + | Sada je poznato rješenje |
| - | <code> | + | Rješenje se može unijeti ovako: |
| + | |||
| + | <file> | ||
| Odaberite element borca (Ice, Fire, Acid): s:=0 | Odaberite element borca (Ice, Fire, Acid): s:=0 | ||
| Odaberite borca (Zorn, Krev, Milo)exec | Odaberite borca (Zorn, Krev, Milo)exec | ||
| - | </code> | + | </file> |
| + | |||
| + | Izvršava se prethodno opisan postupak izvršavanja ovog koda, koji rezultira u postavljanju varijable **s** u 0, a varijable **player** u None, te se **player** onda inicijalizira u default, odnosno **Milo(" | ||
| + | |||
| + | {{ elemental_fighters: | ||
| - | Postavlja **s = 0** i _player | + | ==== Eval / Exec i global scope ==== |
| - | {{ elemental_fighters: | + | Budući da je ovo izvršeno u global scopeu, **exec** može promijeniti vrijednost scale varijable **s**, dok, da se izvršavao unutar funkcije, ne bi mogao promijeniti niti lokalnu varijablu unutar istog scopea kao funkcija. |
| - | Pošto se izvršava u global scopeu, **exec** može mijenjati globalnu varijablu **s**. Ako bi se izvršavalo unutar funkcije, lokalne varijable ne bi bile promijenjene. | + | {{ elemental_fighters: |
| - | {{ elemental_fighters: | + | Dok je pri izvršavanju u global scopeu, ovo moguće. |
| - | {{ elemental_fighters: | + | |
| - | Ovo vrijedi i za **eval** i za **exec**. | + | {{ elemental_fighters: |
| + | Ovo pravilo vrijedi i za **eval** i za **exec**, obje funkcije mogu mijenjati globalne varijable samo kada se izvršavaju u globalnom scopeu. | ||
elemental_fighters.1761918940.txt.gz · Last modified: 2025/12/01 11:40 (external edit)