bilten kamp 2010kamp 2010. 7 ravnatelj škole g. sergio samblić nastavio je svečanost riječima:...

68

Upload: others

Post on 22-Jan-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

S A D R Ž A J UVOD

20. kamp mladih informatičara Hrvatske ............................................................................3 Pregled radionica, voditelja i pohvaljenih polaznika ..........................................................5 Svečano otvaranje ...............................................................................................................6 Sudionici 20. kampa............................................................................................................8 Svečano zatvaranje ............................................................................................................10 Popis polaznika po radionicama........................................................................................12

RADIONICE Logo početni......................................................................................................................21 Logo za natjecatelje...........................................................................................................22 BASIC ...............................................................................................................................28 C početni ...........................................................................................................................29 PYTHON...........................................................................................................................33 Visual Basic.......................................................................................................................37 Flash ..................................................................................................................................38 Izrada WEB stranica..........................................................................................................41 PHP ...................................................................................................................................43 Algoritmi za OŠ ................................................................................................................45 Algoritmi početni ..............................................................................................................48 Algoritmi napredni ............................................................................................................51 Linux .................................................................................................................................54 Olimpijci ...........................................................................................................................57

SPONZORI

Pokroviteljstvo i potpora ...................................................................................................67

KAMP 2010. 2

KAMP 2010. 3

20. KAMP MLADIH INFORMATIČARA HRVATSKE – KRK 2010.

20. kamp mladih informatičara Hrvatske, u organizaciji Hrvatskog saveza informatičara – HSIN-a, održan je u Krku od 27. lipnja do 8. srpnja 2010. godine. Suorganizatori ove ljetne škole informatike već sedmi puta bili su Osnovna škola Frana Krste Frankopana u Krku i Klub informatičara otoka Krka – KIOK. Program Kampa odvijao se pod pokroviteljstvom i uz financijsku potporu Ministarstva znanosti, obrazovanja i športa RH, Hrvatske zajednice tehničke kulture i Hrvatskog informatičkog zbora – HIZ-a, te uz financijsku i ostalu potporu Grada Krka i T-HT-a.

Premda jubilarni, s kroz dva desetljeća dokazanim vrijednostima i postignućima u vanškolskom obrazovanju mladih informatičara Hrvatske, 20. kamp nije uspio izbjeći općoj recesiji u državi. Organiziran je u samo jednom terminu od 27. lipnja do 8. srpnja 2010. Tijekom 11 dana trajanja, program Kampa uspješno je završilo 73 učenika osnovnih i srednjih škola RH.

20. kamp pohađalo je 52 učenika osnovnih škola, od kojih je 15 pozvao HSIN temeljem natječaja, i 21 učenik srednjih škola, od kojih je 14 pozvao HSIN.

Za polaznike Kampa održano je 14 radionica, koje su vodili stručni suradnici HSIN-a. Osnovne teme ovog programa bile su:

• Programski jezici: Logo, Basic, C, Visual Basic i Python • Algoritmi: početni, napredni, rješavanje složenih zadataka na algoritamskoj osnovi • Sistemski softver: Linux • Internet: Izrada WEB stranica, PHP • Grafička animacija: FLASH

Program se odvijao u četiri učionice opremljene s pedesetak računala. Povezanost s internetom

ostvarena je CARNet-ovom vezom od 10Mb/s.

Voditelji 20. kampa bili su Boris Bolšec, prof. informatike u OŠ F. K. Frankopan i Aron Bohr, stručni suradnik u HSIN-u. Glavni i odgovorni organizator ovog najpopularnijeg programa HSIN-a, već je 20-tu godinu Ivo Šeparović, dipl. ing., tajnik HSIN-a.

KAMP 2010. 4

Posebno nas je obradovao obnovljeni interes polaznika za učenje programskih jezika i učenje

algoritama na ovome Kampu, jer su to osnovna znanja neophodna kreativnim informatičarima.

Novost u programu Kampa bila je radionica Python, koji je trenutno jedan od 10 najpopularnijih programskih jezika. Koriste ga programeri u velikim tvrtkama (Google) kao i studenti na fakultetima (npr. MIT i FER). Odlikuje ga jednostavna sintaksa te podržavanje različitih stilova programiranja, od strukturnog do objektno-orijentiranog. Zbog svojih osobina, Python se pokazuje kao jezik koji može zamijeniti Basic i Pascal u učenju osnova programiranja. Prednost Pythonu daje "open source" licenca, te besplatno korištenje i preuzimanje programskog paketa i dodatnih modula kao i mogućnost rada na različitim platformama (Linux,

Windows, Unix...). Ovaj jezik je svojim karakteristikama privukao polaznike radionice koji su iskazali želju za njegovim daljnjim proučavanjem.

Radionica Olimpijci organi-zirana je samo za pripreme repre-zentativca Republike Hrvatske iza-branih temeljem rezultata na HIO 2010. i Izbornim pripremama 2010. Oni će zastupati našu zemlju na 17. srednjoeuropskoj informatičkoj olimpijadi – CEOI 2010 u Slovačkoj i na 22. međunarodnoj informatičkoj olimpijadi – IOI 2010 u Kanadi. Kreator i stručni voditelj priprema olimpijaca na Kampu bio je Luka Kalinovčić, dipl. ing., stručni vodi-telj hrvatske reprezentacije, dok je odgovorni voditelj reprezentacije, Ivo Šeparović, dipl. ing.

Nakon jedanaest dana učenja i druženja, uz usvojena nova znanja i stečena nova poznanstava, 7. srpnja 2010. svečano je zatvoren 20. kamp mladih informatičara. Bila je to još jedna prilika da se obilježi ova vrijedna, dvadeseta godišnjica Kampa, programa kojeg je HSIN pokrenuo još davne 1991. godine u Rapcu. Podijeljena su priznanja, pohvale najboljima i zahvale predavačima, organizatorima i pokroviteljima 20. kampa. Pohvaljeni učenici i profesori dobili su i prigodnu publikaciju "20 ljetnih škola informatike HSIN-a, 1991.-2010." koju je HSIN izdao uz ovaj jubilej.

Čast da zatvori jubilarni, 20. kamp mladih informatičara Hrvatske tradicionalno je pripala g. Dariju Vasiliću, gradonačelniku Grada Krka.

Organizator Kampa 2010. Ivo Šeparović, dipl. ing.

KAMP 2010. 5

PREGLED RADIONICA, VODITELJA I POHVALJENIH POLAZNIKA

R. br. Radionica Voditelj Broj

polaznika Pohvaljeni

1. LOGO početni Alenka Žužić, prof. 8 Klara Justinić i Lovro Mršić

2. LOGO za natjecatelje Ivica Kičić 9 Marija Gegić i Ivan Lazarić

3. BASIC Alenka Žužić, prof. 19 Sanja Bjelobradić, Ena Topić, Carlo Cola i Lucija Žužić

4. C početni Zrinka Gavran 10 Nikola Pintarić i Ivana Žužić

5. Python Nikola Dmitrović, prof. 12 Matej Ferenčević i Sergej Jakovljev

6. VISUAL BASIC Marijan Jurešić, dipl. ing. Gordan Nekić 8 Tonko Sabolčec i Karlo

Kovačić

7. FLASH Siniša Topić, prof. 22 Kristijan Vulinović, Antonio Brusić, Luka Brozić, Sanja Bjelobradić i Ivana Žužić

8. ALGORITMI za osnovne škole

Zrinka Gavran Nikola Dmitrović, prof. 16

Marija Gegić, Vedran Kurdija, Mihael Pribanić i Karlo

Kovačić

9. ALGORITMI početni

Ivan Katanić Tomislav Gudlek 11 Mihael Peklar i Dominik

Gleich

10. ALGORITMI napredni

Adrian Satja Kurdija Stjepan Glavina 14 Gustav Matula, Antun Razum

i Mislav Balunović

11. LINUX Tomislav Gudlek 6 Ivan Lazarić

12. Izrada WEB stranica Zrinka Gavran 6 Ena Topić i Miroslav Bićanić

13. PHP Gordan Nekić 9 Matteo Kinkela i Marija Vančina

14. Olimpijci Luka Kalinovčić, ing. 5 -

KAMP 2010. 6

SVEČANO OTVORENJE

Jubilarni, 20. kamp mladih informatičara Hrvatske u organizaciji Hrvatskog saveza informatičara – HSIN-a, svečano je otvoren 28. lipnja 2010. godine u Osnovnoj školi Frana Krste Frankopana u Krku.

Na prigodnoj svečanosti otvorenja Kampa polaznicima, predavačima i gostima prvi se obratio organizator ovog programa, g. Ivo Šeparović, tajnik HSIN-a. Nakon pozdrava i dobrodošlice polaznicima, predavačima i uvaženim gostima na jubilarni, 20. kamp, g. Šeparović je rekao:

Žao mi je što ćemo danas ovu jubilarnu obljetnicu našeg Kampa zbog objektivnih okolnosti skromno obilježiti, a koja je trebala biti drugačija za dvadeset godina našeg rada, kako to zaslužuje. Kao utemeljitelj i organizator ovog programa HSIN-a, a povodom 20. godišnjice održavanja Kampa, želim naglasiti: «Ovaj program najbolje nadopunjuje trud i brigu HSIN-a o mladim informatičarima Hrvatske, kao obuhvat cjelogodišnjeg programa (natjecanja, smotre, zimske škole i dr.), te daje onim najboljima finalizaciju stečenih znanja. Ovo oni odlično koriste za svoj osobni, znanstveni razvitak, a postižu i sjajne rezultate u nadmetanju s vršnjacima iz cijelog svijeta. Na velikom broju međunarodnih natjecanja u Europi i svijetu postali su ono što svaki natjecatelj, pa i hrvatski informatički olimpijac želi biti – pobjednik». Molim vas da sada jednim pljeskom pozdravite ovdje neke od

njih koji su bili pobjednici, a spomenut ću vam samo dvojicu zlatnih, Luku Kalinovčića, ing. i Stjepana Glavinu. Ove smo godine zbog, kako sam već rekao, objektivnih okolnosti morali održati Kamp u jednom terminu, dakle vi ste sada tu svi zajedno, najbolji srednjoškolci i osnovnoškolci, ukupno četrdesetak najuspješnijih mladih informatičara Hrvatske u 2010. godini, a pridružilo vam se još otprilike toliko učenika iz grada i otoka Krka. A ono najvažnije je da će najbolji srednjoškolci sada biti i predavači i ja im se zahvaljujem, jer vjerujem da je to jedan od ključnih faktora, rekao bih motiva i nada da uspješno nastavimo dalje u vremenima koja su pred nama.

Grb Grada Krka

KAMP 2010. 7

Ravnatelj škole g. Sergio Samblić nastavio je svečanost riječima:

Dragi mladi informatičari, poštovani profesori, mentori, gospodine tajniče Hrvatskog saveza informatičara. Sama činjenica da je tu s nama gradonačelnik Grada Krka pokazuje dosta toga, a to je da naša škola zajedno sa gradom Krkom ulaže ogromna sredstva u informatizaciju naše škole i u obrazovanje naših učenika što se tiče informatike. Posebno mi je drago da se 20. kamp informatičara održava ponovno, već sedmi put u našoj školi. Naša škola inače s ponosom ističe puno rezultata na državnim natjecanjima, županijskim i općinskim u informatici. Drago nam je da naši učenici imaju čast ovdje učiti zajedno sa vama koji ste najbolji informatičari u Hrvatskoj, koji idete i na državna natjecanja i na međunarodne olimpijade. Zato nam je drago da smo mi ovdje domaćini i da imamo čast biti vama na usluzi. Želim vam srdačnu dobrodošlicu, želim da se u gradu Krku lijepo osjećate, da se lijepo provedete, da osim što učite, da se i zabavite. Evo, pa dobro došli i lijepo se provedite u našoj školi.

Mladim informatičarima obratio se i g. Mladen Glasenhardt, predsjednik Hrvatskog informatičkog zbora, krovne udruge hrvatskih informatičara:

Sa zadovoljstvom sam danas ovdje i sa zadovoljstvom susrećem na zimskim školama, ljetnim školama, olimpijadama i europskim prvenstvima g. Šeparovića. U svim programima se vidi njegov rad, trud i zasluge. Ima ljudi koji pokreću sve oko sebe da se kreće i stvaraju nove mlade ljude, a jedan od takvih je i g. Ivo Šeparović. Ovo je 20. jubilarna ljetna škola, a počelo se davne 1991. u Rapcu, te zahvaljujući tim programima HSIN-a, Hrvatska je postala vrlo ugledna na svjetskim olimpijadama informatičara gdje imamo niz zlatnih, srebrnih i brončanih odličja. Također je veliko priznanje Hrvatskoj i HSIN-u bilo organizacija svjetske olimpijade 2007. g. u Zagrebu. Ja se nadam da ćete vi i u ovoj školi dosta naučiti, dosta napredovati i uskoro predstavljati Hrvatsku na svjetskoj razini. Želim vam mnogo sreće i uspjeha u radu. Sretno!

Čast da otvori jubilarni, 20. kamp mladih informatičara Hrvatske tradicionalno je pripala g.

Dariju Vasiliću, gradonačelniku Grada Krka:

Dragi mladi informatičari Hrvatske, dame i gospodo, Meni je isto izuzetno zadovoljstvo pozdraviti vas i izraziti dobrodošlicu u ime Grada Krka, kao i zadovoljstvo da je Kamp mladih informatičara po sedmi put u gradu Krku. Lijepo je i to što g. Šeparović i Hrvatski savez informatičara u kontinuitetu, dvadeset godina uzastopce, u vrijeme kad završi školska godina i kad su vaši vršnjaci na plažama i na ljetnom odmoru, okupljaju vrsne mlade informatičare Hrvatske ponovno u školama i pripremaju ih da na svjetskim i europskim razinama postignu izuzetne rezultate. I upravo se u tome razlikuju nadareni učenici od onih drugih učenika, jer dok se svi ovi drugi odmaraju, vi radite i u školi ste. Naravno spajate taj rad, spajate nove spoznaje i nova znanja i s ugodom i s odmorom i s kupanjem, i vjerojatno ćete zato u životu biti puno uspješniji. Evo, ja se nadam da i među vama, kao što smo i čuli, postoje pravi predvodnici hrvatske informatike, ljudi koji će biti nada hrvatske znanosti. Želim vam da u životu budete tako uspješni kao do sada, da postignete prave rezultate na svjetskim natjecanjima i da se u Krku dobro provedete. Na kraju proglašavam ovaj sedmi u Krku, a dvadeseti ukupno Kamp mladih informatičara Hrvatske otvorenim.

KAMP 2010. 8

SUDIONICI KAMPA 2010.

UČENICI OSNOVNIH ŠKOLA

R. br. Ime i prezime Škola/klub, mjesto Razred

1. Josip Bajčić OŠ F. K. Frankopan, Vrh 5. 2. Mislav Balunović OŠ D. Tadijanovića, Slavonski Brod 8. 3. Miroslav Bićanić OŠ F. K. Frankopan, Malinska 5. 4. Sanja Bjelobradić OŠ F. K. Frankopan, Krk 5. 5. Luka Brozić OŠ F. K. Frankopan, Vrh 7. 6. Antonio Brusić OŠ F. K. Frankopan, Vrh 7. 7. Carlo Cola OŠ F. K. Frankopan, Krk 7. 8. David Crkvenčić OŠ F. K. Frankopan, Krk 5. 9. Matej Ferenčević IV. osnovna škola, Bjelovar 8. 10. Branimir Filipović OŠ Trnsko, Zagreb 7. 11. Anamaria Fugošić OŠ F. K. Frankopan, Krk 4. 12. Marija Gegić OŠ Retkovec, Zagreb 6. 13. Dominik Gleich OŠ P. Miškine, Zagreb 8. 14. Matej Gradiček I. osnovna škola, Vrbovec 8. 15. Domagoj Grdinić OŠ F. K. Frankopan, Dobrinj 7. 16. Dino Ilić OŠ Dr. A. Mohorovičić, Matulji 8. 17. Dominik Ivanković OŠ Blato, Blato 6. 18. Pavao Jerebić OŠ Blato, Blato 7. 19. Klara Justinić OŠ F. K. Frankopan, Malinska 4. 20. Filip Keri I. osnovna škola, Vrbovec 8. 21. Matteo Kinkela OŠ R. K. Jeretov, Opatija 8. 22. Silvija Kosić OŠ F. K. Frankopan, Vrh 5. 23. Iva Kovačević OŠ F. K. Frankopan, Malinska 7. 24. Karlo Kovačić Udruga MIS, Strahoninec 5. 25. Ivan Kožar Informatički klub NET, Ivanić Grad 6. 26. Vedran Kurdija OŠ Mladost, Zagreb 5. 27. Ivan Lazarić OŠ Centar, Pula 7. 28. Filip Lipovac OŠ F. K. Frankopan, Malinska 7. 29. Mihael Liskij OŠ P. Preradovića, Zagreb 7. 30. Vedran Mihal OŠ Dragutin Tadijanović, Sl. Brod 7. 31. Lovro Mršić OŠ F. K. Frankopan, Krk 4. 32. Mihael Peklar OŠ G. Krkleca, Zagreb 8. 33. Niko Peričić OŠ F. K. Frankopan, Vrh 5. 34. Nikola Pintarić OŠ I. G. Kovačić, Sveti Juraj na Bregu 6. 35. Mihael Pribanić Informatički klub GuK, Križ 6. 36. Filip Pržić OŠ F. K. Frankopan, Malinska 5. 37. Iris Radivoj OŠ F. K. Frankopan, Krk 4. 38. Tonko Sabolčec OŠ I. G. Kovačić, Sveti Juraj na Bregu 7.

