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:09] – mbunic | elemental_fighters [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ==== Zadatak s Hacknite platforme - Elemental Fighters ==== | ||
| + | |||
| + | 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. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Analizom koda u zadatku može se zaključiti da zapravo ne postoji kombinacija borca koja bi ni u najsretnijem slučaju uspjela pobijediti sve neprijatelje i doći do flaga, to znači da je potrebno nešto drugo učiniti jer ne postoji izbor pravog borca. | ||
| + | |||
| + | Analizom koda zanimljiva je varijabla **s**, koja je " | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Ova varijabla se kasnije u kodu množi s atributima neprijatelja i što je manja, neprijatelji su slabiji, a što je veća, neprijatelji su jači. | ||
| + | |||
| + | Također zanimljiv dio koda je player default, koji definira player varijablu kao **Milo(" | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Ključan dio koda je funkcija kojom se inicijalizira player varijabla iz izbora igrača. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Ovdje se može vidjeti da se koristi funkcija **eval**, kojime se fighter unos poziva kao funkcija, a fighterType kao argument. | ||
| + | |||
| + | Može se vidjeti da su fighteri zapravo funkcije: | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | a fighterType vrijednosti su definirane u rječniku, te se parsiraju pri pozivanju fighter funkcije. | ||
| + | |||
| + | To znači da je unosom fighterType (" | ||
| + | |||
| + | Svaki unos prolazi kroz validate_input funkciju, koja je filter koji određuje koji su unosi dozvoljeni, a koji nisu. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Kako bi provjerili da možemo pozvati proizvoljnu funkciju i argument, ako nemamo unos koji bi funkcija validacije zabranila, možemo probati pozvati: | ||
| + | |||
| + | < | ||
| + | list(" | ||
| + | </ | ||
| + | |||
| + | Odaberite element borca (Ice, Fire, Acid): aaaa | ||
| + | Odaberite borca (Zorn, Krev, Milo)list | ||
| + | |||
| + | {{ 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 za zagrade, koji su znakovi zagrada oko fighterType varijable (vidi sliku 4). | ||
| + | |||
| + | Slično se može pozvati len funkcija. | ||
| + | |||
| + | < | ||
| + | len(" | ||
| + | </ | ||
| + | |||
| + | Poziva se na ovakav način. | ||
| + | |||
| + | < | ||
| + | Odaberite element borca (Ice, Fire, Acid): aaa | ||
| + | Odaberite borca (Zorn, Krev, Milo)len | ||
| + | </ | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Vidimo da program vraća 5, što je točno 3 znakova a koje smo poslali plus dva znaka zagrada. | ||
| + | |||
| + | 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 našeg borca ne bi bio problem, jer postoji " | ||
| + | |||
| + | Cijeli unos igrača se izvršava unutar funkcije **eval**, koja je namijenjena samo za evaluiranje **expression**-a, | ||
| + | |||
| + | < | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | vraćena vrijednost je 4, | ||
| + | |||
| + | < | ||
| + | len(" | ||
| + | </ | ||
| + | |||
| + | 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**. | ||
| + | |||
| + | Osim **expression** u Pythonu, koji izvršava izraz i vraća izračunatu vrijednost izraza, postoji i **statement**, | ||
| + | |||
| + | Primjer **statement-a** | ||
| + | |||
| + | < | ||
| + | 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: | ||
| + | |||
| + | < | ||
| + | Odaberite element borca (Ice, Fire, Acid): s=0 | ||
| + | Odaberite borca (Zorn, Krev, Milo)exec | ||
| + | </ | ||
| + | |||
| + | Pokretanjem ovog unosa, prikazanog na slici 9, pojavljuje se greška. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Greška je invalid syntax, koju zapravo baca parser **eval** funkcije, koji pregledava kod prije nego će se izvršiti da odredi je li kod zapravo validan **expression**, | ||
| + | |||
| + | Opisana ponašanja su prikazana na slici 10. | ||
| + | |||
| + | {{ elemental_fighters: | ||
| + | |||
| + | Na slici je prikazano da **eval** može izvršiti: | ||
| + | |||
| + | < | ||
| + | a==3 | ||
| + | </ | ||
| + | |||
| + | jer je to zapravo validan **expression** koji se evaluira u False. | ||
| + | |||
| Način kako se ovo može postići je korištenjem Pythonovog " | Način kako se ovo može postići je korištenjem Pythonovog " | ||
| Line 5: | Line 156: | ||
| {{ elemental_fighters: | {{ 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 statementu**, ali također tu istu vrijednost postavlja kao vrijednost varijable **a**. | + | 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 operatorom se može napisati validan **expression**, |
| - | No walrus | + | Walrus |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| Line 23: | Line 174: | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ovo je zapravo | + | Ovo je slučaj |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| Line 29: | Line 180: | ||
| Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, | Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, | ||
| - | {{ elemental_fighters: | + | {{ elemental_fighters: |
| - | Zato rješenje: | + | To čini ovaj pristup neizvedivim: |
| < | < | ||
| Line 38: | Line 189: | ||
| </ | </ | ||
| - | nije moguće. | ||
| - | Ali walrus | + | " |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| Line 62: | Line 212: | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Sada je poznato rješenje i razlog zašto | + | 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: | ||
| Line 77: | Line 227: | ||
| ==== Eval / Exec i global scope ==== | ==== Eval / Exec i global scope ==== | ||
| - | Pošto | + | 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 |
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| Line 85: | Line 235: | ||
| {{ elemental_fighters: | {{ elemental_fighters: | ||
| - | Ovo vrijedi i za **eval** i za **exec**. | + | Ovo pravilo |
elemental_fighters.1761923342.txt.gz · Last modified: 2025/12/01 11:40 (external edit)