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 15:06] – 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 | + | Analizom koda zanimljiva je varijabla |
| - | + | ||
| - | < | + | |
| - | s | + | |
| - | </ | + | |
| - | + | ||
| - | , koja je " | + | |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ova varijabla se kasnije u kodu množi s atributima neprijatelja i š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 i što je manja, neprijatelji su slabiji, |
| - | Također zanimljiv dio koda je player default, koji definira player varijablu kao: | + | Također zanimljiv dio koda je player default, koji definira player varijablu kao **Milo(" |
| - | + | ||
| - | < | + | |
| - | Milo(" | + | |
| - | </ | + | |
| - | + | ||
| - | ako je player None. | + | |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Najključniji dio koda je funkcija kojom se inicijalizira player varijabla iz izbora igrača. | + | Ključan dio koda je funkcija kojom se inicijalizira player varijabla iz izbora igrača. |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ovdje se može vidjeti da se koristi | + | Ovdje se može vidjeti da se koristi |
| - | < | + | Može se vidjeti da su fighteri zapravo funkcije: |
| - | eval | + | |
| - | </ | + | |
| - | + | ||
| - | funkcija, kojime se fighter unos poziva kao funkcija, a fighterType kao argument. | + | |
| - | + | ||
| - | Sukladno tome, može se vidjeti da su fighteri zapravo funkcije: | + | |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| Line 49: | Line 31: | ||
| a fighterType vrijednosti su definirane u rječniku, te se parsiraju pri pozivanju fighter funkcije. | a fighterType vrijednosti su definirane u rječniku, te se parsiraju pri pozivanju fighter funkcije. | ||
| - | To znači da je unosom fighterType (" | + | To znači da je unosom fighterType (" |
| - | + | ||
| - | < | + | |
| - | eval | + | |
| - | </ | + | |
| - | + | ||
| - | funkciji. | + | |
| - | No svaki unos prolazi kroz validate_input, | + | Svaki unos prolazi kroz validate_input |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Kako bi provjerili da možemo pozvati proizvoljnu funkciju i argument, ako nemamo unos koji bi validate_function zabranio, možemo probati pozvati: | + | Kako bi provjerili da možemo pozvati proizvoljnu funkciju i argument, ako nemamo unos koji bi funkcija validacije zabranila, možemo probati pozvati: |
| < | < | ||
| Line 74: | Line 50: | ||
| Vidimo da je program vratio listu u kojoj se nalaze svi znakovi iz stringa koji smo poslali kao prvi argument, te oko njih znakovi za zagrade, koji su znakovi zagrada oko fighterType varijable (vidi sliku 4). | Vidimo da je program vratio listu u kojoj se nalaze svi znakovi iz stringa koji smo poslali kao prvi argument, te oko njih znakovi za zagrade, koji su znakovi zagrada oko fighterType varijable (vidi sliku 4). | ||
| - | Slično, možemo pozvati: | + | Slično |
| < | < | ||
| Line 80: | Line 56: | ||
| </ | </ | ||
| + | Poziva se na ovakav način. | ||
| + | |||
| + | < | ||
| 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 | ||
| + | </ | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Vidimo da program vraća 5, što je taman 3 znakova a koje smo poslali | + | Vidimo da program vraća 5, što je točno |
| - | No flag nije zapisan niti u jednoj varijabli, nego je samo hard kodiran | + | Flag nije zapisan niti u jednoj varijabli, nego je samo hardkodiran |
| - | Dobar pristup bi bio mijenjanje varijable | + | Dobar pristup bi bio mijenjanje varijable |
| - | No cijeli | + | Cijeli |
| - | + | ||
| - | < | + | |
| - | eval | + | |
| - | </ | + | |
| - | + | ||
| - | funkcije, koje je namijenjena samo za evaluiranje | + | |
| - | + | ||
| - | < | + | |
| - | expression | + | |
| - | </ | + | |
| - | + | ||
| - | , | + | |
| - | + | ||
| - | < | + | |
| - | expression | + | |
| - | </ | + | |
| - | + | ||
| - | je izraz koji nakon izvršavanja vraća neku vrijednost, na primjer | + | |
| < | < | ||
| Line 115: | Line 77: | ||
| </ | </ | ||
| - | , vraćena vrijednost je 4, | + | vraćena vrijednost je 4, |
| < | < | ||
| Line 121: | Line 83: | ||
| </ | </ | ||
| - | , kao na slici 8, vraćena vrijednost je 5, i bilo koja vrijednost koja će biti vraćena nakon izvršavanja ekspresije u | + | 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**. |
| - | eval | + | |
| - | </ | + | |
| - | funkciji | + | Osim **expression** u Pythonu, koji izvršava izraz i vraća izračunatu vrijednost izraza, postoji i **statement**, |
| - | < | + | Primjer **statement-a** |
| - | 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 | + | |
| - | </ | + | |
| - | + | ||
| - | Osim " | + | |
| - | + | ||
| - | < | + | |
| - | statement | + | |
| - | </ | + | |
| - | + | ||
| - | , koji izvršava definiranu akciju, no ne vraća ništa. | + | |
| - | + | ||
| - | < | + | |
| - | statement | + | |
| - | </ | + | |
| - | + | ||
| - | je na primjer | + | |
| < | < | ||
| Line 171: | Line 95: | ||
| </ | </ | ||
| - | , no pošto | + | , no pošto |
| - | + | ||
| - | < | + | |
| - | statement | + | |
| - | </ | + | |
| - | + | ||
| - | ne vraća ništa, također: | + | |
| < | < | ||
| Line 183: | Line 101: | ||
| </ | </ | ||
| - | je invalidan | + | je neispravan |
| < | < | ||
| Line 189: | Line 107: | ||
| </ | </ | ||
| - | je također invalidan Python kod (probajte u Python interpreteru). | + | (probajte u Python interpreteru). |
| - | Slično funkciji | + | Slično funkciji |
| - | + | ||
| - | < | + | |
| - | eval | + | |
| - | </ | + | |
| - | + | ||
| - | , postoji funkcija | + | |
| - | + | ||
| - | < | + | |
| - | exec | + | |
| - | </ | + | |
| - | + | ||
| - | , koja je upravo namijenjena za izvršavanje | + | |
| - | + | ||
| - | < | + | |
| - | statement | + | |
| - | </ | + | |
| - | + | ||
| - | (a može izvršavati i | + | |
| - | + | ||
| - | < | + | |
| - | expression | + | |
| - | </ | + | |
| - | + | ||
| - | ), te može definirati ili mijenjati varijable u globalnom kontekstu programa, ako se također pokreće u globalnom kontekstu programa. | + | |
| < | < | ||
| Line 221: | Line 115: | ||
| </ | </ | ||
| - | Pregledom funkcije za validaciju unosa na slici 6 vidi se da funkcija | + | 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. | + | 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: | Iz ovoga se može zaključiti da potencijalni način rješavanja ovog programa bi bio izvršiti: | ||
| Line 260: | Line 136: | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Greška je invalid syntax, koju zapravo baca parser | + | Greška je invalid syntax, koju zapravo baca parser |
| - | < | + | Opisana ponašanja su prikazana na slici 10. |
| - | eval | + | |
| - | </ | + | |
| - | funkcije, koji pregledava kod prije nego će se izvršiti | + | {{ elemental_fighters: |
| + | |||
| + | Na slici je prikazano da **eval** može izvršiti: | ||
| < | < | ||
| - | expression | + | a==3 |
| </ | </ | ||
| - | , iako je kod namijenjen da bude proslijeđen | + | jer je to zapravo validan **expression** koji se evaluira u False. |
| - | < | + | Način kako se ovo može postići je korištenjem Pythonovog " |
| - | exec | + | |
| - | </ | + | |
| - | funkciji koja bi ovaj kod mogla normalno izvršiti. | + | Walrus operator se označava znakovima `:=`. |
| - | Opisana ponašanja su prikazana na slici 10. | + | {{ elemental_fighters: |
| - | {{ elemental_fighters:slika10.png? | + | 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**. |
| - | Na slici je prikazano da | + | Walrus operatorom se može napisati validan **expression**, |
| - | < | + | Walrus operator se ne može sam izvršavati niti unutar **eval** niti unutar **exec** funkcije, zato što je namijenjen da bude izvršen unutar **expressiona**. |
| - | eval | + | |
| - | </ | + | |
| - | može izvršiti: | + | {{ elemental_fighters:slika12.png? |
| - | < | + | No ako se stave zagrade oko njega, izraz: |
| - | a==3 | + | |
| - | </ | + | |
| - | + | ||
| - | jer je to zapravo validan | + | |
| < | < | ||
| - | expression | + | (a:=3) |
| </ | </ | ||
| - | koji se evaluira u False. | + | postaje validan **expression**, |
| - | Može se zaključiti da je cilj napisati takav kod, koji će parser | + | {{ elemental_fighters: |
| - | < | + | Ovo je slučaj i u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod. |
| - | eval | + | |
| - | </ | + | |
| - | funkcije odobriti, a koji će imati logiku jednaku | + | {{ elemental_fighters: |
| - | < | + | Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, |
| - | s=0 | + | |
| - | </ | + | |
| - | < | + | {{ elemental_fighters: |
| - | statement | + | |
| - | </ | + | |
| - | , iako je valid | + | To čini ovaj pristup neizvedivim: |
| < | < | ||
| - | expression | + | Odaberite element borca (Ice, Fire, Acid): s=0 |
| + | Odaberite borca (Zorn, Krev, Milo)milo | ||
| </ | </ | ||
| - | . Ovdje pomaže činjenica da | ||
| - | < | + | "alrus operator je validan **expression** i namijenjen je za izvršavanje unutar **expressiona**, |
| - | exec | + | |
| - | </ | + | |
| - | funkcija može izvršavati | + | {{ elemental_fighters: |
| - | < | + | I zato se također može izvršavati na ovaj način: |
| - | expression | + | |
| - | </ | + | |
| - | , zato se treba napisati | + | {{ elemental_fighters: |
| - | < | + | Što je, uz dodavanje zagrada, zapravo ekvivalentno ovom kodu: |
| - | expression | + | |
| - | </ | + | |
| - | , koji će | + | {{ elemental_fighters: |
| - | < | + | Odnosno ovome, nakon zamjene stringova da se sve vidi u jednoj liniji: |
| - | eval | + | |
| - | </ | + | |
| - | parser odobriti, koji će | + | {{ elemental_fighters: |
| - | < | + | I ovo je format inicijalizacije **player** varijable u zadatku, pa time i rješenja ovog zadatka; ove zagrade su iste kao i u liniji koda inicijalizacije **player** varijable **eval** funkcijom na slici 4. |
| - | exec | + | |
| - | </ | + | |
| - | izvršiti | + | Nakon toga se mogu raditi daljnje redukcije, zamjenom **eval** funkcije |
| - | < | + | {{ elemental_fighters: |
| - | exec | + | |
| - | </ | + | |
| - | funkciji, promijeniti vrijednost globalne varijable scale | + | Sada je poznato rješenje i način kako rješava zadatak. |
| - | < | + | Rješenje |
| - | s | + | |
| - | </ | + | |
| - | + | ||
| - | Način kako se ovo može postići je korištenjem Pythonovog " | + | |
| < | < | ||
| - | expression | + | Odaberite element borca (Ice, Fire, Acid): s:=0 |
| + | Odaberite borca (Zorn, Krev, Milo)exec | ||
| </ | </ | ||
| - | , vraća rezultat evaluacije | + | 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: |
| - | expression | + | |
| - | </ | + | |
| - | , ali također evaluirani | + | ==== Eval / Exec i global scope ==== |
| - | < | + | 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. |
| - | expression | + | |
| - | </ | + | |
| - | , nakon evaluacije postavlja kao vrijednost dane varijable. | + | {{ elemental_fighters: |
| - | Walrus operator se označava znakovima: | + | Dok je pri izvršavanju u global scopeu, ovo moguće. |
| - | + | ||
| - | < | + | |
| - | := | + | |
| - | </ | + | |
| - | {{ elemental_fighters: | + | {{ 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.1761923169.txt.gz · Last modified: 2025/12/01 11:40 (external edit)