KAMP 2010. 9

39. Marina Samblić OŠ F. K. Frankopan, Krk 4. 40. Dominik Sintić OŠ F. K. Frankopan, Krk 5. 41. Karlo Sintić OŠ F. K. Frankopan, Krk 4. 42. Emil Srbljanin OŠ Poreč, Poreč 8. 43. Ena Topić OŠ F. K. Frankopan, Malinska 5. 44. Luka Topić OŠ F. K. Frankopan, Malinska 4. 45. Marija Vančina OŠ F. K. Frankopan, Krk 7. 46. Fran Vasilić OŠ F. K. Frankopan, Krk 4. 47. Nikola Vladić OŠ F. K. Frankopan, Vrbnik 6. 48. Kristijan Vulinović OŠ Kraljevica, Kraljevica 8. 49. Ivan Žmirić OŠ F. K. Frankopan, Krk 6. 50. Iva Žužić OŠ F. K. Frankopan, Malinska 8. 51. Ivana Žužić OŠ Fran Franković, Rijeka 7. 52. Lucija Žužić OŠ Fran Franković, Rijeka 4.

UČENICI SREDNJIH ŠKOLA

R. br. Ime i prezime Škola/klub, mjesto Razred

1. Goran Flegar I. gimnazija Varaždin, Varaždin 3. 2. Zrinka Gavran V. gimnazija, Zagreb 4. 3. Stjepan Glavina Srednja škola Prelog, Prelog 4. 4. Tomislav Gudlek V. gimnazija, Zagreb 4. 5. Luka Hrabar Gim. L. Vranjanina, Zagreb 3. 6. Sergej Jakovljev XV. gimnazija, Zagreb 1. 7. Fran Jurišić XV. gimnazija, Zagreb 4. 8. Ivan Katanić Gimnazija Požega, Požega 3. 9. Ivica Kičić V. gimnazija, Zagreb 3.

10. Ivan Kovačević Gim. A. Mohorovičića, Rijeka 3. 11. Adrian Satja Kurdija V. gimnazija, Zagreb 4. 12. Gustav Matula XV. gimnazija, Zagreb 3. 13. Zvonimir Medić XV. gimnazija, Zagreb 1. 14. Neven Miculinić Gim. A. Mohorovičića, Rijeka 1. 15. Matija Milišić XV. gimnazija, Zagreb 2. 16. Dino Rakipović Srednja škola Valpovo, Valpovo 2. 17. Antun Razum XV. gimnazija, Zagreb 2. 18. Albert Sparožić SŠ Hrv. kralj Zvonimir, Krk 2. 19. Marin Tomić V. gimnazija, Zagreb 1. 20. Edi Topić Gim. A. Mohorovičića, Rijeka 2. 21. Tomislav Tunković Gim. L. Vranjanina, Zagreb 2.

KAMP 2010. 10

20. KAMP SVEČANO ZATVOREN!

7. srpnja 2010. svečano je zatvoren 20. kamp mladih informatičara. Svečanost zatvaranja započeo je g. Alen Spiegl, predsjednik HSIN-a pozdravivši prisutne riječima:

"Na žalost, došao je kraj i ovome Kampu za najbolje mlade informatičare Republike Hrvatske i došlo je vrijeme da svi polaznici dobiju Priznanja, a oni koji su se pokazali posebno dobri Pohvale HSIN-a. No prije nego što počnemo, možda ste čuli za našeg poznatog alpinistu Stipu Božića koji je osvojio sve najviše vrhove na svijetu, a koji je, između ostalog, rekao da njih na nove pothvate ne tjera dolazak na vrh nego penjanje sâmo, svladavanje prepreka.... i zato idu sve dalje i dalje. To je ideja i svih ovih Kampova. Kroz 20 Kampova održanih u Republici Hrvatskoj željeli smo posaditi sjeme koje će vama dati inicijalnu iskru da počnete raditi, da ta znanja koja dobijete ovdje poželite usavršiti i da želite biti sve bolji i bolji. To je cilj Kampa, a kad dođemo do kraja jedva čekamo slijedeći."

U nastavku je gosp. Spiegl ukratko predstavio prethodnih 19 Kampova u organizaciji HSIN-a.

Prisutnima se zatim obratio g. Sergio Samblić, ravnatelj OŠ F. K. Frankopana izrazivši nadu da

je škola bila dobar domaćin te da će sudionici iz Krka ponijeti nova znanja i iskustva, ali i nova prijateljstva i lijepa sjećanja na grad Krk i otok Krk. G. Samblić se nada da ovaj, sedmi Kamp u Krku nije i posljednji, te poziva HSIN da iduće godine, ili jednu od idućih ponovno Kamp informatičara bude organiziran u Krku.

Uslijedila je podjela Priznanja sudionicima Kampa 2010., a podijelili su ih profesori Boris Bolšec i Nikola Dmitrović. Pohvale najboljima dodijelili su voditelji radionica. Na kraju je g. Spiegl uručio Zahvalnice predavačima, organizatorima i pokroviteljima 20. kampa.

Uz ovaj vrijedni jubilej HSIN je izdao prigodnu publikaciju "20 ljetnih škola informatike HSIN-a, 1991.-2010." u kojoj je na pregledan i sažet način prikazan rad Kampova u proteklih 20 godina. Autorica je Vlasta Šeparović, a tehnički urednik Aron Bohr.

KAMP 2010. 11

Svečanost zatvaranja bila je prigoda i da se predstave članovi reprezentacije koji će zastupati Republiku Hrvatsku na međunarodnim informatičkim natjecanjima u 2010. godini, za koja su se vrijedno pripremali na ovome Kampu uz stručno vodstvo Luke Kalinovčića, dipl. ing. To su: Stjepan Glavina iz Preloga, Ivan Katanić iz Požege, te Ivica Kičić i Adrian Satja Kurdija iz Zagreba.

Čast da zatvori 20. kamp mladih informatičara Hrvatske pripala je g. Dariju Vasiliću, gradonačelniku Grada Krka:

"Dragi mladi informatičari iz cijele Hrvatske, dragi hrvatski olimpijci, poštovani voditelji radionica, poštovani predsjedniče Hrvatskog saveza informatičara, poštovani ravnatelju, Sve vas srdačno pozdravljam na kraju vrijednog 11-dnevnog rada kojeg ste proveli ovdje u Krku, u našoj školi OŠ Fran Krsto Frankopan. Siguran sam da ste u ovih jedanaest dana (iako spadate u najbolje mlade informatičare Hrvatske, jer inače ne bi dobili poziv Hrvatskog saveza informatičara), stekli nova znanja, otvorili neka nova informatička poglavlja, uočili neke nove mogućnosti, i naravno spremili se za još bolje nastupe na brojnim domaćim i međunarodnim natjecanjima. Hvala vam svima što ste bili ovih jedanaest dana u gradu Krku, čestitke svim pohvaljenim informatičarima, a naravno i svim vrijednim sudionicima 20. kampa mladih informatičara Hrvatske. Nije mi zadovoljstvo jer je došao kraj, ali svejedno to moram učiniti: Proglašavam ovaj 20. kamp zatvorenim!"

KAMP 2010. 12

POPIS POLAZNIKA PO RADIONICAMA

LOGO početni – Alenka Žužić, prof.

R. br. Ime, prezime, škola i mjesto Razred

1. Fran Vasilić, OŠ F. K. Frankopan, Krk 4.

2. Karlo Sintić, OŠ F. K. Frankopan, Krk 4.

3. Klara Justinić, OŠ F. K. Frankopan, Malinska 4.

4. Lucija Žužić, OŠ Fran Franković, Rijeka 4.

5. Marina Samblić, OŠ F. K. Frankopan, Krk 4.

6. Lovro Mršić, OŠ F. K. Frankopan, Krk 4.

7. Anamaria Fugošić, OŠ F. K. Frankopan, Krk 4.

8. Iris Radivoj, OŠ F. K. Frankopan, Krk 4.

LOGO za natjecatelje – Ivica Kičić

R. br. Ime, prezime, škola i mjesto Razred

1. Branimir Filipović, OŠ Trnsko, Zagreb 7.

2. Marija Gegić, OŠ Retkovec, Zagreb 6.

3. Dominik Ivanković, OŠ Blato, Blato 6.

4. Pavao Jerebić, OŠ Blato, Blato 7.

5. Vedran Kurdija, OŠ Mladost, Zagreb 5.

6. Mihael Liskij, OŠ P. Preradovića, Zagreb 7.

7. Ivan Lazarić, OŠ Centar, Pula 7.

8. Mihael Peklar, OŠ G. Krkleca, Zagreb 8.

9. Ivana Žužić, OŠ Fran Franković, Rijeka 7.

Izrada WEB stranica – Zrinka Gavran

R. br. Ime, prezime, škola i mjesto Razred

1. Ena Topić, OŠ F. K. Frankopan, Malinska 5.

2. Luka Topić, OŠ F. K. Frankopan, Malinska 4.

3. Filip Lipovac, OŠ F. K. Frankopan, Malinska 7.

4. Miroslav Bićanić, OŠ F. K. Frankopan, Malinska 5.

5. Filip Pržić, OŠ F. K. Frankopan, Malinska 5.

6. Karlo Kovačić, Udruga MIS, Strahoninec 5.

KAMP 2010. 13

BASIC – Alenka Žužić, prof.

R. br. Ime, prezime, škola i mjesto Razred

1. Fran Vasilić, OŠ F. K. Frankopan, Krk 4.

2. Karlo Sintić, OŠ F. K. Frankopan, Krk 4.

3. Klara Justinić, OŠ F. K. Frankopan, Malinska 4.

4. Lucija Žužić, OŠ Fran Franković, Rijeka 4.

5. Marina Samblić, OŠ F. K. Frankopan, Krk 4.

6. Lovro Mršić, OŠ F. K. Frankopan, Krk 4.

7. Ivan Žmirić, OŠ F. K. Frankopan, Krk 6.

8. Iris Radivoj, OŠ F. K. Frankopan, Krk 4.

9. Luka Topić, OŠ F. K. Frankopan, Malinska 4.

10. David Crkvenčić, OŠ F. K. Frankopan, Krk 5.

11. Josip Bajčić, OŠ F. K. Frankopan, Vrh 5.

12. Carlo Cola, OŠ F. K. Frankopan, Krk 7.

13. Sanja Bjelobradić, OŠ F. K. Frankopan, Krk 5.

14. Filip Pržić, OŠ F. K. Frankopan, Malinska 5.

15. Niko Peričić, OŠ F. K. Frankopan, Vrh 5.

16. Silvija Kosić, OŠ F. K. Frankopan, Vrh 5.

17. Ena Topić, OŠ F. K. Frankopan, Malinska 5.

18. Dominik Sintić, OŠ F. K. Frankopan, Krk 5.

19. Nikola Vladić, OŠ F. K. Frankopan, Vrbnik 6.

VISUAL BASIC – Marijan Jurešić, dipl. ing. / Gordan Nekić

R. br. Ime, prezime, škola i mjesto Razred

1. Dominik Sintić, OŠ F. K. Frankopan, Krk 5.

2. Ivan Žmirić, OŠ F. K. Frankopan, Krk 6.

3. Carlo Cola, OŠ F. K. Frankopan, Krk 7.

4. Sanja Bjelobradić, OŠ F. K. Frankopan, Krk 5.

5. Tonko Sabolčec, OŠ I. G. Kovačić, Sv. Juraj na Bregu 7.

6. Karlo Kovačić, Udruga MIS, Strahoninec 5.

7. Marija Vančina, OŠ F. K. Frankopan, Krk 7.

8. Lovro Mršić, OŠ F. K. Frankopan, Krk 4.

KAMP 2010. 14

C početni – Zrinka Gavran

R. br. Ime, prezime, škola i mjesto Razred

1. Nikola Pintarić, OŠ I. G. Kovačić, Sv. Juraj na Bregu 6.

2. Dino Ilić, OŠ "Dr. A. Mohorovičić", Matulji 8.

3. Albert Sparožić, SŠ Hrv. kralj Zvonimir, Krk 2.

4. Pavao Jerebić, OŠ Blato, Blato 7.

5. Dominik Ivanković, OŠ Blato, Blato 6.

6. Kristijan Vulinović, OŠ Kraljevica, Kraljevica 8.

7. Matteo Kinkela, OŠ R. K. Jeretov, Opatija 8.

8. Iva Žužić, OŠ F. K. Frankopan, Malinska 8.

9. Ivana Žužić, OŠ Fran Franković, Rijeka 7.

10. Iva Kovačević, OŠ F. K. Frankopan, Malinska 7.

Python – Nikola Dmitrović, prof.

R. br. Ime, prezime, škola i mjesto Razred

1. Tomislav Gudlek, V. gimnazija, Zagreb 4.

2. Ivan Lazarić, OŠ Centar, Pula 7.

3. Marija Vančina, OŠ F. K. Frankopan, Krk 7.

4. Iva Kovačević, OŠ F. K. Frankopan, Malinska 7.

5. Ivana Žužić, OŠ Fran Franković, Rijeka 7.

6. Matej Ferenčević, IV. osnovna škola, Bjelovar 8.

7. Matej Gradiček, I. osnovna škola, Vrbovec 8.

8. Filip Keri, I. osnovna škola, Vrbovec 8.

9. Mihael Peklar, OŠ G. Krkleca, Zagreb 8.

10. Dino Rakipović, Srednja škola Valpovo, Valpovo 2.

11. Sergej Jakovljev, XV. gimnazija, Zagreb 1.

12. Neven Miculinić, Gim. A. Mogorovičića, Rijeka 1.

KAMP 2010. 15

FLASH – Siniša Topić, prof.

R. br. Ime, prezime, škola i mjesto Razred

1. Kristijan Vulinović, OŠ Kraljevica, Kraljevica 8.

2. Fran Vasilić, OŠ F. K. Frankopan, Krk 4.

3. Marina Samblić, OŠ F. K. Frankopan, Krk 4.

4. Karlo Kovačić, Udruga MIS, Strahoninec 5.

5. Karlo Sintić, OŠ F. K. Frankopan, Krk 4.

6. Iris Radivoj, OŠ F. K. Frankopan, Krk 4.

7. Carlo Cola, OŠ F. K. Frankopan, Krk 7.

8. Josip Bajčić, OŠ F. K. Frankopan, Vrh 5.

9. Silvija Kosić, OŠ F. K. Frankopan, Vrh 5.

10. Niko Peričić, OŠ F. K. Frankopan, Vrh 5.

11. Antonio Brusić, OŠ F. K. Frankopan, Vrh 7.

12. Luka Brozić, OŠ F. K. Frankopan, Vrh 7.

13. Nikola Vladić, OŠ F. K. Frankopan, Vrbnik 6.

14. Domagoj Grdinić, OŠ F. K. Frankopan, Dobrinj 7.

15. Miroslav Bičanić, OŠ F. K. Frankopan, Malinska 5.

16. Filip Lipovac, OŠ F. K. Frankopan, Malinska 7

17. Sanja Bjelobradić, OŠ F. K. Frankopan, Krk 5.

18. Ivan Žmirić, OŠ F. K. Frankopan, Krk 6.

19. Dominik Sintić, OŠ F. K. Frankopan, Krk 5.

20. Anamaria Fugošić, OŠ F. K. Frankopan, Krk 4.

21. Ivan Lazarić, OŠ Centar, Pula 7.

22. Ivana Žužić, OŠ Fran Franković, Rijeka 7.

PHP – Gordan Nekić

R. br. Ime, prezime, škola i mjesto Razred

1. Dino Ilić, OŠ "Dr. A. Mohorovičić", Matulji 8. 2. Matteo Kinkela, OŠ R. K. Jeretov, Opatija 8. 3. Marija Vančina, OŠ F. K. Frankopan, Krk 7. 4. Emil Srbljanin, OŠ Poreč, Poreč 8.

5. Tonko Sabolčec, OŠ I. G. Kovačić, Sv. Juraj na Bregu 7.

6. Sergej Jakovljev, XV. gimnazija, Zagreb 1.

7. Albert Sparožić, SŠ Hrv. kralj Zvonimir, Krk 2.

8. Pavao Jerebić, OŠ Blato, Blato 7.

9. Dominik Ivanković, OŠ Blato, Blato 6.

KAMP 2010. 16

ALGORITMI za osnovne škole – Zrinka Gavran / Nikola Dmitrović, prof.

R. br. Ime, prezime, škola i mjesto Razred

1. Vedran Kurdija, OŠ Mladost, Zagreb 5.

2. Branimir Filipović, OŠ Trnsko, Zagreb 7.

3. Ivan Kožar, Informatički klub NET, Ivanić Grad 6.

4. Mihael Liskij, OŠ P. Preradovića, Zagreb 7.

5. Nikola Pintarić, OŠ I. G. Kovačić, Sv. Juraj na Bregu 6.

6. Mihael Pribanić, Informatički klub GuK, Križ 6.

7. Tonko Sabolčec, OŠ I. G. Kovačić, Sv. Juraj na Bregu 7.

8. Marija Gegić, OŠ Retkovec, Zagreb 6.

9. Karlo Kovačić, Udruga MIS, Strahoninec 5.

10. Kristijan Vulinović, OŠ Kraljevica, Kraljevica 8.

