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 14:45] – 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**, koja je " | + | 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 varijablu **player** kao: | + | Također zanimljiv dio koda je player default, koji definira |
| - | < | ||
| - | Milo(" | ||
| - | </ | ||
| - | |||
| - | ako je player None. | ||
| - | |||
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Najključniji dio koda je funkcija kojom se inicijalizira | + | Ključan dio koda je funkcija kojom se inicijalizira player |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Ovdje se može vidjeti da se koristi **eval** | + | Ovdje se može vidjeti da se koristi |
| - | Sukladno tome, može se vidjeti da su fighteri zapravo funkcije: | + | Može se vidjeti da su fighteri zapravo funkcije: |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Vrijednosti **fighterType** definirane | + | a fighterType |
| - | To znači da se unosom | + | To znači da je unosom fighterType (" |
| - | No svaki unos prolazi kroz validate_input, | + | Svaki unos prolazi kroz validate_input |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Kako bismo 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 61: | Line 43: | ||
| </ | </ | ||
| - | 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: | ||
| - | </ | ||
| - | Vidimo da je program vratio listu u kojoj se nalaze svi znakovi iz stringa koji smo poslali kao prvi argument, te oko njih 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 76: | Line 56: | ||
| </ | </ | ||
| - | Odaberite element borca (Ice, Fire, Acid): aaa | + | Poziva se na ovakav način. |
| - | Odaberite borca (Zorn, Krev, Milo)len | + | |
| < | < | ||
| - | {{ elemental_fighters: | + | Odaberite element borca (Ice, Fire, Acid): |
| + | Odaberite borca (Zorn, Krev, Milo)len | ||
| </ | </ | ||
| - | Vidimo da program vraća 5, što odgovara trima znakovima | + | {{ elemental_fighters: |
| - | No flag nije zapisan niti u jednoj varijabli, nego je hardkodiran u zadnjem printu programa. Zato je potrebno osmisliti način kako pozvati odgovarajuću funkciju i argument da bi se program uspješno izvršio do kraja i ispisao flag. | + | Vidimo da program vraća 5, što je točno 3 znakova a koje smo poslali plus dva znaka zagrada. |
| - | Dobar pristup | + | Flag nije zapisan niti u jednoj varijabli, nego je samo hardkodiran u zadnjem printu programa, pa je potrebno osmisliti način kako pozvati odgovarajuću funkciju i argument, da bi se program uspješno izvršio do kraja i ispisao flag. |
| + | |||
| + | Dobar pristup bi bio mijenjanje varijable **s** na slici 2, koja je skala jačine protivnika. Ako bi tu varijablu mogli smanjiti ili pretvoriti u 0, protivnici bi bili puno slabiji, dok činjenica da je unos potrošen na mijenjanje varijable **s** umjesto na inicijalizaciju | ||
| + | |||
| + | Cijeli unos igrača se izvršava unutar funkcije **eval**, koja je namijenjena samo za evaluiranje **expression**-a, | ||
| + | |||
| + | < | ||
| + | " | ||
| + | </ | ||
| - | No cijeli unos igrača izvršava se unutar **eval** funkcije, koja je namijenjena za evaluiranje *expression*. *Expression* je izraz koji nakon izvršavanja | + | vraćena vrijednost |
| < | < | ||
| - | " | + | len(" |
| - | len(" | + | |
| </ | </ | ||
| - | Svaka vrijednost vraćena nakon izvršavanja | + | vraćena |
| 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**. | 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 *expression* u Pythonu, koji izvršava izraz i vraća vrijednost, postoji i *statement*, | + | Osim **expression** u Pythonu, koji izvršava izraz i vraća |
| - | *Statement* je, primjerice: | + | Primjer **statement-a** |
| < | < | ||
| Line 108: | Line 95: | ||
| </ | </ | ||
| - | No pošto *statement* ne vraća ništa, ovaj izraz: | + | , no pošto |
| < | < | ||
| Line 114: | Line 101: | ||
| </ | </ | ||
| - | je invalidan | + | je neispravan |
| < | < | ||
| Line 120: | Line 107: | ||
| </ | </ | ||
| - | je invalidan | + | (probajte u Python |
| - | Slično **eval**, postoji funkcija **exec**, koja je namijenjena za izvršavanje *statement* (ali može izvršavati i *expression*), | + | Slično |
| < | < | ||
| Line 128: | Line 115: | ||
| </ | </ | ||
| - | Pregledom funkcije za validaciju unosa (slika | + | Pregledom funkcije za validaciju unosa na slici 6 vidi se da funkcija **exec** nije zabranjena. |
| + | |||
| + | Znači da se funkcija | ||
| 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 136: | Line 125: | ||
| </ | </ | ||
| - | Unos bi izgledao ovako: | + | Čime bi unos izgledao ovako: |
| < | < | ||
| - | 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 | ||
| </ | </ | ||
| - | Pokretanjem ovog unosa pojavljuje se greška: | + | Pokretanjem ovog unosa, prikazanog na slici 9, pojavljuje se greška. |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Greška je invalid syntax, koju baca parser **eval** funkcije. | + | Greška je invalid syntax, koju zapravo |
| - | Opisana ponašanja | + | Opisana ponašanja su prikazana |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| Na slici je prikazano da **eval** može izvršiti: | Na slici je prikazano da **eval** može izvršiti: | ||
| Line 163: | Line 148: | ||
| </ | </ | ||
| - | jer je to validan expression koji se evaluira u False. | + | jer je to zapravo |
| - | Može se zaključiti da je cilj napisati kod koji će parser **eval** odobriti, a koji će imati logiku jednaku **s=0** statement. Ovdje pomaže činjenica da **exec** | + | Način kako se ovo može postići je korištenjem Pythonovog " |
| - | Način da se to postigne je korištenjem Pythonovog " | + | Walrus operator |
| - | < | + | {{ elemental_fighters: |
| - | := | + | |
| - | </ | + | Na slici 11 može se vidjeti kako funkcionira walrus operator: evaluira **expression** " |
| + | |||
| + | 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**. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| - | koji je expression. Evaluira | + | No ako se stave zagrade oko njega, |
| < | < | ||
| Line 179: | Line 170: | ||
| </ | </ | ||
| - | Ovo je slučaj u kodu zadatka, jer se oko unosa dodaju zagrade (vidi sliku 14). | + | postaje validan **expression**, što je prikazano na slici ispod. |
| - | < | + | {{ elemental_fighters: |
| - | {{ elemental_fighters: | + | |
| - | </ | + | |
| - | Kada su zagrade | + | Ovo je slučaj i u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod. |
| - | < | + | {{ elemental_fighters: |
| - | {{ elemental_fighters: | + | |
| - | </ | + | |
| - | Zato rješenje: | + | 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 element borca (Ice, Fire, Acid): s=0 |
| Odaberite borca (Zorn, Krev, Milo)milo | Odaberite borca (Zorn, Krev, Milo)milo | ||
| </ | </ | ||
| - | nije moguće. | ||
| - | Ali walrus | + | " |
| - | < | + | {{ elemental_fighters: |
| - | {{ elemental_fighters: | + | |
| - | </ | + | I zato se također može izvršavati na ovaj način: |
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Š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 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. | ||
| + | |||
| + | 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: | ||
| + | |||
| + | Sada je poznato rješenje i način kako rješava zadatak. | ||
| Rješenje se može unijeti ovako: | Rješenje se može unijeti ovako: | ||
| < | < | ||
| - | 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 | ||
| </ | </ | ||
| - | Izvršava se prethodno | + | Izvršava se prethodno |
| - | < | ||
| - | Milo(" | ||
| - | </ | ||
| - | |||
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Eval / Exec i global scope: | + | ==== Eval / Exec i global scope ==== |
| - | Kada se izvršava u global scopeu, **exec** može promijeniti vrijednost varijable **s**. U local scope funkcije | + | Budući da je ovo izvršeno u global scopeu, **exec** može promijeniti vrijednost |
| - | < | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | </ | ||
| - | Pri izvršavanju u global scopeu, ovo je moguće. | + | 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.1761921946.txt.gz · Last modified: 2025/12/01 11:40 (external edit)