11. Matteo Kinkela, OŠ R. K. Jeretov, Opatija 8.

12. Ivan Lazarić, OŠ Centar, Pula 7.

13. Vedran Mihal, OŠ Dragutina Tadijanovića, Sl. Brod 7.

14. Marija Vančina, OŠ F. K. Frankopan, Krk 7.

15. Iva Žužić, OŠ F. K. Frankopan, Malinska 8.

16. Ivana Žužić, OŠ Fran Franković, Rijeka 7.

ALGORITMI početni – Ivan Katanić / Tomislav Gudlek

R. br. Ime, prezime, škola i mjesto Razred

1. Matej Ferenčević, IV. osnovna škola, Bjelovar 8.

2. Dominik Gleich, OŠ P. Miškine, Zagreb 8.

3. Matej Gradiček, I. osnovna škola, Vrbovec 8.

4. Filip Keri, I. osnovna škola, Vrbovec 8.

5. Mislav Balunović, OŠ D. Tadijanovića, Sl. Brod 8.

6. Mihael Peklar, OŠ G. Krkleca, Zagreb 8.

7. Dino Rakipović, Srednja škola Valpovo, Valpovo 2.

8. Sergej Jakovljev, XV. gimnazija, Zagreb 1.

9. Zvonimir Medić, XV. gimnazija, Zagreb 1.

10. Neven Miculinić, Gim. A. Mogorovičića, Rijeka 1.

11. Edi Topić, Gim. A. Mogorovičića, Rijeka 2.

KAMP 2010. 17

ALGORITMI napredni – Adrian Satja Kurdija / Stjepan Glavina

R. br. Ime, prezime, škola i mjesto Razred

1. Luka Hrabar, Gim. L. Vranjanina, Zagreb 3.

2. Tomislav Gudlek, V. gimnazija, Zagreb 4.

3. Gustav Matula, XV. gimnazija, Zagreb 3.

4. Zvonimir Medić, XV. gimnazija, Zagreb 1.

5. Neven Miculinić, Gim. A. Mogorovičića, Rijeka 1.

6. Matija Milišić, XV. gimnazija, Zagreb 2.

7. Antun Razum, XV. gimnazija, Zagreb 2.

8. Dino Rakipović, Srednja škola Valpovo, Valpovo 2.

9. Marin Tomić, V. gimnazija, Zagreb 1.

10. Tomislav Tunković, Gim. L. Vranjanina, Zagreb 2.

11. Dominik Gleich, OŠ P. Miškine, Zagreb 8.

12. Mislav Balunović, OŠ D. Tadijanovića, Sl. Brod 8.

13. Mihael Peklar, OŠ G. Krkleca, Zagreb 8.

14. Ivan Kovačević, Gim. A. Mogorovičića, Rijeka 3.

LINUX – Tomislav Gudlek

R. br. Ime, prezime, škola i mjesto Razred

1. Goran Flegar, I. gimnazija Varaždin, Varaždin 3.

2. Neven Miculinić, Gim. A. Mogorovičića, Rijeka 1.

3. Mislav Balunović, OŠ D. Tadijanovića, Sl. Brod 8.

4. Mihael Peklar, OŠ G. Krkleca, Zagreb 8.

5. Ivan Lazarić, OŠ Centar, Pula 7.

6. Emil Srbljanin, OŠ Poreč, Poreč 8.

Olimpijci – Luka Kalinovčić, ing.

R. br. Ime, prezime, škola i mjesto Razred

1. Stjepan Glavina, Srednja škola Prelog, Prelog 4.

2. Ivan Katanić, Gimnazija Požega, Požega 3.

3. Ivica Kičić, V. gimnazija, Zagreb 3.

4. Adrian Satja Kurdija, V. gimnazija, Zagreb 4.

5. Fran Jurišić, gimnazija, Zagreb 4.

KAMP 2010. 18

KAMP 2010. 19

R  A  D  I  O  N  I  C  E 

KAMP 2010. 20

OSNOVNA ŠKOLA FRAN KRSTO FRANKOPAN 

Osnovna škola u Gradu Krku djeluje kao posebno područno razredno odjeljenje u sklopu OŠ "Fran Krsto Frankopan" Krk, najveće otočne škole u Primorsko-goranskoj županiji. Ona obuhvaća još šest osmogodišnjih i jednu četverogodišnju školu u mjestima: Omišalj, Malinska-Dubašnica, Vrh, Punat,

Dobrinj, Vrbnik i Baška, sa zajedničkom upravom smještenom u krčkoj školi koja je ujedno i matična škola svim ostalima. Osnovna škola "Fran Krsto Frankopan" u Gradu Krku nalazi se na sjeveroistočnom

rubu staroga grada omeđenog srednjovjekovnim gradskim bedemom.

RADIONICE

KAMP 2010. 21

LOGO početni

Predavač: Alenka Žužić Polaznici: 1. Fran Vasilić 2. Karlo Sintić 3. Klara Justinić 4. Lucija Žužić 5. Marina Samblić 6. Lovro Mršić 7. Anamaria Fugošić 8. Iris Radivoj Pohvaljeni: Klara Justinić i Lovro Mršić

Na ovogodišnjem Kampu mladih informatičara, radionica LOGO početni okupila je najmlađe polaznike, njih ukupno osam (četvrtaša) je u LOGO radionici odlučilo napraviti svoje prve korake u programiranju.

Svi su se već prije susreli s LOGO kornjačom, tako da su u Kamp stigli s određenim predznanjem. Poznavali su osnovne naredbe za kretanje kornjače, te naredbu REPEAT.

Na početku našeg rada krenuli smo u editor i naučili pisati prve procedure.

Kako je ova mala grupa bila jako motivirana za rad, puno se toga naučilo u desetak dana. Polaznici su naučili koristiti nepoznanice, višestruke petlje, naredbu MAKE, puno novih naredbi, a i ponešto matematike (kutovi, koje polaznici nisu poznavali).

Naredba MAKE! Oblik naredbe MAKE: MAKE "var1 vrijednost

Naredbu MAKE koristimo kada želimo u nekoj nepoznanici ili varijabli sačuvati određenu vrijednost. Mogli bi to usporediti s ladicom u koju privremeno spremamo dragocjenu vrijednost. Primjeri: MAKE "a 1 --> neka a postane 1 a=1 MAKE "b "informatika --> neka b postane "informatika b = "informatika

Što je najvažnije, naučili su pristupati rješavanju složenijih zadataka, analizirati zadatak, raščlaniti ga, i na kraju, testirati svoje rješenje.

Alenka Žužić, prof.

RADIONICE

KAMP 2010. 22

LOGO za natjecatelje

Predavač: Ivica Kičić Polaznici: 1. Branimir Filipović 2. Marija Gegić 3. Dominik Ivanković 4. Pavao Jerebić 5. Vedran Kurdija 6. Mihael Liskij 7. Ivan Lazarić 8. Mihael Peklar 9. Ivana Žužić Pohvaljeni: Marija Gegić i Ivan Lazarić

Radionica LOGO natjecateljski se bavila pripremom učenika za natjecanja. Budući da je razina znanja polaznika bila vrlo raznolika, radionica se većinom bavila samo rješavanjem raznih zadataka. Polaznici su dobivali zadatke raznih težina za vježbu, koje su zatim rješavali sa ili bez pomoći voditelja. Uz to su objašnjena i potrebna gradiva te su pokazane neke metode koje olakšavaju i ubrzavaju rješavanje samih zadataka.

Pokazan je pristup rješavanju koji organizira kôd u više manjih pomoćnih funkcija, uz cilj da se smanji opterećenost kôda, odnosno poveća preglednost. Za to su objašnjene neke naredbe iz LOGO-vog skupa naredbi zvanog Template based iteration. Prvenstveno se misli na naredbe i funkcije poput foreach, filter i transfer.

Osim metoda vezanih uz liste, pokazane su i neki pristupi vezanih uz crtanje. Jedan spomenuti pristup crtanju, koji se veže uz zadatke u kojima nije jednostavno odrediti veličinu crteža, temelji se na tome da se crtež nacrta u proizvoljnoj veličini, očitaju se dobivene veličine, nakon čega se program prilagodi relativnom odnosu početne veličine i dobivene te pomoću njih izračuna novu početnu veličinu, iz čega se dobije crtež točne veličine. Primjeri zadataka sa radionice: Zadatak SORTIRAJ: Zadana je lista :L koja se sastoji od brojeva i podlisti. Te podliste se također sastoje od brojeva i podlisti itd. Potrebno je napisati funkciju SORTIRAJ :L koja sortira sve brojeve unutar liste :L tako da se struktura liste :L ne mijenja. Primjer: show sortiraj [5 3 7 [1 7 [4 6] 3] 2 [3]] -> [1 2 3 [3 3 [4 5] 6] 7 [7]] Rješenje: Jedno moguće rješenje ovog zadatka radi tako da prvo stvorimo listu :S koja se sastoji od svih brojeva unutar liste :L. Listu :S sortiramo i zatim stvaramo novu listu :L s istom strukturom, ali koristeći sortirane brojeve iz liste :S.

RADIONICE

KAMP 2010. 23

to sortiraj :l make "s qsort rek :l op generiraj :l end to rek :l if numberp :l [op :l] op transfer [] [se ?out rek ?in] :l end to qsort :l if emptyp :l [op []] localmake "pivot first :l op (se qsort filter [? < :pivot] :l filter [? = :pivot] :l qsort filter [? > :pivot] :l) end to generiraj :l if numberp :l [localmake "t first :s make "s bf :s op :t] op transfer [] [lput generiraj ?in ?out] :l end

Zadatak KIŠA: Mali Mirko živi u jednostavnom dvodimenzionalnom prostoru. Teren njegovog svijeta se može opisati nizom stupaca određenih visina. Jednog dana je počela padati obilna kiša te je popunila sve udubine u terenu. Napiši proceduru KISA :L :A koja crta rubove terena određenog listom :L te označava konačnu razinu vode. Broj :A predstavlja širinu stupca. Primjer: cs kisa [20 50 30 60 70 20 10 40 70 40] 20 Rješenje: Razina vode će rasti slijeva nadesno, pa će u jednom trenutku početi padati. Potrebno je pronaći tu granicu, koja je baš uz najveći broj u listi. Ukoliko ima više najvećih elemenata, uzmemo bilo koji. Donji kod uzima najlijeviji maksimum. Nakon što znamo granicu, potrebno je izračunati visine vode u rastućem dijelu, od početka do granice, te padajući dio, unatrag od kraja prema granici. Nakon što imamo listu razina vode, lagano nacrtamo crtež.

to kisa :l :a localmake "naj 0 localmake "pos 0 foreach :l [ if ? > :naj [make "naj ? make "pos #] ]

RADIONICE

KAMP 2010. 24

localmake "left [] localmake "right [] localmake "tren 0 for [i 1 :pos 1] [ if :tren < item :i :l [make "tren item :i :l] make "left lput :tren :left ] make "tren 0 for [i [count :l] [:pos+1] -1] [ if :tren < item :i :l [make "tren item :i :l] make "right fput :tren :right ] localmake "l2 se :left :right foreach :l [ fd ? rt 90 fd :a rt 90 fd ? rt 90 fd :a rt 90 pu fd item # :l2 rt 90 pd fd :a pu rt 90 fd item # :l2 rt 180 pd ] end

Zadatak TEREN: Napiši proceduru TEREN :L :A koja prima listu listi brojeva, gdje će svaka podlista od :L imati jednak broj elemenata. Zadani brojevi u podlistama predstavljaju visine pojedinih 1m×1m polja terena. Potrebno je prikazati teren pomoću kockica veličine :A u perspektivi prikazanoj na skici. Primjer: TEREN [[2 1 2] [1 1 1] [3 1 1]] 30 skica jedne kocke

RADIONICE

KAMP 2010. 25

Rješenje: Jedno rješenje ovog zadatka je to da crtamo kocku po kocku od najdalje prema najbližoj, odnosno od zadnjeg reda prema prednjem, slijeva nadesno, tako da pobrišemo svaki put praznine unutar stranica kocaka. Takav redoslijed crtanja osigurava da će crtanje biti točno obavljeno. Brisanje stranice možemo napraviti tako da nacrtamo okvir stranice sivom bojom, popunimo unutrašnjost naredbom FILL, prvo u crnu bolju, pa bijelu te na kraju natrag prebojimo okvir u crno. Drugo rješenje, za koji je i dan kod, se također temelji na spomenutom redoslijedu crtanja, no crtanje nećemo izvršavati odmah, nego tek na kraju, kada ćemo znati koje su sve crte vidljive. Naime, jedna se kocka može smjestiti u mrežu veličine 3×3, kao što je zadano u zadatku. Prema tome, cijeli se crtež može smjestiti u mrežu određene veličine, gdje će nam za svako polje mreže biti potrebno pamtiti crta li se lijeva crta, donja crta i kosa crta unutar tog polja. Te tri crte će nam biti dovoljne da prikažemo cijeli crtež. Postojeće crte bismo mogli pamtiti na razne načine, npr. da za svaki od tip crte (lijeva, donja, kosa) pamtimo listu aktivnih pozicija. Donji kod koristi drugu metodu, radi tako da pamti crte u tri matrice, odnosno listama riječi, gdje je crtanje određene linije određeno odgovarajućim slovom u matrici, tj. slovo će biti D ako se ta linija crta, u suprotnom N. Rasporedit ćemo to rješenje u više dijelova. Prvo moramo saznati veličinu mreže, što dobijemo iz veličina zadanih listi, i iz visina stupaca. Nakon toga stvorimo tri matrice popunjene slovima N, koje označavaju da se još ništa ne treba crtati. Nakon toga slijedi crtanje kocaka u matricu, po spomenutom redoslijedu te na kraju slijedi crtanje svih potrebnih linija na ekran. Crtanje kocke se izvodi tako da promatramo sva polja na koje ta kocka utječe i mijenjamo po potrebi vrijednosti triju matrica. Budući da tih polja ima ukupno 13, korisno je napraviti pomoćnu proceduru kojoj pošaljemo koordinate polja i željenu vrijednost za svaku od triju crta. Te vrijednosti mogu biti "D za da, "N za ne ili samo " ukoliko ne želimo mijenjati tu crtu. Budući da moramo mijenjati tri matrice, korisno je napraviti funkciju koja obavlja promjenu zadanog elementa matrice.

to teren :l :a localmake "r count :l localmake "c count first :l localmake "n 0 ; broj redova mreze localmake "m :r+:c*2+1 ; broj stupaca mreze ; racunanje broja redova mreze for [i 1 :r 1] [ for [j 1 :c 1] [ localmake "t :r-:i+1+(item :j item :i :l)*2+1 if :t > :n [make "n :t] ] ] ; stvaranje triju matrica make "lijeva [] localmake "t " repeat :m [make "t word :t "N] repeat :n [make "lijeva lput :t :lijeva] make "donja :lijeva make "kosa :lijeva

RADIONICE

KAMP 2010. 26

; crtanje u odredjenom redoslijedu for [i 1 :r 1] [ for [j 1 :c 1] [ for [k 1 [item :j item :i :l] 1] [ crtaj :r-:i+1+:j*2-2 :r-:i+1+:k*2-2 ] ] ] ; konacno crtanje localmake "b :a*sqrt 2 for [i 1 :n 1] [ for [j 1 :m 1] [ if (item :j item :i :lijeva)="D [fd :a pu bk :a pd] if (item :j item :i :donja )="D [rt 90 fd :a pu bk :a pd lt 90] if (item :j item :i :kosa )="D [rt 45 fd :b pu bk :b pd lt 45] pu rt 90 fd :a lt 90 pd ] pu rt 90 bk :a*:m lt 90 fd :a pd ] end to crtaj :x :y ; procedura koja crta kocku u mrezu na poziciju :x :y linije :x+0 :y+0 "D "D "N linije :x+1 :y+0 "N "D "N linije :x+2 :y+0 "D " "D linije :x+0 :y+1 "D "N "N linije :x+1 :y+1 "N "N "N linije :x+2 :y+1 "D "N "N linije :x+3 :y+1 "D " " linije :x+0 :y+2 " "D "D linije :x+1 :y+2 "N "D "N linije :x+2 :y+2 "N "N "D linije :x+3 :y+2 "D " " linije :x+1 :y+3 " "D " linije :x+2 :y+3 " "D " end to linije :x :y :l :g :k ; pomocna procedura koja provodi promjene za odredjeno polje if not emptyp :l [make "lijeva postavi :lijeva :x :y :l] if not emptyp :g [make "donja postavi :donja :x :y :g] if not emptyp :k [make "kosa postavi :kosa :x :y :k] end to postavi :mat :x :y :v ; pomocna funkcija koja mijenja odredjeni element matrice localmake "red " foreach item :y :mat [make "red word :red ifelse #=:x [:v] [?]] op transfer [] [lput ifelse #=:y [:red] [?in] ?out] :mat end

RADIONICE

KAMP 2010. 27

Dodatni primjeri: cs teren [[3 4 5 4 4] [4 3 1 1 4] cs teren [[5 4 3 2] [4 3 2 1] [4 3 1 1 3] [4 2 1 1 3] [3 2 1 1 3]] 25 [3 2 1 1] [2 1 1 1]] 25

cs kisa [30 50 80 100 60 40 60 80 150 30 50 20 120 50 30 70] 25

Ivica Kičić

RADIONICE

KAMP 2010. 28

BASIC

Predavač: Alenka Žužić, prof. Polaznici: 1. Fran Vasilić 2. Karlo Sintić 3. Klara Justinić 4. Lucija Žužić 5. Marina Samblić 6. Lovro Mršić 7. Ivan Žmirić 8. Iris Radivoj 9. Luka Topić 10. David Crkvenčić 11. Josip Bajčić 12. Carlo Cola 13. Sanja Bjelobradić 14. Filip Pržić 15. Niko Peričić 16. Silvija Kosić 17. Ena Topić 18. Dominik Sintić 19. Nikola Vladić Pohvaljeni: Sanja Bjelobradić, Ena Topić, Carlo Cola i Lucija Žužić

Radionica BASIC bila je prilično brojna, imala je ukupno 19 polaznika različitih uzrasta. Bilo je tu četvrtaša kojima je ova radionica bila prvi susret, ne samo sa programskim jezikom BASIC, već i sa programiranjem, kao i onih malo starijih koji su već programirali u BASICU, a neki od njih sudjelovali i na natjecanjima.

Zbog toga je rad u ovoj radionici bio zanimljiv, trebalo je uskladiti te dvije grupe i meni kao predavaču zaista ni minutu nije bilo dosadno.

Mlađi dio grupe krenuo je sasvim od početka, od prvog ulaska u editor, pisanja i pokretanja malih jednostavnih programa. Upoznali smo se varijablama, naučili osnovne naredbe, upoznali neke funkcije (MOD, CINT, INT, FIX), stringove, grananje u programu (jednostavna i složena naredba IF), logičke operatore. Većina je polaznika uspjela pratiti brzi ritam učenja u Kampu tako da smo se pred kraj uspjeli uhvatiti u koštac i sa složenijim programima.

Oni malo iskusniji naučili su neke nove naredbe, upoznali rad sa nizovima i datotekama. Kako je ova grupa rješavala složenije zadatke, naglasak je bio na algoritamskom rješavanju zadataka, analizi uvjeta i rješenja.

Alenka Žužić

RADIONICE

KAMP 2010. 29

C početni

Predavač: Zrinka Gavran Polaznici: 1. Nikola Pintarić 2. Dino Ilić 3. Albert Sparožić 4. Pavao Jerebić 5. Dominik Ivanković 6. Kristijan Vulinović 7. Matteo Kinkela 8. Iva Žužić 9. Ivana Žužić 10. Iva Kovačević Pohvaljeni: Nikola Pintarić i Ivana Žužić

Polaznici ove radionice imali su različito predznanje – neki su se natjecali samo u Logu dok su drugi već godinama radili u Basicu ili Pascalu. Zbog toga su najčešće oni koji su već znali Pascal ili Basic prije shvaćali neke stvari i tražili teže zadatke. Bilo je i onih polaznika koji su došli iz Osnovne škole Fran Krsto Frankopan s manjim predznanjem iz programiranja.

Cilj ove radionice bio je naučiti polaznike osnovama programiranja u programskom jeziku C++ kako bi kasnije, sami doma mogli nastaviti kôdirati u njemu.

Nakon pokazivanja osnovnih stvari sintakse počeli smo rješavati laganije zadatke. Odmah na početku su se počeli izdvajati oni koji bolje znaju pa sam njima davala dodatne zadatke.

Kroz radionicu su polaznici učili i sintaksu programskog jezika C++, ali i to da se zadaci mogu riješiti na drugačije načine, bolje načine. Primjer zadatka na kojemu su to mogli točno vidjeti je:

Napišite program koji učitava prirodan broj n i ispisuje sve parne prirodne brojeve manje ili jednake od n.

Prvo rješenje:

#include <cstdio> using namespace std; int n; int main(){ scanf(“%d”, &n); for (int i = 1; i <= n; ++i) if (i % 2 == 0) printf(“%d\n”, i); return 0; }

RADIONICE

KAMP 2010. 30

Drugo rješenje: #include <cstdio> using namespace std; int n; int main(){ scanf(“%d”, &n); for (int i = 2; i <=n; i += 2) printf(“%d\n”, i); return 0; } Treće rješenje: #include <cstdio> using namespace std; int n; int main(){ scanf(“%d”, &n); for (int i = 1; 2 * i <= n; ++i) printf(“%d\n”, 2*i); return 0; }

Razlika između prvog i drugog rješenja je u tome što je drugo rješenje duplo brže od prvoga – for petlja čini duplo manje koraka. Što se brzine tiče, između drugog i trećeg rješenja nema razlike, ali radili smo treće rješenje kako bi polaznici vidjeli da se zadatak može riješiti na različite načine, ovisno o tome što im se u tom trenutku čini kao bolja opcija.

Jedna od najčešćih grešaka polaznika koju je trebalo debuggirati bila je već standardni problem sa znakom „=“ kod polaznika koji su radili u Pascalu. Osim toga, polaznici bi često zaboravljali kada treba staviti „;“ na kraj i uporno su pisali „begin“ i „end“.

RADIONICE

KAMP 2010. 31

Prva tri-četiri dana bila su potrebna polaznicima da se naviknu na sintaksu C++-a – kada što treba

napisati i na koji način, a kasnije su se već više mogli koncentrirati na rješavanja zadataka kroz koje su to onda i provježbali.

Peti dan radionice polaznici su učili nizove. Za one koji su ih već znali novost je bila da nizovi u C++-u počinju s indeksom 0 umjesto 1, a za one kojima je niz bio potpuno novi pojam najveći problem je bio shvatiti razliku između indeksa polja u nizu i vrijednosti polja u nizu. Razlika se najbolje može vidjeti kroz sljedeća dva zadatka:

Zadatak 1: Napiši program koji učitava prirodan broj n, nakon njega niz od n prirodnih brojeva i ispisuje zbroj svih brojeva na parnim mjestima niza. Rješenje 1: #include <cstdio> using namespace std; int n, zbroj; int niz[1000]; int main(){ scanf(„%d“, &n); for (int i = 0; i < n; ++i) scanf(„%d“, &niz[i]); zbroj = 0; for (int i = 0; i < n; ++i) if (i % 2 == 1) zbroj = zbroj + niz[i]; printf(„%d\n“, zbroj); return 0; } Zadatak 2: Napiši program koji učitava prirodan broj n, nakon njega niz od n prirodnih brojeva i ispisuje zbroj svih parnih brojeva niza. Rješenje 2: #include <cstdio> using namespace std; int n, zbroj; int main(){ scanf(“%d”, &n); for (int i = 0; i < n; ++i) scanf(“%d”, &niz[i]); zbroj = 0; for (int i = 0; i < n; ++i) if (niz[i] % 2 == 0) zbroj = zbroj + niz[i]; printf(“%d\n”, zbroj); return 0; }

RADIONICE

KAMP 2010. 32

Većina polaznika je uz drugi zadatak na početku ponudila prvo rješenje. Nakon što sam im objasnila razliku i jednom kad su je shvatili više nisu imali problema s time.

Nakon nizova slijedili su dvodimenzionalni nizovi i zadaci s njima. Jedan od tipičnih zadataka bio je napisati program koji ispisuje koliko jabuka se može pokupiti ako se na početku nalazimo u polju (0, 0), smijemo se kretati desno ili dolje i trebamo završiti na polju (n, n) – program je trebao ispisati koliko smo maksimalno jabuka mogli pokupiti na putu.

Na kraju radionice sam uputila polaznike na zadatke s bivših školskih, županijskih i državnih natjecanja kako bi što bolje utvrdili znanje stečeno na radionici.

Najbolji polaznici za svoje zalaganje i izniman trud, dobili su pohvalu.

Zrinka Gavran

RADIONICE

KAMP 2010. 33

PYTHON

Predavač: Nikola Dmitrović, prof. Polaznici: 1. Tomislav Gudlek 2. Ivan Lazarić 3. Marija Vančina 4. Iva Kovačević 5. Ivana Žužić 6. Matej Ferenčević 7. Matej Gradiček 8. Filip Keri 9. Mihael Peklar 10. Dino Rakipović 11. Sergej Jakovljev 12. Neven Miculinić Pohvaljeni: Matej Ferenčević i Sergej Jakovljev

Po prvi put se na jubilarnom 20. Kampu mladih informatičara organizirala i radionica iz programskog jezika Python. Python je trenutno jedan od 10 najpopularnijih programskih jezika. Koriste ga programeri u velikim tvrtkama (Google) kao i studenti na fakultetima (npr. MIT i FER). Python je besplatan programski jezik, s Open Source licencom, podržan na različitim operacijskim sustavima.

Python je interpreter, odlikuje ga jednostavna sintaksa te podržava različite stilove programiranja, od strukturnog do objektno-orijentiranog. Zbog svojih osobina, Python se pokazao kao jezik koji može zamijeniti Basic i Pascal u učenju osnova programiranja. Prednost Pythonu daje "open source" licenca, te besplatno korištenje i preuzimanje programskog paketa i dodatnih modula kao i mogućnost rada na različitim platformama (Linux, Windows, Unix...). Ovaj jezik je svojim karakteristikama privukao polaznike radionice koji su iskazali želju za njegovim daljnjim proučavanjem. Slušali su ga osnovnoškolci kojima je prvenstveno bila i namijenjena radionica, a pridružila im se i nekolicina srednjoškolaca. Treba napomenuti da polaznici radionice nisu imali prethodnih iskustava s ovim programskim jezikom. Teme koje su obrađivane na radionici:

• Uvodna prezentacija, osnovne karakteristike jezika, njegova prošlost i budućnost, instalacija podrške za pisanje programa u Pythonu;

• Python-kao interpreter i programibilni kalkulator; • Pojam varijable, standardni tipovi podataka, aritmetički i logički operatori; • Pojam stringa u Pythonu; • If, for, while, break, continue u Pythonu; • Složeni tipovi podataka: lista (lists), N-torka (tuple), rječnik (dictionary); • Kreiranje vlastitih funkcija u Pythonu; • Rješavanje zadataka s natjecanja u Pythonu; • Osnove izrade GUI aplikacija.

RADIONICE

KAMP 2010. 34

Tijekom radionice, polaznik Matej Ferenčević je proučavao osnove izrade GUI aplikacija u Pythonu. Posljednji sat radionice je prezentirao svoj projekt i osnovne ideje rada. Evo što je on rekao o tome:

„Na radionici PYTHON koja se održavala na KAMP-u 2010. sam predavao o istom jeziku kao zamjeni za Microsoft Visual Studio u izradi Desktop aplikacija. Pokazao sam kako PYTHON može imati jednako lijepo korisničko sučelje kao i Visual Studio, samo sa malo više truda i kôda. Za izradu korisničkog sučelja sam koristio besplatni alat wxGlade, te za samo pokretanje aplikacije je bilo potrebno dodatno instalirati wxPython. Na radionici sam demonstrirao jednostavnu aplikaciju za igranje Asocijacija koja je koristila bazu napravljenu u SQLite-u. Aplikacija se sastojala od oko 1000 linija kôda, ali je prednost što radi na svim operativnim sustavima. Aplikacija može pregledavati Asocijacije iz baze, uređivati ih, brisati i dodavati.

Sučelje aplikacije "Asocijacija"

Prednosti Pythona nad Visual Studiom: besplatan je, programi rade na svim operativnim sustavima (čak i na mobilnim operativnim sustavima), jezik je jako jednostavan i lagan za naučiti te sve aplikacije su Open Source.“

RADIONICE

KAMP 2010. 35

Posljednjeg dana radionice, polaznici su iznijeli svoja razmišljanja o programskom jeziku koji su

prvi put susreli. Izdvojimo samo neka od njih:

Prednosti: „radi na svim OS-ovima i mobilnim platformama, ima jednostavnu sintaksu i razne mogućnosti za izradu aplikacija, jednostavan je, relativno brz, interpretiran, potiče objektno i uredno programiranje, ima uključene u sebe bignumove, zakon je“. Nedostatci: „nema scanf-a tako da je input složen, nema slobode u programiranju jer se kôd mora pisati uredno, previše opuštena sintaksa, nekako se čini prejednostavan, nedostatak pointera“.

Na kraju, polaznici su tijekom radionice ulagali dodatne napore da pretraživanjem interneta i metodom pogreški i pokušaja zajedno otkrivaju dodatne mogućnosti koje pruža Python. U tim pokušajima, najviše su se isticali polaznici Matej Ferenčević i Sergej Jakovljev koji su za svoje napore i pohvaljeni na radionici. Izvodi iz buduće skripte o programskom jeziku Python: Varijable u Pythonu Za razliku od ostalih programskih jezika, varijable u Pythonu se ne moraju deklarirati kako bi rezervirale memorijski prostor za sebe. Deklaracija se automatski dogodi u trenutku kada se varijabli pridruži vrijednost. Prilikom svake slijedeće promjene vrijednosti, varijabla rezervira novu lokaciju, što joj omogućava slobodu u radu s vrijednostima različitog tipa. Npr:

>>>a=100 >>>b=25 >>>a-b 75 >>>b=3.14 >>>b 3.14

Uočimo da se vrijednost razlike odmah ispisala na izlaz zbog svojstva Pythona da je interpreter. Python dozvoljava i višestruka pridruživanja. Na primjer:

>>>a=b=c=1 >>>a 1

ili, na primjer: >>>a,b,c=1,2,'KRK' >>>b 2

Direktna posljedica ove mogućnosti je vrlo elegantna metoda za zamjenu vrijednosti dviju varijabli: >>>(a,b)=10,20 >>>(a,b)=(b,a)

RADIONICE

KAMP 2010. 36

Naredba odlučivanja If naredba u Pythonu je slična istoj u drugim programskim jezicima. Opći oblik je:

if uvjet: naredba_za_istinu else: naredba_za_laž

Python ne poznaje grupiranje naredbi ključnim riječima begin-end ili zagradama {} već to postiže pišući naredbe jednu ispod druge pravilno ih uvlačeći. Petlje ponavljanja For petlja u Pythonu ima puno više slobode od slične strukture u ostalim programskim jezicima. Opći oblik je:

for kon_var in niz_vrijednosti: naredba_koja_se_ponavlja

Na primjer: for slovo in 'krk': print 'Trenutno slovo je: ', slovo

Ispis za navedeni kod je: Trenutno slovo je: k Trenutno slovo je: r Trenutno slovo je: k

While petlja omogućuje ponavljanje jedne ili više naredbi sve dok je ispunjen zadani uvjet. Opći oblik petlje je:

while uvjet: naredba_koja_se_ponavlja;

Na primjer: n=input('Unesi broj veći od 1:') n1=0 n2=1 print n1 while (n2<n): print n2 n2=n1+n2 n1=n2-n1

Ovaj programski odsječak ispisuje Fibbonaccijeve brojeve manje od unesenog broja n. Složeni tipovi podataka Lista je najsvestraniji složeni tip podataka u Pythonu. Lista sadrži komponente odvojene zarezom zatvorene unutar uglatih zagrada ( [] ). Komponente u listi mogu biti različitog tipa. Komponentama unutar liste možemo direktno pristupati (prvi element je na nultoj poziciji). Na primjer:

>>>lista=['abcd',123,3.14] >>>lista[2] 3.14

U listu možemo dodavati komponente te konkatenirati (slijepiti) liste. Izdvojimo jednu zanimljivost: >>>3*lista ['abcd',123,3.14,'abcd',123,3.14,'abcd',123,3.14]

N-torka je tip podatka sličan listi, samo što se za zapis koriste obične zagrade. Osnovna razlika između ovih dvaju tipova je ta da je N-torka nepromjenljivi tip podatka, tj. nije moguće direktno pristupati komponentama, mijenjati ih ili dodavati nove. Rječnik je tip podataka sličan listi s tom karakteristikom da koristi „ključ“ za indeksiranje vrijednosti. Ključ ne mora samo biti numerički tip već bilo koji nepromjenljivi tip podatka kao što je string ili N-torka. Općenito, rječnik je neuređeni skup komponenti oblika „ključ:vrijednost“. Ključ u rječniku mora biti jedinstven, tj. jedan ključ može biti povezan sa samo jednom vrijednošću. Na primjer, definirajmo jedan rječnik:

>>>rjecnik={'prvi':15,'drugi':30,'treci':20} >>>rjecnik['drugi'] 30

Nikola Dmitrović

RADIONICE

KAMP 2010. 37

VISUAL BASIC

Predavači: Marijan Jurešić, dipl. ing. i Gordan Nekić Polaznici: 1. Dominik Sintić 2. Ivan Žmirić 3. Carlo Cola 4. Sanja Bjelobradić 5. Tonko Sabolčec 6. Karlo Kovačić 7. Marija Vančina 8. Lovro Mršić Pohvaljeni: Tonko Sabolčec i Karlo Kovačić

Radionicu Visual Basic pohađali su učenici različitih uzrasta i predznanja. Imajući na umu da je većini polaznika to bio prvi susret s Visual Basic-om, u nekoliko dana obrađene su sve osnovne pojedinosti kao što su izrada formi, postavke itd. Obrađene teme:

• Izrada Windows forms aplikacije • Postavke formi i kontrola • Sintaksa koda • Button kontrola • CheckBox kontrola • ListBox kontrola • Label kontrola • TextBox kontrola • Progressbar kontrola • Globalne varijable • Funkcije i sub-ovi • Moduli

Realizacija radionice:

Radionica je započela uvodom u “Visual Basic 2010 Express” uz objašnjenje osnovnih naredba. Sljedeći dan započeli smo sa samostalnim projektom tako da je svaki polaznik radio svoju vlastitu aplikaciju. Treći dan objasnili smo osnovne kontrole kao što su button, textbox, checkbox, itd.

Sljedeći dan započeli smo s izradom vlastitog projekta "križić-kružić". Prilikom izrade upoznavali smo se sa sučeljem Visual Basic-a i još nekim „naprednijim“ kontrolama.

Na kraju su polaznici dobili zadatke kako bi se provjerilo njihovo znanje po završetku radionice.

Svi su polaznici upoznati s osnovama rada te vjerujem da će mnogi od njih nastaviti s radom aplikacija u Visual Basicu-u.

Gordan Nekić

RADIONICE

KAMP 2010. 38

FLASH

Predavač: Siniša Topić, prof. Polaznici: 1. Kristijan Vulinović 2. Fran Vasilić 3. Marina Samblić 4. Karlo Kovačić 5. Karlo Sintić 6. Iris Radivoj 7. Carlo Cola 8. Josip Bajčić 9. Silvija Kosić 10. Niko Peričić 11. Antonio Brusić

12. Luka Brozić 13. Nikola Vladić 14. Domagoj Grdinić 15. Miroslav Bičanić 16. Filip Lipovac 17. Sanja Bjelobradić 18. Ivan Žmirić 19. Dominik Sintić 20. Anamaria Fugošić 21. Ivan Lazarić 22. Ivana Žužić

Pohvaljeni: Kristijan Vulinović, Antonio Brusić, Luka Brozić, Sanja Bjelobradić i Ivana Žužić

Flash je profesionalni alat za izradu animacija, desktop i web aplikacija. Pruža velike mogućnosti manipulacije multimedijom pa je kao takav idealan za ispoljavanje i izražavanje kreativnosti kroz izradu različitih projekata: igri, web sučelja, multimedijalnih CD/DVD-a, kioska i slično. Obzirom da je vrijeme realizacije ove radionice prekratko za prikaz svega onog što Flash nudi, cilj radionice je ovladati osnovama rada s Flash-om te upoznati i neke naprednije radnje kao što je uporaba actionscript programiranja u pisanju različitih kontrola.

Radionicu Flasha su pohađali učenici različitog uzrasta i predznanja. Neki su radionicu pohađali prvi put pa smo na početku obradili osnovne standardne teme. Iskustvo u radu s Flashom i predznanje u programiranju nije bilo bitno. Polaznici su se upoznali s brojnim mogućnostima Flash-a, a na kraju radionice zadan im je mali projektni zadatak kojeg su većinom s uspjehom riješili. Obrađene standardne teme:

• sučelje programa Flash • opće postavke radnog filma • rad s layerima, simbolima, instancama, scenama • osnove izrade animacija • importiranje slika, videa i zvuka • actionscript 2.0 – osnove • objava filma – generiranje i testiranje filma • zajednički projektni zadatak – izrada korisničke aplikacije

RADIONICE

KAMP 2010. 39

Dodatne obrađene teme:

• izrada slide-show-a i actionscript kontrola za isti • umetanje video playera • izmjena video sadržaja pomoću actionscripta • umetanje eksternog teksta pomoću actionscripta • izrada kviza • povezivanje odgovarajućeg sadržaja

Tijek radionice:

Za razliku od prethodnih radionica na kojima su tema bile igre, ovdje su polaznici trebali izraditi multimedijalnu aplikaciju naziva: „Razglednice s Krka“. Radi se o prezentaciji-aplikaciji koja na zanimljiv način treba predstaviti ljepote grada Krka, a sve to kroz slike, video, tekst i popratni kviz. Materijali potrebni za realizaciju prikupljeni su neposredno prije početka radionice slikajući i snimajući znamenitosti Krka. Projekt je strukturno podijeljen na tri dijela: uvodni (najava), glavni (prezentacija) i završni (odjava ili kraj). Kao i u prethodnim radionicama polaznici su uvezli (importirali) sve potrebne elemente (slike, tekst, video, zvuk), izradili pomoćnu grafiku u Flashu crtanjem, osmislili sučelje aplikacije, kreirali animacije, kvizove, napisali actionscript kôd za kontrolu svega navedenog, te sve objedinili u jednu cjelinu. Učenici su bili zadovoljni radionicom i onim što su naučili o Flash-u. Primjer actionscript kôda napisanog u radionici: //kreiramo kontejner za slike i učitavam sliku te određujem //poziciju i veličinu this.createEmptyMovieClip("fotke", 100); this.fotke.loadMovie("Slike/slika1.jpg"); _level0.sadrzaj.fotke._x=0; _level0.sadrzaj.fotke._y=0; _level0.sadrzaj.fotke._width=362; _level0.sadrzaj.fotke._height=255; // //

RADIONICE

KAMP 2010. 40

// kreiramo video kontejner i niz-video listu u koji upisujem video putanje // var videos:Object = new Object(); videos.list = new Array(); videos.list[0] = "Video/video1.flv"; videos.list[1] = "Video/video2.flv"; videos.list[2] = "Video/video3.flv"; videos.list[3] = "Video/video4.flv"; videos.list[4] = ""; videos.list[5] = ""; videos.list[6] = ""; // povezujemo video sa komponentom na sceni var mojvideo = this.ekran; // postavljamo prvi video u kontejner (video player) mojvideo.contentPath = videos.list[1]; //dinamička promjena video sadržaja u kontejneru kad se klikne na gumb //brv je varijabla – brojač trenutnog videa koji se pregledava gumb.onRelease = function() { brv+=1; mojvideo.contentPath = videos.list[brv]; } Prikaz aplikacije na monitoru:

Siniša Topić

RADIONICE

KAMP 2010. 41

Izrada WEB stranica

Predavač: Zrinka Gavran Polaznici: 1. Ena Topić 2. Luka Topić 3. Filip Lipovac 4. Miroslav Bićanić 5. Filip Pržić 6. Karlo Kovačić Pohvaljeni: Ena Topić i Miroslav Bićanić

Ova radionica je originalno bila zamišljena kao internet početni, ali odmah prvi dan se ispostavilo da se svi polaznici koriste internetom svaki dan i da im to neće biti potrebno, a izrazili su želju da nauče kako se izrađuju web stranice.

Glavna ideja radionice bila je naučiti ih osnovne stvari oko izrade web stranice s ciljem da na kraju radionice imamo web stranicu o Osnovnoj školi Fran Krsto Frankopan u kojoj se održavao ovogodišnji kamp.

Većina sudionika je na početku mislila da je preteško napraviti cijelu WEB stranicu, da previše toga trebaju naučiti. Zato smo počeli s malim koracima.

Prvi dan radionice smo krenuli s općenitim uvodom u izradu web stranice – naučili smo gdje se piše kôd stranice i kako se pogleda što smo dobili s tim kôdom. Također smo učili osnovne pojmove u izradi web stranica kao što su html, head, body...

Drugi dan radionice smo učili razliku između različitih vrsta naslova – od h1 do h6. Na različitim tekstovima smo isprobavali kada treba staviti koji naslov – većina je uvijek htjela staviti naslov h1 bez obzira na važnost teksta pa je zadatak dana bio smisliti kako u isto vrijeme iskoristiti dva ili više naslova tako da veličina naslova odgovara i važnosti.

Treći dan radionice smo učili postavljanje linkova. Objasnila sam im razliku između onoga dijela linka koji se vidi na našoj web stranici i onoga s čime nas link povezuje. Zadatak svakog polaznika je bio da sam smisli kako će u svoju stranicu uklopiti pet linkova.

Najteže im je zapravo bilo odabrati koje će linkove ubaciti na stranicu jer je jedan od uvjeta bio da su najmanje četiri od pet linkova direktno povezani sa školom Fran Krsto Frankopan. Većina se snašla postavljajući linkove na neke povijesne tekstove o Franu Krsti Frankopanu ili o samom mjestu Krku.

Četvrti dan radionice je bio dan za formatiranje. Pokazala sam im neke osnovne tagove kojima se formatira i onda su sami mijenjali svoju stranicu ovisno o željama. U tom trenutku je većina stranica poprimila zbrkan izgled jer su ih formatirali na zabavan, dječji način – tako da svaka druga riječ bude podebljana, a svaka treća nakošena... Zato je zadnji zadatak toga dana bio formatirati stranicu na reprezentativan način što im, nakon toliko „igranja“ s formatiranjem nije bio nikakav problem.

RADIONICE

KAMP 2010. 42

Peti dan radionice je bio najšareniji dan – taj dan smo učili kako se mijenjaju boje, kako samog

teksta tako i pozadine. Svi polaznici su se složili da im je mijenjanje boja najdraža stvar kod izrade web stranica. Budući da su mijenjanje boja relativno brzo svladali ovaj dan su naučili i kako se tekst centrira ili pošalje na lijevu ili desnu stranu te kako mu promijeniti font. Kako je stranica bila na hrvatskom jeziku naučili su i da neke fontove ne mogu koristiti zbog hrvatskih specijalnih slova kao što su č, ć, š ili đ. Budući da je sada stranica svakog polaznika imala drugačiju boju i drugačiji font više nisu toliko nalikovale jedna drugoj i mogli su vidjeti da to što stranice imaju istu glavnu temu ne znači nužno da moraju biti jednake.

Šesti dan radionice bio je rezerviran za slike. Ovaj dan smo imali malo problema jer internet nije radio pa smo za početak na stranicu ubacili slike koje su se već nalazile na kompjuterima.

Sedmi dan radionice je internet proradio pa su polaznici naučili kako ubacivati slike i na drugi način – preko njihova linka. Svatko je dobio zadatak da uz tekst koji ima ubaci sliku škole Fran Krsto Frankopan. Nakon toga su gledali što se događa kada tekst i sliku jednako poravnaju, a što kada recimo tekst pošalju na lijevu stranu, a sliku na desnu.

Osmi dan radionice je bio za učenje izrade tablica u HTML-u. Zadatak je bio napraviti tablicu veličine 3×3 i u polja (1, 2), (2, 1), (2, 3) i (3, 2) staviti slike, a u ostala polja tekstove. Iako im je oduzeo puno vremena, većina polaznika je uspješno svladala ovaj zadatak. Nakon izvršenja zadatka je ostalo još vremena do kraja radionice pa smo na tablici mijenjali veličinu i tip ruba te pozadinsku boju.

Za kraj radionice sam im pokazala neke web stranice preko kojih mogu nastaviti proširivati svoje znanje iz izrade WEB stranica poput www.w3schools.com i kako se njima koristiti. Zatim smo imali kviz s ciljem izbora pohvaljenih učenika s pitanjima poput: "Kako možemo promijeniti naslov stranice?" ili "Kako podcrtavamo tekst?" Kroz kviz se pokazalo da su puno naučili i bilo je doista teško izabrati pohvaljene polaznike.

Mislim da je za sudionike ova radionica bila iznimno korisna jer su spajajući znanje dobiveno kroz pojedini dan radionice napravili svoju prvu WEB stranicu. Također, uvidjeli su da se malim koracima može ostvariti veliki projekt koji se na početku činio nemogućim.

Zrinka Gavran

RADIONICE

KAMP 2010. 43

PHP

Predavač: Gordan Nekić Polaznici: 1. Dino Ilić 2. Matteo Kinkela 3. Marija Vančina 4. Emil Srbljanin 5. Tonko Sabolčec 6. Sergej Jakovljev 7. Albert Sparožić 8. Pavao Jerebić 9. Dominik Ivanković Pohvaljeni: Matteo Kinkela i Marija Vančina

Radionicu “PHP” pohađali su učenici različitih uzrasta i predznanja. Imajući na umu da je većini polaznika to bio prvi susret s PHP jezikom, u nekoliko dana obrađene su sve osnovne pojedinosti PHP-a i neke napredne funkcije te spajanje PHP-a s MySQL bazom.

PHP (PHP: Hypertext Preprocessor) je skriptni jezik koji se koristi u dizajniranju jednostavnih WEB aplikacija i dinamičkih WEB stranica. PHP se ugrađuje u HTML kôd te se izvršava na serveru koji ima instaliran PHP procesorski modul. Obrađene teme:

• PHP otvaranje tagova u html-u i naredba echo • if-grananje • for petlja • while petlja • include funkcija • kôdiranje funkcija • mail funkcija • rand funkcija • mysql • spajanje php-a i mysql-a • Login funkcija koja je otporna na SQL injekcije • Register funkcija s automatskim generiranjem lozinke

Realizacija radionice:

Radionica je započela uvodom u “PHP” uz objašnjenje osnovnih naredba. Sljedeći dan započeli smo sa samostalnim projektom tako da je svaki polaznik radio svoju vlastitu stranicu. Treći dan objasnili smo osnove MySQL baze te spajanje PHP-a na MySQL bazu.

RADIONICE

KAMP 2010. 44

Primjer kôda:

//Spajanje na bazu $db_host="localhost"; $db_user="korisnik"; $db_pass="lozinka"; $db_name="Imebaze"; $db_id = mysql_connect($db_host, $db_user, $db_pass) or die("Ne mogu se spojiti na Bazu."); mysql_select_db($db_name, $db_id) or die("Baza nije pronađena."); // kraj koda

Sljedeći dan napravili smo registracijsku stranicu na kojoj su se korisnici mogli registrirati. Skripta bi korisnike automatski zapisala u bazu i poslala nasumičnu lozinku korisnika na e-mail.

Peti dan polaznici su sa lakoćom shvatili MySQL naredbe te su uz moju pomoć uspješno napravili

login funkciju koja je prijavljivala korisnike, obradili smo i temu kako se možemo zaštititi od SQL injekcija.

Šesti dan polaznici su preradili stranicu tako da su samo registrirani korisnici imali sve mogućnosti. Ostale dane radionice iskoristili smo tako da je svaki polaznik radio svoj PHP blog.

Na kraju su polaznici dobili zadatke kako bi se provjerilo njihovo znanje po završetku radionice. Svi su polaznici upoznati s osnovama rada te vjerujem da će mnogi od njih nastaviti s izradom stranica u PHP-u.

Gordan Nekić

RADIONICE

KAMP 2010. 45

ALGORITMI za OŠ

Predavači: Nikola Dmitrović, prof. i Zrinka Gavran Polaznici: 1. Vedran Kurdija 2. Branimir Filipović 3. Ivan Kožar 4. Mihael Liskij 5. Nikola Pintarić 6. Mihael Pribanić 7. Tonko Sabolčec 8. Marija Gegić 9. Karlo Kovačić 10. Kristijan Vulinović 11. Matteo Kinkela 12. Ivan Lazarić 13. Vedran Mihal 14. Marija Vančina 15. Iva Žužić 16. Ivana Žužić Pohvaljeni: Marija Gegić, Vedran Kurdija, Mihael Pribanić i Karlo Kovačić

Većina polaznika ove radionice su uspješni natjecatelji iz informatike u svojim kategorijama. Zbog toga su poučavani algoritmi kôdirani u svim programskim jezicima koji su zastupljeni na natjecanjima (Basic, Pascal i C++). Osnovna ideja radionice je bila razumjeti ideju algoritma koji se prezentira te tu ideju pravilno implementirati. Polaznici su imali slobodu u odabiru načina implementacije, a na kraju bi dobili „službenu“ verziju implementiranog algoritma. Teme koje su se poučavale na radionici su:

• Binary search – osnovna ideja i konkretne primjene; • Usporedba algoritama sortiranja – polaznici su ponovili ideju sortiranja razmjenom, ideju Bubble

sorta, Shell sorta i Quick sorta te su trebali napisati program koji uspoređuje vrijeme sortiranja pojedinog algoritma na nizovima određene duljine;

• Rekurzija – osnovne teoretske ideje, rekurzivne funkcije, rekurzivni Euklidov algoritam, Merge sort;

• Podijeli pa vladaj (Divide and Conquer) o Približan proračun drugog korijena broja n; o Binarno pretraživanje niza; o Množenje dvaju n-bitnih cijelih brojeva;

• Dinamičko programiranje o problem određivanja šanse za pobjedu u sportskom natjecanju; o problem naprtnjače (Knapsack) – rekurzivni načini rješavanja originalnih knapsack

problema • Teorija igara • Rad s jako velikim brojevima (dodatna tema za napredne polaznike)

RADIONICE

KAMP 2010. 46

Teorija igara:

Predavanje o teoriji igara, s praktičnim primjerima određivanja sigurnog pobjednika igre za dva igrača u kojoj oboje igraju optimalno (na temelju matematičke igre NIM) pomoću dinamike održao je Fran Jurišić, prva rezerva olimpijskog tima. On je zajedno s voditeljem radionice i polaznicima želio utvrditi da li se iz nekog stanja igre može pobijediti neovisno o protivnikovim potezima. To se provjerava tako da pokušamo naći barem jedno stanje u koje možemo doći našim potezom iz kojeg protivnik neće moći pobijediti bez obzira što odigrao. Ukoliko postoji takav potez, stanje u kojem smo trenutno možemo smatrati pobjedničkim stanjem. Zadatak 1.

Dva igrača igraju igru u kojoj je cilj naizmjence množeći broj koji je na početku 1, sa brojevima 2..9, biti prvi koji će ostvariti broj ≥ k ( 2 ≤ k ≤ 106 ).

Rješenje: Pokazali i riješili problem rekurzijom i bez nje. Zadatak 2.

Dva igrača naizmjence pomiču kuglicu po ploči dimenzija r, s ( 1 ≤ r, s ≤ 1000 ), iz gornjeg lijevog kuta s ciljem da budu onaj koji će je pomaknuti na donji desni kut. Dozvoljeni potezi su pomaknuti kuglicu desno, dolje, ili dolje-desno.

Rješenje: (rekurzivna funkcija)

int rek ( int x, int y ){ if ( mem [x][y] != 0 ) return mem [x][y]; if ( x == r - 1 && y == s - 1 ) return 1; if ( x != r - 1 ) { if ( rek ( x+1, y ) == -1 ){ mem [x][y] = 1; return 1;}} if ( y != s - 1 ) { if ( rek ( x, y+1 ) == -1 ){ mem [x][y] = 1; return 1;}} if ( x != r - 1 && y != s - 1 ){ if ( rek ( x+1,y+1 ) == -1 ){ mem [x][y] = 1; return 1;}} mem [x][y] = -1; return -1;}

Knapsack:

Kvalitetno pretraživanje interneta je jedna od važniji stvari koju natjecatelj treba poznavati. Zbog toga su polaznici radionice, pretražujući internet, trebali pronaći algoritam kojim će najbolje riješiti zadani problem: „Na koliko načina bankomat može izdati iznos od N kuna ako na raspolaganju ima novčanice od k1, k2, k3 i k4 kune i pri tome smije samo jednom iskoristiti jednu od njih?“ Usporedo smo promatrali i slučaj s beskonačnim brojem novčanica.

RADIONICE

KAMP 2010. 47

Polaznici radionice su pronašli da je riječ o Knapsack algoritmu, zajedno smo prošli kroz ideju algoritma, ali smo za rješavanje ovog problema ipak koristili individualne rekurzivne ideje. Problem određivanja šanse za pobjedu u sportskom natjecanju

Dva sportaša A i B nadmeću se u nekoj sportskoj igri koja je podijeljena u dijelove. U svakom dijelu igre točno jedan igrač dobiva 1 bod. Igra traje sve dok jedan od igrača ne skupi N bodova. Pretpostavimo da su igrači A i B podjednako jaki i da svaki od njih ima 50% šanse da u pojedinom dijelu igre dobije jedan bod. Trebamo pronaći P(i,j), vjerojatnost da će igrač A biti konačni pobjednik u situaciji kada A treba još i bodova do pobjede a B treba još j bodova. Lako se vidi da vrijedi relacija:

Prva dva reda su očigledna. U uvjetima trećeg reda igra se barem još jedan dio igre, u kojem A ima 50% šanse da dobije bod; ako A dobije bod tada je vjerojatnost njegove konačne pobjede P(i-1,j) inače je vjerojatnost P(i,j-1).

Prethodna relacija se jako lako rješava na rekurzivan način. Ali se uočava da se iste vrijednosti moraju računati i po nekoliko puta. Bolji način je ispunjavanje tablice jer se zna da se bilo koji od elemenata može dobiti kao aritmetička sredina elemenata ispod i elemenata udesno.

Odabrati pohvaljene sudionike radionice nije bilo lako jer je većina polaznika kvalitetno i s puno entuzijazma radila na zadanim algoritmima. Zato su se među pohvaljenim učenicima našli samo učenici petog i šestog razreda koji su svojim angažmanom zaslužili pohvalnicu.

Nikola Dmitrović

⎪⎪

⎪⎪

>>−+−

=>>=

=

0,0),1,(21),1(

21

0,0,00,0,1

),(

jizajiPjiP

jizajiza

jiP

RADIONICE

KAMP 2010. 48

ALGORITMI početni

Predavači: Ivan Katanić i Tomislav Gudlek Polaznici: 1. Matej Ferenčević 2. Dominik Gleich 3. Matej Gradiček 4. Filip Keri 5. Mislav Balunović 6. Mihael Peklar 7. Dino Rakipović 8. Sergej Jakovljev 9. Zvonimir Medić 10. Neven Miculinić 11. Edi Topić Pohvaljeni: Mihael Peklar i Dominik Gleich

Radionicu je pohađala nekolicina učenika koji su netom završili 8. razred te oni koji su završili 1. i 2. razred srednje škole – sve skupa, njih 11. Razina predznanja je varirala od učenika do učenika pa su odabrane teme predavane na taj način da bi ih svi mogli pratiti. Algoritmi/strukture obrađeni na radionici su:

• binarno pretraživanje (binary search) • ternarno pretraživanje (ternary search) • algoritmi za traženje najkraćeg puta u grafu

o Dijkstrin algoritam o Bellman-Fordov algoritam o Floyd-Warshallov algoritam

• monotoni red • dinamičko programiranje s množenjem matrica • LCA (lowest common ancestor) • konveksna ljuska

Binarno se pretraživanje koristi u slučajevima kad imamo problem u kojem je potrebno naći vrijednost za koju vrijedi neki zadani uvjet te za neku vrijednost možemo relativno brzo provjeriti zadovoljava li baš ona zadani uvjet. Polaznici su već prije upoznati s ovim algoritmom, ali je skrenuta pažnja na činjenicu da nije uvijek očito da se problem rješava pomoću binarnog pretraživanja.

Ternarno se pretraživanje pak koristi u slučajevima kad je potrebno naći minimum ili maksimum neke funkcije koja strogo pada pa strogo raste ili obratno. Ternarno pretraživanje u svakom koraku odbaci ili prvu ili treću trećinu intervala kojeg se pretražuje – ostavljajući nakon svakog koraka 2/3 intervala. Ovaj je algoritam primjer divide-and-conquer algoritama.

RADIONICE

KAMP 2010. 49

Obrađeni algoritmi za traženje najkraćeg puta u grafu rješavaju sljedeće probleme:

• Dijkstra – traženje najkraćeg puta od jednog do svih ostalih čvorova u grafu (single source shortest path problem) u složenosti O( E + V log V ), gdje je E broj bridova, a V broj čvorova u grafu (NAPOMENA: duljine bridova moraju biti ne-negativne)

• Bellman-Ford – rješava isti problem kao i Dijkstrin algoritam, samo što duljine bridova smiju biti negativne – u složenosti O( V E ), gdje je E broj bridova, a V broj čvorova u grafu. Također, pomoću Bellman-Forda je moguće utvrditi sadrži li graf cikluse negativnih duljina

• Floyd-Warshall – traženje najkraćeg puta između svih parova čvorova u grafu u složenosti O(V3), gdje je V broj vrhova u grafu

Monotoni red je struktura koja je u stanju odgovoriti u konstantnoj složenosti koji je najmanji odnosno najveći element u redu. Kao i normalan red, podržava operacije ubaci i izbaci (push i pop).

Ponekad je dinamičko rješenje zadatka poprilično jednostavno, no ograničenja su takva da dinamički pristup jednostavno nije dovoljno dobar. S obzirom da je dizanje matrice (kao i broja) na potenciju moguće odraditi u logaritamskoj složenosti, neka se dinamička rješenja mogu ubrzati. Algoritam je pokazan na primjeru zadatka "SuperClimber" kojeg je moguće naći na z-trening.com.

LCA – Lowest Common Ancestor – Najniži zajednički predak neka dva čvora u grafu se definira kao čvor najveće dubine koji je predak oba čvora. Na radionici su pokazana dva algoritma za rješavanje tog problema – prvi je jednostavniji i rješava zadani problem u složenosti O( N ) po upitu, drugi je nešto složeniji i rješava problem u složenosti O( log N ) po upitu uz predprocesiranje u složenosti O( N log N ).

Konveksna ljuska skupa točaka se definira kao konveksni poligon kojemu su vrhovi neke od tih točaka te se sve ostale točke nalaze ili na rubovima ili unutar njega. Na radionici je pokazan algoritam koji rješava zadani problem u složenosti O( N log N ).

Zadnjeg dana radionice održano je natjecanje na kojem su polaznici rješavali tri zadatka u trajanju od 2 sata. Dva zadatka su jednostavniji primjeri dinamičkog programiranja dok se treći rješava binarnim pretraživanjem i njegovo rješenje ćemo i opisati.

RADIONICE

KAMP 2010. 50

U zadatku su zadane cisterne koje su u obliku kvadra i nalaze se na nekoj visini u zraku, te im je donja stranica paralelna zemlji. Cisterne se mogu puniti vodom i to tako da je razina vode u svim cisternama ista (na istoj visini), osim ako je cisterna potpuno ispod te razine onda, naravno, ne mora zadovoljavati taj uvjet. Zadana nam je količina vode (V) koju ćemo utočiti u cisterne te se od nas traži da izračunamo koja će to visina (razina) vode u cisternama biti.

Ako pretpostavimo rješenje (R) lako možemo izračunati kolika je količina vode potrebna da se dostigne visina R, te ako je ta količina veća od V možemo sa sigurnošću reći da je naša tražena visina manja od R, u protivnom je veća ili jednaka. Koristeći tu opservaciju zadatak možemo riješiti binarnim pretraživanjem po R u složenosti O( lg maksimalna_visina ).

Ivan Katanić i Tomislav Gudlek

RADIONICE

KAMP 2010. 51

ALGORITMI napredni

Predavači: Adrian Satja Kurdija i Stjepan Glavina Polaznici: 1. Luka Hrabar 2. Tomislav Gudlek 3. Gustav Matula 4. Zvonimir Medić 5. Neven Miculinić 6. Matija Milišić 7. Antun Razum 8. Dino Rakipović 9. Marin Tomić 10. Tomislav Tunković 11. Dominik Gleich 12. Mislav Balunović 13. Mihael Peklar 14. Ivan Kovačević Pohvaljeni: Gustav Matula, Antun Razum i Mislav Balunović

Radionica naprednih algoritama, održana na 20. kampu mladih informatičara u Krku, bila je održana najboljima od onih koji se nisu plasirali u olimpijski tim. Obrađene su sljedeće teme:

• napredni algoritmi na stringovima • traženje najvećeg pravokutnika u histogramu • disjoint set struktura • logaritamska struktura • primjena DFS stabala • Tarjanov algoritam • AB prebrojavanje • formula uključivanja-isključivanja • binomni koeficijenti • rješavanje ciklusa u teoriji igara

Stringovi su tip podataka koji je svakodnevan, ne samo na informatičkim natjecanjima, nego i u cjelokupnom informatičkom okružju. Zato su algoritmi na stringovima od velike važnosti. Na ovom predavanju objašnjena je hash funkcija i njezine brojne primjene u optimizaciji pretraživanja stringova, a prikazana je i korisna struktura suffix array i njezina konstrukcija. Prezentirani su i algoritmi dinamičkog programiranja koji rješavaju probleme poput traženja najvećeg zajedničkog podniza dvaju stringova.

Najveći pravokutnik u histogramu klasičan je problem koji se rješava tehnikom održavanja stupaca na stack-u u rastućem poretku. Time za svaki stupac znamo njemu prvi manji s lijeva i s desna. Osim najvećeg pravokutnika, postoji još mnoštvo problema gdje je ova tehnika korisna.

RADIONICE

KAMP 2010. 52

Disjoint set struktura može efikasno stvarati bridove na grafu i reći u kojoj komponenti je neki čvor. Implementacijski je vrlo jednostavna te stoga vrlo pogodna za natjecanja. Glavna ideja koja ubrzava naivnu implementaciju je skraćivanje putova do korijena stabla, što osigurava složenost operacija od amortizirano O(log n).

Logaritamsku strukturu većina natjecatelja zna implementirati i koristiti, no princip na kojem radi nije toliko jednostavan. Objašnjen je način na koji se stablo strukture može nacrtati i prikazati rad funkcija update i query. U stablu su djeca nekog čvora svi brojevi koji se mogu dobiti ubacivanjem jedne jedinice desno od najdesnije (binarni zapis brojeva). Onda se query svodi na penjanje do korijena, dok je update kretanje gore-desno.

DFS stablo korišteno je kod rješavanja zadatka "policija" (Hrvatska informatička olimpijada 2007.). Najteži dio zadatka je pažljivo promatranje slučajeva i odnosa čvorova u DFS stablu, a to se radi analiziranjem podataka lowlink, discovery i finish time. Prije odgovaranja na upite, potrebno je izgraditi stablo i zapisati svakom čvoru niz djece u rastućem poretku po discovery time-u.

Tarjanov algoritam koristi se za prona-laženje strogo povezanih komponenti u usmje-renom grafu. Ako se svaka strogo povezana komponenta zamijeni novim čvorom, dobit ćemo usmjereni aciklični graf (tzv. DAG) koji nam onda omogućava primjenu raznih tehnika za rješavanje problema, poput dinamičkog programiranja.

AB prebrojavanje je metoda rješavanja zadataka u kojima se traži brojanje nečega promatrajući samo brojeve u intervalu [A,B]. Brojevi A i B se zapisuju kao nizovi znamenki te se onda na tome može raditi dinamičko programiranje. Rješavan je zadatak gdje treba prebrojati brojeve u intervalu [A,B] kojima su sve znamenke prosti brojevi. Budući da nula nije prosti broj, trebalo je pripaziti na neke posebne slučajeve.

Budući da se u raznim zadacima na naprednim razinama natjecanja pojavljuju potproblemi koji su usko povezani s područjem matematike koje se zove kombinatorika, u dva predavanja pozabavili smo se najčešćim temama koje se iz tog područja pojavljuju.

Prva od tih tema je formula uključivanja-isključivanja (skraćeno FUI), princip prebrojavanja elemenata unije više skupova, koji se temelji na tome da za svaki odabir nekih od ovih skupova izračunamo broj elemenata u presjeku odabranih skupova (što je najčešće lakše izračunati nego uniju) i taj broj zbrojimo ili oduzmemo od tražene unije, ovisno o tome je li broj odabranih skupova paran ili neparan.

Zadatak POLICIJA Kako  bi  omogućila  efikasnije  hvatanje  zločinaca  u  bijegu, policija  uvodi  novi  informatički  sustav.  Područje  na  kojem policija djeluje sastoji se od N gradova i E dvosmjernih cesta koje ih povezuju. Gradovi su označeni prirodnim brojevima 1 do N. Najčešća  situacija  s  kojom  se  policajci  susreću  je  da bjegunci  žele  brzo  doći  iz  jednog  grada  u  neki  drugi. Inspektori,  gledajući  kartu,  pokušavaju  procijeniti  gdje  je najbolje  napraviti  blokadu  i  uhvatiti  bjegunce.  Novi informatički sustav mora moći odgovoriti na sljedeća pitanja: 1. Za zadana dva grada A i B te cestu koja spaja gradove G1 i G2, mogu  li bjegunci doći od  grada A do grada B ako  je cesta blokirana (njome bjegunci ne mogu proći)? 

2. Za zadana tri grada A, B i C, mogu li bjegunci doći od grada A do grada B ako je cijeli grad C blokiran (u njega bjegunci ne mogu ući)? 

Napišite program koji implementira opisani sustav. ULAZNI PODACI: U prvom redu nalaze se dva prirodna broja N i E (2 ≤ N ≤ 100 000, 1 ≤ E ≤ 500 000), broj gradova i broj cesta. Svaki od  sljedećih  E  redova  sadrži po dva  različita prirodna broja  između  1  i N  –  oznake  gradova  koje  povezuje  jedna cesta. Između svakog para gradova će postojati najviše jedna cesta. U sljedećem redu nalazi se broj Q  (1 ≤ Q ≤ 300 000), broj pitanja na kojem se sustav ispituje. Svaki od sljedećih Q redova  sadrži po  četiri  ili pet prirodnih brojeva. Prvi od  tih brojeva označava tip pitanja – broj 1 ili 2. Ako je tip pitanja 1, tada se u istom redu nalaze još četiri prirodna broja A, B, G1 i G2  kako  je  opisano  u  tekstu  zadatka.  Brojevi  A  i  B  će  biti različiti. Brojevi G1 i G2 će predstavljati postojeću cestu. Ako je tip pitanja 2, tada se u istom redu nalaze još tri broja A, B i C. Brojevi A, B i C će biti međusobno različiti. Ulazni podaci će biti  takvi da  je u početnoj  cestovnoj mreži moguće doći od svakog grada do svakog drugog. IZLAZNI PODACI:  Ispišite odgovore na svih Q pitanja, svaki u jednom redu. Odgovor na pitanje može biti "da" ili "ne". Napomena: ukoliko program odgovori  točno na  sva pitanja jednog tipa, dobit će 50% bodova. I u tom slučaju potrebno je ispisati odgovore na svih Q pitanja (na sva pitanja drugog tipa možete odgovoriti proizvoljno). 

RADIONICE

KAMP 2010. 53

Najjednostavniji primjer principa FUI je zadatak u kojem se, ako je poznato da svaki učenik nekog razreda uči engleski, njemački ili oba jezika i ako je zadano da A učenika uči barem engleski, B učenika barem njemački i C učenika oba jezika, traži broj učenika u tom razredu. Najprije zbrajamo brojeve elemenata A i B, i zatim oduzimamo C jer smo te učenike u zbroju A+B brojali dvaput. Konačan rezultat je, dakle, A+B-C. Složeniji zadaci uključuju, naravno, mnogo više skupova i složenije situacije.

Druga od kombinatornih tema prezentiranih na predavanjima su binomni koeficijenti. Želimo li od N različitih predmeta odabrati neki skup od njih K, to možemo učiniti na (N povrh K) načina – taj broj naziva se binomnim koeficijentom. Prezentirani su razni načini izračunavanja binomnih koeficijenata – pomoću dinamičkog programiranja u složenosti O(N*K), pomoću formule u složenosti O(K), a i brže uz pomoć Lucasovog teorema. Korištenjem binomnih koeficijenata rješavaju se razni zadaci – primjerice, traženje broja putova od gornjeg lijevog do donjeg desnog polja na ploči po kojoj se dozvoljeno kretati samo dolje i desno.

Predavanje iz područja teorije igara bavilo se igrama u kojima postoje ciklusi. Naime, u teoriji igara često susrećemo igre čiji graf stanja i poteza ne čini aciklični graf i nije ga moguće riješiti standardnom metodom. Na radionici je objašnjena metoda za rješavanje tog problema.

Smatramo da je radionica bila vrlo uspješna i da će opisane ideje uroditi plodom i još uspješnijim rezultatima najboljih mladih informatičara Hrvatske sljedećih godina.

Stjepan Glavina Adrian Satja Kurdija

RADIONICE

KAMP 2010. 54

LINUX

Predavač: Tomislav Gudlek Polaznici: 1. Goran Flegar 2. Neven Miculinić 3. Mislav Balunović 4. Mihael Peklar 5. Ivan Lazarić 6. Emil Srbljanin Pohvaljeni učenik: Ivan Lazarić

Radionicu smo započeli instalacijom sustava. Kako polaznici nisu imali jednako predznanje, valjalo je krenuti od osnova kako bi svi mogli pratiti. Kao i prijašnjih godina, glavni cilj radionice je bio upoznati polaznike s onom stranom Linuxa koja im koristi na natjecanjima, točnije olimpijadama.

Nakon kratkog upoznavanja s OS-om, prešli smo na korištenje Konsole-a. Naredbe koje smo naučili su:

• touch ime_filea – stvara praznu datoteku zvanu „ime_filea“, bez navodnika • rm ime_filea – briše datoteku „ime_filea“ • mkdir ime_direktorija – stvara direktorij s imenom „ime_direktorija“ • rmdir ime_direktorija – briše prazan direktorij s imenom „ime_direktorija“ • mv ime1 ime2 – premještanje datoteke (ukoliko je premještanje unutar direktorija,

zapravo se radi o preimenovanju) • cp ime1 ime2 – kopiranje datoteke • ls – ispis sadržaja direktorija • grep / egrep – pretraživanje tekstualne datoteke pomoću regularnih izraza (o tome više

nešto kasnije) • sudo – izvršavanje naredbe kao root, potrebna je lozinka • man naredba – ispisuje pomoć o naredbi • time ./program – mjeri vrijeme izvršavanja programa

Također, pojasnili smo i značenja nekih od važnijih direktorija:

• / – osnovni direktorij u kojem se nalaze ostali • /boot – informacije potrebne za „podizanje“ sustava (npr. Kernel) • /etc – konfiguracijske datoteke sustava • /bin – najvažnijih programi u sustavu; oni koji su potrebni da bi sustav funkcionirao • /dev – datoteke odgovorne za funkcioniranje hardwarea • /usr – korisnikove aplikacije i druge popratne stvari • /home – privatni podaci korisnika • /root – „privatni podaci“ root korisnika (ne miješati s „/“ direktorijom) • /var – varijable koje se konstantno mijenjaju dok je sustav pokrenut

RADIONICE

KAMP 2010. 55

Naučili smo koristiti g++ (compiler za programski jezik C++) te počeli pisati laganije skripte. Na natjecanjima je često potrebno testirati svoje rješenje. Vrlo često možemo nakodirati rješenje koje radi točno, ali je presporo na većim test podacima. Uspoređivanjem ispisa bržeg (ali ne nužno točnog) i sporijeg (ali sigurno točnog) algoritma moguće je naći test primjer na kojem brži algoritam pada, odnosno ne ispisuje točno rješenje.

brzo.cpp – brže rješenje (ne nužno točno) bruteforce.cpp – sporije rješenje (uvijek točno), tzv. bruteforce gen.cpp – program koji generira nasumične test podatke

Skripta za testiranje bi u tom slučaju izgledala ovako:

rm o1 o2 touch o1 o2 g++ -o brzo brzo.cpp g++ -o bruteforce bruteforce.cpp g++ -o gen gen.cpp while diff o1 o2; do ./gen > ulaz ./brzo < ulaz > o1 ./bruteforce < ulaz > o2 done

Skriptu spremimo kao „skripta.sh“. Kako bismo ju mogli pokrenuti, moramo promijeniti ovlasti

nad datotekom. To radimo sljedećom naredbom: chmod +x skripta.sh

Sad kad smo saznali test primjer na kojem naše rješenje ne ispisuje točan rezultat, možda bi bilo

korisno skicirati test primjer (naravno, to nije uvijek moguće, pretpostavimo da se radi o problemu u ravnini) i pokušati vidjeti gdje griješimo. Obradili smo dva načina vizualizacije test podataka; prvi je PostScript – programski jezik prvenstveno namijenjen stolnom izdavaštvu (više svojstven Linuxu iako je uz poseban software dostupan i na Windowsima), a drugi je SVG – jezik temeljen na XML-u namijenjen prikazivanju dvodimenzionalne grafike (moguće ga je otvoriti u većini internet browsera osim u Internet Exploreru koji treba poseban plug-in). Oba programska jezika stvaraju vektorsku grafiku – zoomiranjem skica neće izgubiti kvalitetu. Primjer: a) PostScript – crtanje kvadrata i kruga

%!PS newpath 100 100 moveto 0 100 rlineto 100 0 rlineto 0 -100 rlineto closepath stroke newpath 400 400 100 0 360 arc closepath stroke showpage

RADIONICE

KAMP 2010. 56

b) SVG – crtanje kvadrata i kruga

<?xml version="1.0" standalone="no"?> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <rect x="150" y="200" width="300" height="100" stroke="black" stroke-width="2" fill="blue"/> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> </svg>

Dobivena vektorska slika

Nešto je više vremena posvećeno i regularnim izrazima. Radi se o stringovima koji opisuju ili sparuju skup stringova, u skladu s određenim sintaksnim pravilima. Regularne izraze koriste mnogi editori i pomoćni programi za pretragu i manipulaciju teksta ovisno o nekim uzorcima. Unutar Linuxa, naredba koja vrši pretragu teksutalne datoteke pomoću regularnih izraza je grep, odnosno egrep. Osnovni znakovi korišteni u regularnim izrazima: • . (točka) – zamjenjuje točno jedno pojavljivanje bilo kojeg znaka (npr. .ila opisuje stringove aila, bila,

cila itd...) • [] – uglate zagrade zamjenjuju točno jedno pojavljivanje nekog od znakova koje sadrže ( npr. [abc]

zamjenjuje a, b, ili c ). Ukoliko želimo postići suprotni efekt, odnosno zamijeniti pojavljivanja svih ostalih znakova osim a, b i c, dodat ćemo znak ^ na početak prije znakova navedenih u uglatim zagradama (npr. [^abc] zamjenjuje d, e, f, g, h itd.)

• ^ – predstavlja početak linije („^marko“ će odgovarati svim stringovima „marko“ koji se nalaze na početku linije)

• $ – predstavlja kraj linije • () – unutar oblih zagrada nalaze se grupirani znakovi (npr. (ku)(ca) ce odgovarati stringu „kuca“) • * (zvjezdica) – označava nula ili više ponavljanja elementa nakon kojeg se nalazi (npr. (ab)* će

odgovarati svim stringovima koji se sastoje od nula ili više ponavljanja stringa „ab“, dok će ab* stringovima koji nakon „a“ sadrže nula ili više ponavljanja znaka „b“

• + – označava jedno ili više ponavljanja elementa nakon kojeg se nalazi • {x, y} – označava između x i y ponavljanja elementa nakon kojeg se nalazi • ? – označava nula ili jedno pojavljivanje elementa nakon kojeg se nalazi • | – označava alternaciju (npr, gray|grey se može skratiti u gr(a|e)y i oba izraza će predstavljati

stringove „gray“ i „grey“)

Polaznici su uglavnom pokazali dobro snalaženje u elementima Linuxa obrađenim na radionici.

Tomislav Gudlek

RADIONICE

KAMP 2010. 57

OLIMPIJCI

Predavač: Luka Kalinovčić, ing. Polaznici: 1. Stjepan Glavina 2. Ivan Katanić 3. Ivica Kičić 4. Adrian Satja Kurdija 5. Fran Jurišić

Radionica priprema za hrvatski olimpijski tim 2010. godine održana je na Kampu mladih informatičara u Krku, kao i prethodnih godina. Voditelj ove radionice bio je Luka Kalinovčić, višestruki zlatni olimpijac i jedan od najboljih natjecatelja u povijesti IOI – međunarodnih informatičkih olimpijada. Osim za IOI, hrvatski olimpijski tim na ovoj radionici pripremao se i za nadolazeću srednjoeuropsku informatičku olimpijadu (CEOI). Uz njih je radionicu pohađao i Fran Jurišić kao prva rezerva olimpijskog tima.

Primarni način priprema na ovoj radionici bile su simulacije natjecanja. Voditelj bi pažljivo odabrao nekoliko zadataka olimpijskog tipa i olimpijske težine, najčešće tri ili četiri (jer se na CEOI-u u jednom danu natjecanja rješavaju tri, a na IOI-u četiri zadatka) te bi ih onda olimpijci u danom vremenu od nekoliko sati rješavali. Nakon rješavanja voditelj bi evaluirao (bodovao) sva poslana rješenja, a potom bi se razgovaralo o rješenjima zadataka – algoritmima koji se koriste na danim zadacima, važnim idejama, bitnim detaljima i raznim ostalim finesama te bi se iz danih zadataka na taj način mnogo naučilo.

Ako polaznik neke zadatke nije uspio riješiti za vrijeme simulacije, kasnije ih je, poučen o rješenju od voditelja radionice i od svojih kolega, bez problema riješio. Na taj smo način iz dana u dan pokazivali napredak: ideje, koje prije radionice nismo imali, smo usvojili i tako napredovali u rješavanju zadataka koje isprva nismo znali riješiti. Bitno je napomenuti da jedna ideja, jedan algoritam, ne rješavaju samo taj, konkretan zadatak na kojem smo ih naučili, već otvaraju vrata desecima drugih zadataka koji se rješavaju na sličan način, i zato je svaki od zadataka na kojem smo nešto naučili vrijedio kao barem deset zadataka. To, naravno, podrazumijeva dobar odabir zadataka, a za to se voditelj radionice izvrsno pobrinuo, navodeći se svojim bogatim natjecateljskim iskustvom.

Izvori rješavanih zadataka bila su razna respektabilna prijašnja natjecanja, od poznate i cijenjene američke olimpijade USACO (ne zaboravimo, Amerikanci su jedna od najjačih zemalja na međunarodnim olimpijadama, a njihovi spomenuti zadaci se nalaze na web stranici http://www.uwp.edu/sws/usaco/) pa do HSIN-ovih ništa manje kvalitetnih zadatka s bivših HIO-a, Izbornih priprema te VRSIH-a – studentskih natjecanja (sve to je, naravno, dostupno na www.hsin.hr).

Osim prijašnjih natjecanja, kao izvori zadataka često su korištene poznate internetske arhive zadataka kao što su:

• Spoj (www.spoj.pl), • UVa Online Judge (http://uva.onlinejudge.org/), • Timus Online Judge (http://acm.timus.ru/), • TopCoder (http://www.topcoder.com/tc), • CodeForces (http://www.codeforces.com/).

RADIONICE

KAMP 2010. 58

Budući da su, nakon ove radionice, slijedili sjajni uspjesi na srednjoeuropskoj informatičkoj olimpijadi (CEOI) i međunarodnoj informatičkoj olimpijadi (IOI), nije uopće dvojbeno da je radionica ispunila svoj cilj i na najbolji mogući način pripremila hrvatski olimpijski tim. Zato smo veoma zahvalni našem stručnom voditelju Luki Kalinovčiću, a posebno Hrvatskom savezu informatičara što je sve to omogućio i organizirao.

Donosimo primjere nekoliko zahtjevnih zadataka s prethodnih informatičkih natjecanja te detaljnim opisom algoritma. Zadatak Bugs Integrated, Inc., CEOI 2002

Zadana je pravokutna ploča veličine N×M gdje je svako polje ili crne ili bijele boje. Potrebno je napisati program koji određuje maksimalni broj pravokutnika veličine 2×3, odnosno 3×2 koji se može postaviti isključivo na bijela polja, tako da se nijedna dva pravokutnika ne sijeku. Ograničenja: N (broj redova) ≤ 10, M (broj stupaca) ≤ 150.

Opis algoritma:

Pristup koji ćemo koristiti u rješavanju ovog zadatka je dinamičko programiranje. Potrebno je, naime, primijetiti da su ograničenja specifična – broj stupaca je relativno velik, ali je zato broj redova malen (N ≤ 10). Takvo malo ograničenje na broj redova omogućuje dinamički pristup rješavanju.

Na početku ćemo polja numerirati brojevima od 0 do N*M-1, počevši od gornjeg lijevog kuta, brojivši prvo po redovima, a zatim po stupcima. Dinamika će se kretati po redu od polja 0 prema polju N*M-1. Označimo broj tog polja s k. Zatim, definirat ćemo poziciju figure (pravokutnika) kao poziciju njenog gornjeg desnog kuta. Da bismo znali je li moguće postaviti figuru na poziciju k, moramo znati boju i zauzetost ostalih dijelova ploče koje ta figura pokriva, za što će nam, osim same pozicije, biti potrebna i bitmaska zauzetosti. Ta bitmaska mora pokrivati sva polja koja su potrebna da bi se odredilo je li moguće postaviti te figure na polje k, ali i na sva sljedeća polja. Može se primijetiti da je dovoljno u bitmaski pamtiti zauzetost (boju) zadnjih 2N polja, odnosno za svaki red ćemo pamtiti boju dva susjedna polja, kao što je prikazano na slici 1.

Tako smo definirali stanje dinamike oblika [polje][bitmaska prethodnih 2N polja], koje nam daje traženi maksimalni broj figura koji se može postaviti do tog polja, tako da se dobiva ta određena bitmaska. Kako smo sada bitmaskama proširili stanje dinamike, unutar petlje za polja bit će nam potrebna još i petlja za iteriranje po svim mogućim maskama.

0 5 10 15 20 25 30 1 6 11 16 21 26 31

2 7 12 17 22 27 32 3 8 13 18 23 28 33 4 9 14 19 24 29 34

Slika 1) Prikaz dinamike za k=22. Tamno osjenčano polje označava trenutačno polje,

svijetlo osjenčano predstavlja zamišljenu figuru 2×3, dok podebljan rub prikazuje sadržaj bitmaske.

Potrebno je još odrediti odnose između stanja. U ovom slučaju dinamičkog programiranja bolje je razmišljati kako ćemo iz trenutačnog stanja utjecati na sljedeća stanja, umjesto uobičajenog razmišljanja da iz prethodnih stanja gradimo rezultat trenutačnog. Nakon što dođemo u neko određeno stanje [k][mask], postoje tri mogućnosti - preskočiti polje k, postaviti figuru 2×3, ili postaviti figuru 3×2.

RADIONICE

KAMP 2010. 59

Promotrimo npr. postavljanje figure 2×3 (2 reda, 3 stupca), kao što je prikazano na slici. Nakon

što je postavljena ta figura, možemo primijetiti da se na polje k+1 neće ništa moći postaviti, pa to polje možemo odmah preskočiti, odnosno, postavljanjem figure 2×3 mijenjamo stanje dinamike za polje k+2, a ne polje k+1. Slično se obrade i druga dva slučaja.

Korisno je formulirati bitmasku tako da se bitovi 2k i 2k+1 (brojeći od nule) odnose na k-ti red (brojeći od nule), jer se time olakšavaju operacije računanja novih maski prilikom postavljanja figura.

Ovo rješenje je vremenske i memorijske složenosti O( N*M*4^N ), što nije dovoljno efikasno. Optimizacija 1) Vremenska i memorijska složenost mogu se smanjiti na O( N*M*3^N ).

Kao što je gore objašnjeno, bitmaska pamti po dva polja za svaki red, tj. svaki red ima 4 stanja (BB, BC, CB, CC - B=bijelo, C=crno/zauzeto). Možemo primijetiti da su stanja redova BC i CC ekvivalentna, zato što u slučaju u kojem je desno polje crno, nije bitno je li lijevo bijelo ili crno, jer u oba slučaja više neće biti moguće postaviti ikoju figuru. Tako se stanje reda može definirati brojem 0, 1 ili 2 (BB, BC/CC, CB), odnosno bitmaska veličine 2n se može zamijeniti brojem u trinarnom sustavu (bazi 3) duljine n. Tako se broj kombinacija maske smanjuje s 4^N na 3^N.

Optimizacija 2) Broj aktivnih stanja u dinamici je 4*3^N. Budući da stanje [k][mask] pristupa samo stanjima [k+1][x], [k+2][x] te [k+3][x], u svakom je trenutku dovoljno pamtiti stanja samo za 4 polja. Ova je optimizacija potrebna da bi program zadovoljio memorijsko ograničenje. Radi lakše implementacije, korisno je, uz korištenje pokazivača simulirati matricu veličine N * M * 3^N, koja se preslikava na pomoćnu matricu veličine 4 * 3^N.

Optimizacija 3) Operacije s maskama se mogu unaprijed izračunati. Operacija poput 'daj k-tu znamenku broja mask' ima relativno malen broj mogućih ulaza (svega N*3^N), a vremenski je zahtjevna zbog dijeljenja i operacije modula, pa je nužno izračunati i zapamtiti unaprijed sve moguće vrijednosti te funkcije. Slično je ponekad potrebno učiti i sa sličnim čestim operacijama.

Optimizacija 4) Obilazak samo dostižnih stanja. Većina stanja nije moguća, pa je isplativo zaobići stanja do kojih se uopće ne može doći. Odnosno, za svako polje k pamtit ćemo niz maski koje su dostupne. Taj niz se lako održava uz korištenje STL vector-a i pomoćnih nizova.

Implementacija:

#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #define MAXM 154 #define MAXN 10 #define MAX_POT3 60000 using namespace std; int buffer[4][MAX_POT3]; // stanja dinamike int *dp[MAXM*MAXN]; // simulacija cijele matrice stanja vector < int > bufferv[4]; // dostupne maske vector < int > *v[MAXM*MAXN]; // simulacija int pot3[MAXN+4]; // potencije broja 3 bool white[MAXN][MAXM]; // matrica boja int n, m, b; int VER[MAX_POT3][MAXN]; // preprocess int GET[MAX_POT3][MAXN]; // preprocess inline int get( int mask, int k ) { return GET[mask][k]; // operacija 'daj k-tu znamenku broja mask' }

RADIONICE

KAMP 2010. 60

inline void UPDATE( int k, int mask, int &old, int value ) { if ( old == -1 ) v[k]->push_back( mask ); if ( value > old ) old = value; } int main(void) { pot3[0] = 1; for ( int i = 1; i <= MAXN+3; ++i ) pot3[i] = pot3[i-1] * 3; for ( int i = 0; i < MAXN; ++i ) for ( int j = 0; j < pot3[MAXN]; ++j ) { GET[j][i] = ( j / pot3[i] ) % 3; VER[j][i] = ( j / pot3[i+3]) * pot3[i+3] + j % pot3[i] + 2 * (1 + 3 + 9) * pot3[i]; } for ( int i = 0; i < MAXM*MAXN; ++i ) { dp[i] = buffer[ i&3 ]; v[i] = &bufferv[ i&3 ]; } scanf("%d%d%d", &n, &m, &b); memset( white, 1, sizeof( white ) ); for ( int i = 0; i < b; ++i ) { int x, y; scanf("%d%d", &x, &y); white[y-1][x-1] = 0; } /* pocetno stanje - sva stanja su nemoguca, osim stanja kada je k=0, a zadnjih 2n polja potpuno 'zauzeto' */ memset( buffer, -1, sizeof( buffer ) ); dp[0][ pot3[n] - 1 ] = 0; for ( int i = 0; i < 4; ++i ) v[i]->clear(); v[0]->push_back( pot3[n] - 1 ); for ( int k = 0; k < m * n; ++k ) { int i = k % n; int j = k / n; //for ( int mask = 0; mask < pot3[n]; ++mask ) for ( int I = 0; I < v[k]->size(); ++I ) { int mask = (*v[k])[I]; int nova; /* opcija 1) ne postavljanje figure */ nova = get( mask, i ) == 0 ? mask : mask - pot3[i]; UPDATE( k+1, nova, dp[k+1][nova], dp[k][mask] ); if ( i == n-1 || j == 0 ) continue; if ( !white[i][j] || !white[i][j-1] || !white[i+1][j] || !white[i+1][j-1] ) continue; /* opcija 2) postavljanje figure 2x3 */ if ( i <= n - 2 && j >= 2 && white[i][j-2] && white[i+1][j-2] && get( mask, i ) == 0 && get( mask, i+1 ) == 0 ) { nova = mask + pot3[i] * (1 + 3) * 2; UPDATE( k+2, nova, dp[k+2][nova], 1 + dp[k][mask] ); }

RADIONICE

KAMP 2010. 61

/* opcija 3) postavljanje figure 3x2 */ if ( i <= n - 3 && j >= 1 && white[i+2][j] && white[i+2][j-1] && get( mask, i ) <= 1 && get( mask, i+1 ) <= 1 && get( mask, i+2 ) <= 1 ) { nova = VER[mask][i]; UPDATE( k+3, nova, dp[k+3][nova], 1 + dp[k][mask] ); } } /* Buduci da odrzavamo dinamiku samo preko 4 polja, a ne njih N*M, potrebno je 'resetirati' niz tako da se ponovno moze iskoristiti za sljedece polje. Niz za sadasnji dp[k] je isti niz kao i za dp[k+3] u sljedecem koraku. */ memset( dp[k], -1, sizeof( buffer[0] ) ); v[k]->clear(); } int result = 0; for ( int i = 0; i < pot3[n]; ++i ) if ( dp[m*n][i] > result ) result = dp[m*n][i]; printf("%d\n", result); return 0; }

Zadatak ICERINK (http://www.spoj.pl/problems/ICERINK/) Zadatak se pojavio na 6. poljskoj olimpijadi, stage 2.

Zadana je ravnina koja predstavlja površinu leda za klizanje u kojoj sve zadane točke imaju koordinate u intervalu [0, 10000]. U ravnini se nalazi N≤2500 jednostavnih poligona stranica paralelnih sa koordinatnim osima koji se ne presijecaju niti ne dodiruju. Ukupan broj stranica svih poligona je manji ili jednak 10000. Zadana je točka u kojoj se klizač nalazi na početku i točka u kojoj se mora nalaziti na kraju. Jedno klizanje se sastoji od biranja jednog od četiri smjera (gore, dolje, lijevo, desno). Svako klizanje mora biti u smjeru okomitom na prethodno klizanje. Nakon odabira smjera, klizač se pomiče na ledu sve dok ne dotakne neku stranicu, tada on staje. Iznimka su stranice koje on dotiče u trenutku kada kreće klizanje. Potrebno je ispisati može li klizač doći do zadane krajnje točke i, ako može, koliki je najmanji broj klizanja da bi uspio.

RADIONICE

KAMP 2010. 62

Rješenje:

Može se naći skup točaka koje ćemo zvati važnima – to su one točke na kojima se klizač može zaustaviti, tj. one na kojima sva moguća klizanja počinju ili prestaju. Na početku u skup važnih točaka ubacimo početnu i krajnju točku te sve vrhove poligona. Zatim sa svake od tih točaka provjerimo gdje ćemo se zaustaviti ako otkližemo gore, dolje, lijevo ili desno. Nakon što se pobacaju i te točke u skup važnih točaka, on je potpun. Ukupan broj točaka u njemu neće prelaziti 5*(S+2), gdje je S ukupan broj stranica.

Na sličan način nađemo i veze među točkama. Veza A → B postoji ako se može otklizati iz točke A u točku B. Broj veza nije veći od V*4, gdje je V broj važnih točaka. Na takvom grafu je dovoljno upotrijebiti BFS algoritam da se izračuna najmanja udaljenost, tj. broj klizanja od početne do krajnje točke.

Bitne točke se mogu naći tzv. line sweep tehnikom. Ako zamislimo vertikalnu liniju koja se miče s lijeva na desno, možemo promatrati događaje. Događaj može biti:

1. bitna točka 2. horizontalna stranica 3. stranica kojoj je unutrašnjost poligona s desne strane 4. stranica kojoj je unutrašnjost poligona s lijeve strane

Kod 1. tipa događaja tražimo prvu stranicu s lijeva koja prekriva y koordinatu promatrane bitne

točke. To je stranica na kojoj će se klizač zaustaviti ako otkliže lijevo sa te bitne točke. Ovim postupkom za svaku ćemo točku odrediti gdje ćemo se zaustaviti nakon kretanja ulijevo. Još je potrebno napraviti analogno za ostale smjerove.

Veze među bitnim točkama se pronalaze na vrlo sličan način. Jedina razlika je što, nakon što pronađemo točku na kojoj ćemo se zaustaviti nakon klizanja, više ne stavljamo tu točku u skup bitnih točaka nego samo zapamtimo da postoji ta veza među točkama.

Ovo izgleda kao da će se velik blok kôda 8 puta pojaviti u kôdu jer jednom tražimo važne točke i treba 4 line sweepa (jedan za svaki smjer), a nakon toga radimo slično za pronalaženje veza. Zapravo se line sweep može iskodirati samo jednom u jednoj funkciji. Umjesto da ga radimo 4 puta za svaki smjer, može se implementirati samo za smjer ulijevo. Svi ostali smjerovi se riješe tako da se ravnina, tj. sve poznate točke prije toga zarotiraju za 90, 180 ili 270 stupnjeva. Npr. ako želimo napraviti line sweep za smjer prema gore, zarotiramo ravninu za 90 stupnjeva (ulijevo) i pravimo se da radimo za smjer prema lijevo. Točke/veze koje tako dobijemo samo na kraju vratimo natrag na stvarnu rotaciju.

Da bi line sweep bio efikasan, potrebna je još struktura podataka. Kad tražimo prvu lijevu točku u koju ćemo udariti kod klizanja, zapravo tražimo zadnju stranicu koja se pojavila kao događaj, a da prekriva y koordinatu promatrane točke. To se može napraviti pomoću tzv. tournament stabla s propagacijom. Pomoću njega možemo u O(log 10000) označiti interval koji prekriva neka stranica i u istoj složenosti naći stranicu koja prekriva neku y koordinatu. Ukupna složenost je O(N * log 10000). Slijedi implementacija koja koristi opisane ideje:

#include <cstdio> #include <cctype> #include <algorithm> #include <vector> #include <queue> using namespace std; typedef pair<int,int> par; #define x first #define y second

RADIONICE

KAMP 2010. 63

const int MAX = 10100; const int MAXM = 40100; const int off = 1<<14; int n, m; par poc, kraj; vector<par> P[MAX]; vector<par> vazne; int tree[2*off]; int dist[MAXM]; vector<int> E[MAXM]; struct event { int a, b, t, z; event( int _a, int _b, int _t, int _z ) { a = _a; b = _b; t = _t; z = _z; } }; bool operator < ( const event &A, const event &B ) { if( A.t != B.t ) return A.t < B.t; return A.z < B.z; } void postavi( int lo, int hi, int w, int a = 0, int b = off, int x = 1 ) { if( a >= hi || b <= lo ) return; if( a >= lo && b <= hi ) { tree[x] = w; return; } if( tree[x] != -1 ) { tree[2*x] = tree[2*x+1] = tree[x]; tree[x] = -1; } postavi( lo, hi, w, a, (a+b)/2, 2*x ); postavi( lo, hi, w, (a+b)/2, b, 2*x+1 ); } int brojka( int x ) { int ret = -1; for( x += off; x > 0; x /= 2 ) if( tree[x] != -1 ) ret = tree[x]; return ret; } int id( par p ) { return lower_bound( vazne.begin(), vazne.end(), p ) - vazne.begin(); } void f_dodaj_vaznu( par a, par b ) { vazne.push_back( b ); } void f_dodaj_edge( par a, par b ) { E[id(a)].push_back( id(b) ); } void rot( par &p, int t = 1 ) { for( t %= 4; t > 0; --t ) { swap( p.x, p.y ); p.x *= -1; p.x += 9999; } } void sweep( void funk( par a, par b ) ) { vector<event> E; for( int r = 0; r < 4; ++r ) { E.clear(); for( int i = 0; i < n; ++i ) { int s = P[i].size(); for( int j = 0; j < s; ++j ) { par p = P[i][j]; par q = P[i][(j+1)%s]; rot( p, r ); rot( q, r ); if( q.y < p.y ) { E.push_back( event( q.y+1, p.y-1, p.x, -1 ) ); E.push_back( event( q.y, q.y, p.x, 1 ) ); E.push_back( event( p.y, p.y, p.x, 1 ) ); } } for( int j = 0; j < s; ++j ) { par a = P[i][j]; rot( a, r ); par b = P[i][(j+1)%s]; rot( b, r ); par c = P[i][(j+2)%s]; rot( c, r ); if( a.x == b.x && a.y > b.y && b.y == c.y && b.x < c.x ) E.push_back( event( b.y, b.y, b.x, -1 ) ); if( a.y == b.y && a.x > b.x && b.x == c.x && b.y > c.y )

RADIONICE

KAMP 2010. 64

E.push_back( event( b.y, b.y, b.x, -1 ) ); } } par p = kraj; rot( p, r ); E.push_back( event( p.y, p.y, p.x, -1 ) ); for( int i = 0; i < vazne.size(); ++i ) { par p = vazne[i]; rot( p, r ); E.push_back( event( p.y, p.y, p.x, 0 ) ); } sort( E.begin(), E.end() ); postavi( 0, off, -MAX ); for( vector<event>::iterator it = E.begin(); it != E.end(); ++it ) { if( it->z ) postavi( it->a, it->b+1, it->t ); else { par p = par( it->t, it->a ); par q = par( brojka( it->a ), it->a ); if( q.x >= 0 && p != q ) { rot( p, 4-r ); rot( q, 4-r ); funk( p, q ); } } } } } int bfs() { int from = id(poc); int to = id(kraj); for( int i = 0; i < m; ++i ) dist[i] = -1; dist[from] = 0; queue<int> Q; Q.push( from ); while( !Q.empty() ) { int x = Q.front(); Q.pop(); if( x == to ) return dist[to]; for( vector<int>::iterator it = E[x].begin(); it != E[x].end(); ++it ) { if( dist[*it] == -1 ) { dist[*it] = dist[x]+1; Q.push( *it ); } } } return -1; } int main( void ) { int tc; scanf( "%d", &tc ); for( int t = 1; t <= tc; ++t ) { vazne.clear(); scanf( "%d %d", &poc.x, &poc.y ); scanf( "%d %d", &kraj.x, &kraj.y ); vazne.push_back( poc ); vazne.push_back( kraj ); scanf( "%d", &n ); for( int i = 0; i < n; ++i ) { int r; scanf( "%d", &r ); P[i].clear(); while( r-- ) { par p; scanf( "%d %d", &p.x, &p.y ); P[i].push_back( p ); vazne.push_back( p ); } }

RADIONICE

KAMP 2010. 65

sweep( &f_dodaj_vaznu ); sort( vazne.begin(), vazne.end() ); vazne.resize( unique( vazne.begin(), vazne.end() ) - vazne.begin() ); m = vazne.size(); for( int i = 0; i < m; ++i ) E[i].clear(); sweep( &f_dodaj_edge ); int d = bfs(); if( d == -1 ) puts( "NO" ); else printf( "%d\n", d ); } return 0; }

Zadatak MONKEYS, Poljska olimpijada 2003. (http://oi.edu.pl/php/show.php?ac=e190700&module=show&file=zadania/oi10/mal)

Postoji N majmuna na drvetu. Oni su označeni brojevima od 1 do N. Majmun broj 1 drži se za granu svojim repom. Za preostale majmune vrijedi da, ili ih drže drugi majmuni, ili se oni drže za druge majmune, ili oboje. Svaki majmun može koristiti obje ruke i može držati najviše jednog majmuna u svakoj ruci (držeći njegov rep). Polazeći od trenutka 0, svake sekunde jedan majmun oslobađa svoju jednu ruku. To može uzrokovati padanje nekih majmuna na tlo, gdje mogu nastaviti oslobađanje svojih ruku (vrijeme pada je zanemarivo mala). Napišite program koji:

• Čita iz standardnog ulaza opis kako se majmuni drže zajedno i kojim redom oslobađaju svoje ruke,

• Za svakog majmuna izračunava vrijeme pada na tlo, • Ispisuje rezultat na standardni izlaz.

Opis algoritma:

Za početak možemo majmune i držanja predstaviti kao čvorove odnosno veze grafa. Kako je broj majmuna i operacija (otpuštanje ruke) velik, vidimo da će rješenje biti nekakva simulacija.

U svakom trenutku bismo trebali znati stanje (komponente) grafa, tako da, kad se neka grupa majmuna odvoji od glavne komponente, njima zapisujemo taj trenutak kao rješenje.

Obična simulacija ne prolazi, jer ne znamo brzo obrisati vezu i osvježiti informacije o komponentama grafa. Međutim, veze je lakše brzo stvarati, pa zadatak rješavamo unatrag.

Najprije napravimo graf kakav je on na kraju poslije svih operacija. Zatim poništavamo operacije od zadnje do prve. Poništavanje je dodavanje veze, dakle spajanje dviju komponenata ako su majmuni u različitim. Prije spajanja dvije komponente trebamo provjeriti je li jedna od njih glavna, jer tim spajanjem i druga postaje dio glavne, pa je poslije te operacije otpuštanja cijela druga grupa pala na tlo. Ako je to slučaj, DFS obilaskom po cijeloj drugoj grupi svim majmunima upisujemo rješenje, a nakon toga dodajemo novu vezu u graf.

Složenost algoritma je O( N+M ) jer ćemo svaki čvor posjetiti u najviše jednom DFS obilasku.

Članovi hrvatskog olimpijskog tima 2010.

20. KAMP MLADIH INFORMATIČARA HRVATSKE Krk, 27. lipnja – 8. srpnja 2010.

BILTEN

Autori priloga i fotografija

Predavači na Kampu 2010. i Vlasta Šeparović

Urednica

Vlasta Šeparović, dipl. ing. [email protected]

Tehnički urednik

Aron Bohr

Likovno rješenje korica

Ivo Šeparović, dipl. ing. Aron Bohr

Izdavač

Hrvatski savez informatičara Zagreb, Dalmatinska 12, tel./fax 01/48 48 770

www.hsin.hr, e-mail: [email protected]

Za izdavača odgovara

Ivo Šeparović, dipl. ing., tajnik HSIN-a [email protected]

Naklada

100 primjeraka

Tisak

Hrvatski savez informatičara

ORGANIZATOR