Crtice o determinizmu i slobodnoj volji

“Although we live in a deterministic universe, human beings have free will.” – Sheldon Cooper

Kad bismo vidjeli svoju budućnost, bismo li joj mogli reći ne? Ted Chiang u svojoj SF priči Story of Your Life postavlja lika upravo u takvu poziciju, a budućnost koju vidi je tragična. I taj lik, u potpunom skladu s determinizmom, odgovara: DA. Prihvaća i čini upravo ono djelo koje ga vodi u takvu, tragičnu budućnost. Ne zato što mora, nego zato što želi. Nemamo slobodnu volju, ali to ne znači da ne činimo ono što želimo. Volja koju nepromjenjivo diktiraju fizikalni zakoni od početka svemira nije drugačija od naše volje, one su jedno te isto.

Determinizam, u kojemu je fizika zamijenjena astrologijom, kao i čovjek koji se s njime bori, nalaze se i u mojoj priči Pod upravom zvijezda. Lik iz priče istodobno je i borac i fatalist; on kao da istodobno i vjeruje i ne vjeruje u slobodu.

Vjeruju li umjetnici? Evo što kaže Leonard Cohen u svojoj pjesmi Alexandra Leaving, u kojoj se obraća čovjeku kojega napušta partnerica:

As someone long prepared for the occasion
In full command of every plan you wrecked
Do not choose a coward’s explanation
That hides behind the cause and the effect

Drugim riječima, nemoj kriviti determinizam (“cause and the effect”), nego preuzmi odgovornost. I to me pogađa, jer moja vjera u determinizam godinama mi je značila prvenstveno utjehu za vlastite pogreške i propuste – nisi mogao drugačije.

Možda i nisam, ali postoje bolje strategije od pozivanja na determinizam. Jednu od njih doživio sam ovog ljeta na izvjesnoj “radionici smijeha” gospodina Ivice. U sklopu te radionice bila je neka igra, brojalica, koju smo igrali nas desetak u krugu. Igra je bila jako jednostavna i jedina poanta bila je u sljedećem: tko pogriješi, njemu plješćemo i bodrimo ga, vičemo hura, bravo! Drugi to vjerojatno nisu doživjeli kao ja, ali meni je to bio iznimno dubok trenutak. Oprostite, gospodine Ivica, zar onaj tko pogriješi ne ispada iz igre? Ne, ostaje u igri, samo mu plješćemo i vičemo bravo. Ali gospodine, zar ne gubi bod ili tako nešto? Ne, ništa ne gubi, samo mu plješćemo i vičemo bravo. Nevjerojatno… Nisam na to navikao… Predivno! Daj da pogriješim! Mi koji smo tvrdi prema sebi, koji smo se navikli kuditi, trebali bismo češće igrati tu igru. Nije onaj prorok slučajno najviše govorio upravo o praštanju.

Dvije zgode s CEOI-a 2016.

Tko zna kako i zašto, sjetio sam se jedne nevažne zgode od prije pet godina u Rumunjskoj gdje sam bio stručni voditelj hrvatskih natjecatelja na CEOI-u. Bila je završna večera, organizirana na nekom lijepom mjestu, s mnogo jela, pića i žive glazbe – mislim da je bilo i plesač(ic)a. Ljudi su se već bili dobro najeli i sada su hodali oko stolova, pričajući i družeći se. Tada je do našeg (“hrvatskog”) stola došla jedna gospođa, profesorica od šezdesetak godina, voditeljica možda bugarskih ili mađarskih natjecatelja, tko će ga više znati. Pitala me za jednoga gospodina, svoga prijatelja, koji je prije bio hrvatski voditelj na olimpijadama. Rekao sam joj da ću mu rado prenijeti njezine pozdrave. Kad je to čula, razveselila se i počela pričati. Da ga puno pozdravlja i da ima divna sjećanja o suradnji i druženju s njim. Da je šteta što više ne dolazi na olimpijade. Da trenutačno radi na na jednom i na drugom sveučilištu, da joj je to naporno i da autom prelazi mnogo kilometara tjedno (ne sjećam se koliko točno). Da njezini studenti negdje postižu odlične rezultate. Da su ona i njezin muž dobro i da rade nešto u vrtu. Da šalje velike pozdrave gospodinu i njegovoj supruzi. I svašta još.

Opustila se žena, raspričala do u sitne detalje, zanijela se, kao da priča njemu. Ne mari ona što ja sigurno neću ni četvrtinu toga zapamtiti, pogotovo u onom dobro najedenom stanju, nakon dva-tri pića, kada su tijelo i mozak na godišnjem odmoru. A ona maše rukama, uživa u svojoj priči, pretpostavlja da slušam, gotovo da mene i ne gleda. Ja kimam glavom. Sigurno, rekao sam, već sutra ću mu poslati mail, sve ću mu prenijeti, sigurno će mu biti jako drago, i on vas pozdravlja. Ona zahvaljuje i priča dalje. Kao da nije svjesna da ne priča njemu, nego meni. Kojega svi ti detalji – uz najbolju volju – ne zanimaju baš previše. Mislim si, zar ona ne kuži da ću moći prenijeti tek mali dio njezinih riječi, a da najvažniji dio – njezin entuzijazam i zanos – dotični gospodin očito neće vidjeti? (Naravno, riječi tu igraju sasvim sporednu ulogu, inače bi mu sama poslala mail.) Vjerojatno kuži, ali ništa to njoj ne smeta. Jebe se njoj, ona se ispucala, ispričala što je imala na duši i veselo se vratila za svoj stol.

Volio bih biti ta gospođa. Biti u svom filmu. Ne tražiti previše. Biti sretan s X iako sam htio Y. Pričati svoju priču tko god me slušao ili ne slušao. Pisati ne moleći da čitaju. Pjevati. Dati stotinu rečenica ne očekujući nijednu zauzvrat. Proizvoditi entuzijazam bez obzira na prijam i odgovor. Bez obzira na drugu osobu.

Još jedna nevažna zgoda dogodila se na istom natjecanju nekoliko dana prije, dok smo obilazili gradić Piatra Neamț gdje se sve to događalo. Prelazeći cestu, pored mene se stvorila mala Ciganka, djevojčica od možda desetak godina, i počela mi nešto govoriti na rumunjskom. Pojma nemam što je rekla. Nije djelovalo kao da prosi ili nešto traži, više je djelovalo kao neki veseli komentar ili pitanje. Nije znala da ne znam rumunjski. Računao sam da ona ne zna engleski pa sam pomislio da je najlakše uopće ne reagirati; jednostavno sam ignorirao što govori, pravio se kao da je nema. Sumnjam da ju je to previše uznemirilo, ali ne ponosim se svojom reakcijom.

Dan danas me zanima što mi je rekla. A nikada neću saznati. Naravno, vjerojatno nije rekla ništa toliko osobito, i možda bih je bio brzo zaboravio da sam je uspio razumjeti. No ovako, iako ona misli da sam je totalno izignorirao, zapravo sam je zapamtio toliko dobro da sada o njoj pišem.

Ta zgoda nije toliko različita od ove prethodne, one stoje u nekom čudnom odnosu. Kad su se već dogodile u istom gradiću u približno isto vrijeme, neka stoje i ovdje zajedno, na istom blogu, kao spomen na dvije osobe koje su htjele nešto reći.

Polumatematičke crtice s godišnjeg odmora

Posudio sam iz knjižnice debelu knjigu Number theory Andreja Dujelle, počeo je čitati i rješavati zadatke. Ide mi dobro, prisjećam se kako je to bilo vježbati za matematičke olimpijade. Ali ako velik dio dana provedem na taj način, osjećam se kao da sam gubio vrijeme. Jer sada, kada nemam neke vanjske motivacije za proučavanje teorije brojeva (niti se natječem niti se profesionalno bavim čistom matematikom), osjećaj je u istom rangu kao da rješavam sudoku: lijepo, ali beskorisno, ne doprinosi ničemu. Ne kažem da treba biti tako, samo da se ja tako osjećam, a osjećajima uglavnom ne možemo upravljati. Bolje se osjećam kada čitam nešto životnije.

Tako sam čitao Teda Chianga (inače odličnog SF pisca) i njegovu priču Division by zero. U toj priči on pokušava oslikati matematičarku kojoj je matematika daleko od sudokua i slične zabave: ona je praktički religiozno vezana za matematičke rezultate, baš kao i neki veliki vjernik za dogme u koje vjeruje. Poznajete li nekog takvog matematičara? Ja ga baš i ne poznajem. Kao što keramičaru neće svijet propasti ako mu se razbije paket pločica, tako je i većini matematičara vjerojatno svejedno je li Goldbachova ili Riemannova hipoteza istinita ili nije; zapravo im je vjerojatno stalo samo do toga da oni sami uspiju dati neki doprinos. Je li rezultat pet ili šest, koga briga, jer ništa se u svemiru ni u našim životima neće promijeniti. Ja sam kao mali, u osnovnoj školi, bio vatreni matematičar i možda mi je stvarno bilo stalo do tih rezultata. Sad više nije toliko, i ne znam nikoga tko je toliko “religiozan” u matematici da mu je doista stalo. Sve je to sudoku.

Uglavnom, u spomenutoj priči Division by zero, Ted Chiang uspijeva uvjerljivo opisati takvu duboku matematičarku Renee. (Tekst koji slijedi sadrži spoilere.) Što je najgore što se takvoj osobi može dogoditi? Kao što bi vatrenom vjerniku ili teologu najgora spoznaja bila da nema Boga, tako Renee – na svoje veliko zaprepaštenje – uspijeva dokazati da je matematika u sebi kontradiktorna, tj. da je moguće bez greške dokazati da je 1 = 2 (ili bilo koju drugu jednakost). Sve matematičke tvrdnje postaju jednako istinite i jednako neistinite. Njezinim je kolegama manje-više svejedno, ali Renee pada u tešku depresiju. Ali genijalnost leži tek u drugoj, paralelnoj radnji priče: kao što se Renee bori sa svojom spoznajom o kontradiktornosti matematike, tako se njezin suprug Carl bori sam sa sobom, sa spoznajom da više ne može razumjeti Renee, da se njegova ljubav prema njoj gasi, da je mora napustiti. Dok Renee gubi vjeru u matematiku koja je njezin život, Carl gubi vjeru u život i samoga sebe. U zadnjem odjeljku, koji je prikladno označen kao “1 = 2”, Carl napokon shvaća što osjeća Renee – jer on osjeća to isto, samo u drugoj domeni. Ali ta ih “jednakost” razdvaja, kao što jednakost 1 = 2 uništava matematiku.

*

Postoji teorem (tzv. Intermediate value theorem) koji kaže da ako imamo neprekidnu funkciju za koju je f(a) negativan i f(b) pozitivan, onda mora postojati neki c između a i b takav da je f(c) = 0. Prilično intuitivno, zar ne? Što ćemo onda sa sljedećim pitanjem: ako sa a = 15 godina nisi odrastao čovjek, a sa b = 35 godina jesi odrastao čovjek, u kojem se točno trenutku događa prijelaz? Ne mora on biti isti za svakoga, jer funkcija ne raste istom brzinom za svakoga, ali za svakoga tko će ikad odrasti očito mora postojati neki trenutak kada on počinje biti odrastao. (Žalite se teoremu, ne meni.)

Taj se prijelaz dogodi, a nitko ga ne primijeti. U pjesmi Time, Floydi govore upravo o tome, te između ostalog kažu: “No one told you when to run, you missed the starting gun.” Ali ja ipak mislim da sam uočio taj trenutak. Noćas sam se probudio usred noći te, idući prema WC-u, ugledao plosnati predmet za koji sam na trenutak (u tom uspavanom stanju) pomislio da je matematička knjiga; imao je i uzorak šahovnice na “naslovnici”. Kad sam bolje pogledao, shvatio sam da je to paket vlažnih krpa za pranje poda koje sam jučer upotrebljavao (kupljen u Kauflandu ili Mülleru), a onaj šahovski uzorak na njegovu omotu oslikava pločice. Život se mijenja; matematičku knjigu zamjenjuje nešto mnogo prizemnije, čak i u najdoslovnijem smislu riječi “prizemno”. Zgodna slika odrastanja.

Dilema istraživanja i iskorištavanja

“You can usually accomplish more by giving something your full effort for a few years rather than giving it a lukewarm effort for fifty years.

Pick a priority for this season of your life and do it to the best of your ability.”

Gornji citat pročitao sam jučer u tjednom newsletteru Jamesa Cleara, autora koji se bavi produktivnošću i navikama. U tom citatu lako je previdjeti jednu manje naglašenu, ali presudnu stvar. Druga rečenica, naime, sastoji se od dviju točaka: 1) pick a priority; 2) do it to the best of your ability. Početna rečenica o trudu kroz godine naglašava točku 2), pa je lako zaboraviti točku 1), fazu odabira. Napor možemo uložiti u bilo što, ali često nismo sigurni je li to najbolje za nas. Što odabrati? Točnije, koliko vremena uložiti u biranje ili istraživanje (1) u odnosu na iskorištavanje (2)?

U području umjetne inteligencije ovo se zove dilema istraživanja i iskorištavanja (engl. Exploration-Exploitation Dilemma), a svodi se na sljedeće (opetovano) pitanje: hoću li “igrati na sigurno” potezom koji je najbolji s obzirom na dosadašnje znanje, ili ću odabrati drugi potez koji bi mogao biti bolji (ali i mnogo lošiji)? Primjene leže u robotici, financijama, igranju igara, algoritmima za preporučivanje oglasa/pjesama/filmova korisnicima, te općenito u podržanom učenju (engl. reinforcement learning). Dobar članak o ovom problemu i raznim matematičkim strategijama njegova rješavanja možete naći ovdje.

Ako sam našao solidan posao, hoću li tražiti još bolji? Ako biram ideju za projekt čiji je ishod neizvjestan, u kojem ću trenutku prestati tražiti, i početi raditi na najboljoj ideji smišljenoj do tog trenutka? Hoću li večeras otići u svoj omiljeni kafić ili ću isprobati neki novi? Uživati u poznatoj glazbi ili istraživati nepoznatu? Treba li angažirati uglednog ili još nepoznatog (ali možda boljeg) glumca za film? U kojem trenutku treba prestati upoznavati potencijalne ljubavne partnere i odlučiti se za jednog? (Ovo zadnje je matematički riješeno. Kao.)

Nešto malo u ovom smjeru već sam pisao. Prije dvije godine, u svojoj objavi o zadatku s potapanjem brodova, napisao sam:

On [Goran] je na početku napravio 20 ili 30 potpuno slučajnih hitaca po cijeloj ploči, neovisno o tome je li neki od njih bio uspješan. Tek potom gledao je koji su hici bili uspješni i prema tome gađao gdje su čitavi brodovi. (…) Meni se takva strategija jako svidjela, više u psihološkom nego u matematičkom smislu. Ima taj duh robusnosti, ne lijepi se za prvi pogodak, nego u prvoj fazi decidirano i pomalo nemarno isprobava trideset slučajnih stvari prije nego što se u sljedećoj fazi počne fokusirati. Životna lekcija, eto što je to.

Ako sam se od malih nogu bavio samo matematikom, kako znam da, recimo, ne bih u konačnici više uživao ili bio uspješniji baveći se glazbom? Ili pisanjem? Ili plivanjem? Ili programiranjem igara? Ili kuhanjem?

Ali i prevelik broj interesa ili talenata može biti problem jer tada često izostane ona ključna druga faza s početka teksta – faza u kojoj se nekoliko godina fokusirano trudiš samo u jednoj stvari. Izostane zato što bi se htio svime baviti, ili zato što dugo čekaš da ti postane jasno što ti je najbolje. Ili oboje pomalo.

S mnogo grubih pojednostavljenja, od kojih je najveće pretpostavka da najprije istražujemo i na kraju iskorištavamo, o ovom problemu u praksi možemo razmišljati na sljedeći način. Neka je uspjeh(x) očekivana nagrada ako je x trajanje faze istraživanja. Jasno je da x ne smije biti ni premalen ni prevelik. Ako je x = 0, nema istraživanja i zapravo ne znamo čime se baviti. Ako je x malen, isprobali smo malo stvari pa je mala vjerojatnost da smo pronašli ono što će nam dati najbolji uspjeh. Dakle, kako x (vrijeme provedeno u istraživanju) raste, tako raste i očekivani uspjeh(x) jer s više informacija bolje izabiremo. Međutim, budući da je vrijeme ograničeno, prevelik x nije dobar: iako ćemo nakon mnogo istraživanja dobro znati što nam je činiti, neće nam preostati dovoljno vremena da se tome posvetimo. To znači da funkcija uspjeh raste pa pada (graf ima oblik obrnutog slova U), tj. da postoji njezin “vrh”, neko optimalno vrijeme x = T kad je očekivani uspjeh(x) najveći. Daljnjim povećavanjem iksa (x > T) funkcija uspjeh(x) počinje padati, tj. sve se manje i manje isplati istraživati i čekati jer gubimo vrijeme. Kako prepoznati to optimalno vrijeme, “the sweet spot”?

Slavko Kolar i različite varijante (ne)ispijanja ljubavnog napitka

Jeste li gledali stari, crno-bijeli film Svoga tela gospodar? U njemu je riječ o siromašnom selu gdje je mladić Iva silom prilika bio prisiljen oženiti šepavu djevojku Rožu, koju ne voli i godinama je sasvim ignorira. Roža od seoske babe vračare pribavlja prah koji bi Ivu trebao začarati da se zaljubi u Rožu. Na nekoj svadbi, usred zabave i graje, ona mu taj prah sipa u piće.

Što se tada događa? Priča zapravo ima tri različita završetka. U istoimenoj pripovijetki Slavka Kolara iz 1931. godine, prema kojoj je film snimljen, Iva na vrijeme primjećuje prah u svojoj čaši. Rožin plan propada, a Iva je počinje tući na mrtvo ime. Tada mu Roža jecajući izgovara rečenicu (koja se javlja u svim inačicama priče):

“Vudri, mili Ivek, vudri, neka bar po šake tvoje znam da sem ti žena!”

Iva je zbunjen ostavlja na miru i tako pripovijest završava. Što će dalje s njima biti, pisac je ostavio na interpretaciju čitatelju, kao i pitanje što bi se dogodilo da je Iva popio ljubavni napitak.

U filmu se pak stvari odvijaju malo drugačije. Ubrzo nakon što je Roža na zabavi u Ivinu čašu vina stavila prah od babe vračare, čašu zgrabi i iskapi slučajan gost koji je, pripit i u naletu žeđi, došao do stola i potom odmah nastavio plesati. Roža ponovno stavlja prah u vino. Iva se vraća za stol i ispija vino, a onda zbunjeno gleda u čašu i primjećuje prah. Stvari se dalje odvijaju slično kao u Kolarovoj pripovijetki: Iva bije Rožu, ona mu odvraća poznatu rečenicu, nakon čega je prestaje tući. Blagi podsmijeh njegova lica daje naslutiti da je i dalje mrzi. Sličan završetak kao onaj prvi, reklo bi se, ali malo dorečeniji: napitak je ispijen, nije djelovao, a da će možda početi djelovati tek poslije – to nije baš izgledno. U zadnjem kadru Roža šepa za Ivom, baš kao i na kraju Kolarove pripovijetke.

Nesretan kraj, reklo bi se. Prije nego prijeđem na najzanimljiviju varijantu završetka ove priče, zapitajmo se: kako bi ona uopće mogla završiti happy endom? Da Iva nije ništa primijetio i da je napitak zaista djelovao tako da zavoli Rožu, bi li to bio sretan kraj? Vjerujem da se i vama čini da ne bi: bila bi to prevara, ljubav proizvedena umjetno, bez motivacije. Ali kako onda?

Jedan od općih savjeta za pisce glasi da kraj treba biti takav da djeluje kao da se nije moglo drugačije završiti. U skladu s time, najefektniji kraj smislio je sam Slavko Kolar u drami (kazališnom djelu) Svoga tela gospodar – Smešna pripovest u dva dela (vu sedmerem spelavanju) koju je napisao 1957. godine, dvadeset šest godina nakon svoje izvorne pripovijetke. Tu dramu, točnije snimku njezine suvremene izvedbe iz jednog zagrebačkog kazališta, vidio sam jednom na HTV-u. Taj twist na samom kraju, ta dosjetka – Kolarovo genijalno rješenje zadatka “završi priču na pravi način” koji je, izgleda, rješavao 26 godina – urezao mi se u pamćenje i zato sve ovo pišem, dijelim.

U predstavi, naime, Iva opet na vrijeme primjećuje prah u čaši vina. I onda, nakon njegova gnjeva, Rožina pokušaja samoubojstva, i oštre rasprave s roditeljima i kumom, Iva naposljetku viče:

“Dajte ju sim!”

Uzima čašu i, na zaprepaštenje svih prisutnih, polako sve ispija, govoreći pritom: “Naj bu, kak bu!” U tom trenutku predstava završava.

U ovoj varijanti Iva je, dakle, ljubavni napitak ispio namjerno. Što to znači? Hoće li napitak djelovati ili neće? Jasno naslućujemo: sada nije važno! Sama činjenica da je napitak ispio svojom voljom ima učinak djelovanja, ukazuje na završetak u kojem se on miri sa svojom sudbinom, odlučuje voljeti Rožu. Ili barem sa sebe skida oklop inata koji mu je to branio.

Netko bi mogao prigovoriti da ovdje odluka nije dovoljna i da nije moguće voljeti na silu. Istina, ali tvrdnja “odluka je dovoljna” jednako je pogrešna kao i ona suprotna, da su dovoljni isključivo osjećaji. U psihologiji je poznato da akcija prethodi motivaciji, drugim riječima, često moramo najprije započeti nešto raditi da bismo za to postali zagrijani; čekati motivaciju loša je strategija. Čini se da je svega toga bio svjestan i Slavko Kolar, jer Iva u trenutku ispijanja još nije sretan, nije se mnogo promijenio – samo čini prvi korak.

Koliko sam dobro trčao? (prvi dio)

Neki će reći da je dobar trening svaki onaj od kojeg se dobro oznojiš, te da je dobar rezultat na nekoj dionici trčanja (recimo 5 km) ono vrijeme koje je bolje od tvog prethodnog vremena. Fair enough, ali matematičar u meni želi kvantizirati uspjeh treninga trčanja. Ako sam pretrčao S kilometara u T vremena, koliko sam dobro trčao?

Naravno, nije svejedno jesam li trčao konstantnom brzinom ili sam, recimo, naizmjence ubrzavao i usporavao; a ni parametre poput temperature zraka, nagiba staze i brzine vjetra ne treba uvijek zanemariti. Ipak, radi jednostavnosti, zanemarit ćemo ih i pretpostaviti idealne uvjete, te da se brzina nije mnogo mijenjala tijekom trčanja, tj. da nije riječ o intervalnom treningu (koji je često efektivniji, ali to je druga tema).

I dalje, moguća su različita shvaćanja gornjeg pitanja:

  1. Koliko bi odrađeni trk bio uspješan u kontekstu neke utrke, odnosno, koliko je uspješan s obzirom na sposobnost koju pokazuje?
  2. Koliko je iscrpljujući?

Prvo shvaćanje rangiralo bi vrhunski otrčan sprint daleko bolje od osrednje otrčanog maratona, dok bi drugo shvaćanje učinilo upravo suprotno.

Što se tiče drugog pitanja (iscrpljujući), jedna je moguća strategija procijeniti utrošene kalorije, a one (ako sam dobro shvatio guglajući) najviše ovise o prijeđenom putu, dakle, o umnošku brzine i vremena. U tom bi smislu sporo otrčan maraton bio izjednačen s brzo otrčanim maratonom (“while running it doesn’t matter what speed you run a given distance, you will burn the same amount of calories as long as the distance is the same”, izvor). Čak mi se iz formula koje se spominju na webu (recimo ovdje) čini da bi sporiji trk na istoj udaljenosti potrošio malo više kalorija, jer se formula (kad zanemarimo masu i druge konstante) svodi na nešto tipa vrijeme * (0.2*brzina + 3.5) = 0.2*put + 3.5*vrijeme. To mi je neobično jer bi nas vremenski kraći trk na istoj dionici trebao više iscrpiti. S druge strane, možda se stvarno utroši manje energije jer imamo manje doticaja s tlom. Ako netko zna više, neka napiše u komentar.

Prvo je pitanje zanimljivije i u nastavku teksta okrećem se njemu. Pretpostavimo, dakle, da trčimo S metara za T sekundi konstantnom brzinom od V = S/T metara u sekundi. Najprije primijetimo:

  • veća brzina uvijek povećava uspjeh trka (bilo da fiksiramo vrijeme, bilo da fiksiramo put),
  • dulji put uvijek povećava uspjeh trka (bilo da fiksiramo vrijeme, bilo da fiksiramo brzinu),
  • ali vrijeme tako izravno ne utječe na uspjeh (ako je brzina fiksna, bolje je veće vrijeme; ako je put fiksan, bolje je kraće vrijeme).

Možemo stoga reći da je uspjeh neka kombinacija puta i brzine, S*V ili tako nešto. Što točno? O tome ću idući put, a ako imate ideju, napišite u komentar.

Natjecanje je više od natjecanja

Odlukom AZOO-a, Državno se natjecanje održava u matičnim školama učenika. Vjerojatno je ta odluka s obzirom na epidemiološku situaciju ispravna. Ali motivira me da malo pišem o nekim stvarima koje natjecanje čine onim što jest.

Najprije, Primošten. Već drugu godinu zaredom nećemo uživati u onome što je, meni osobno, postala divna tradicija: svake godine u ožujku otputovati u Hotel Zora i pet dana uživati organizirajući natjecanje tik uz more, a u slobodno vrijeme uživati u šetnjama, kavi i pogledu. Jer tada nema turista (hotel se za nas otvara), sve je tiho i pusto, što je za introverta savršeno; more je doduše hladno, ali ima ona klupa tamo nad stijenama, kad obilaziš poluotok sa starim dijelom grada, na kojoj možeš sjediti satima. (Ima ih nekoliko, ali ona jedna je posebna.)

Ovo je pogled s terase hotela, odmah izvan dvorane za natjecanje:

Zašto ovo pišem? Žalim li se na situaciju, provociram li? Ne, samo dijelim ono što mi je na umu, i želim reći (koliko god to iracionalno zvučalo): za mene je natjecanje i taj Primošten. Bez njega nešto nedostaje. Lako je reći: važan je sadržaj, a ne forma; važna je suština natjecanja; zadatci, rezultati i tako dalje. Primošten je samo “pakovanje” i ukras. Ali baš jučer, u sasvim drugom kontekstu, meni i kolegi mentor je rekao: Forma vam je vrlo bitna u životu – zapamtite to!

Naravno da nije riječ samo o Primoštenu, nego o cijeloj priči: o putovanju pješke na školsko natjecanje, putovanju tramvajem na županijsko natjecanje, pa poslije o pakiranju kofera, dugom putovanju autobusom za Primošten, slušanju glazbe na autocesti, stajanju autobusa na odmorištima kad jedemo sendviče i pričamo o zadatcima ili nečemu desetom, o hotelskoj sobi, doručcima, ručkovima i večerama u hotelu, gotovo neprestanom druženju koje okružuje cijelu priču, a naravno i o otvaranju natjecanja, priredbi lokalnih đaka, govoranciji ljudi u odijelima, pa onda o zatvaranju, proglašenju pobjednika, dodjeli nagrada, naslikavanju, čestitkama, spremanju kofera, ponovno o autobusu, i tako.

Naravno da natjecanje može biti bez većine toga, što je slučaj prethodne i ove godine. Sva natjecanja teoretski možemo odraditi online, nitko ne mora uopće napuštati svoj dom. Jednostavnije, jeftinije i učinkovitije! Ali sami procijenite koliko bi bilo čari u takvom natjecanju. Udobnost je precijenjena; dopustite da to potkrijepim citatom Marka Mansona (izvor je njegov e-mail newsletter):

In the new book, Burkeman has an interesting section about how convenience can backfire. He argues that it’s often the inefficient friction in life that slows us down long enough to actually forge meaningful connections. For example, instead of ordering eight pounds of your favorite meat online, being forced to walk down to the butcher each week and chat to them about weather and business and sports while they cut each slice, week after week, month after month—well, it’s the aggregation of all of these little “inefficient” experiences that generates a sense of community and rootedness in one’s life. By introducing widespread “convenience,” at scale, you remove people’s opportunities to serendipitously engage with the people in their communities.

Po prirodi sam minimalist i nekad prije suprotstavio bih se ovome što sada pišem. Kakve priredbe, kakve govorancije, kakvi ukrasi, glupost! Bio sam jako “racionalan”: kad bih se dopisivao s nekim, moje su poruke bile kratke i informativne; kakvi pozdravi, kakvi smajlići, čemu ta glupava i suvišna pristojnost? Nekad to i ima smisla, mnogo ovisi o kontekstu. Kad je posao u pitanju, kad treba nešto odraditi, onda je poželjno ostati hladne glave i komunikaciju svesti na informaciju, očistiti je od distrakcija. Ali život je više od posla i natjecanje je više od natjecanja.

Jedan moj prijatelj ima običaj na kraju svake svoje poruke djevojci dopisati ni manje ni više nego pet srdaca. Objasnio sam mu da, ako to čini baš u svakoj poruci, srca postaju redundantna jer više ne prenose nikakvu informaciju (nego bi tek njihov izostanak bio nova informacija). Odgovorio je: Naravno, ali nisu redundantna u smislu naglašavanja konteksta. Shvati to kao uživanje u trenutku i formatiranje. Zašto imati stolnjak gdje su svuda nacrtane ruže, dovoljno je staviti ružu na jedan rub i napisati for petlju. Rituali i navike inače mogu biti dosta dobri psihički. Čovjek ima urođenu potrebu za ritualizacijom. Rekao bih čak igrom. Simboli često nisu samo simboli. Zaista, nije važan samo prijenos informacija. Zato što smo, u suštini, životinje; jer je naš primitivni dio mozga stariji i važniji od intelektualnog (vidi npr. ovaj tekst). Je li cijela umjetnost suvišna? Čemu pisati tekst za pjesmu koji se lako prepriča u nekoliko riječi?

Zato je važna ceremonija na početku i na kraju natjecanja. I zato mi je žao onog trenutka kad sam, prije pet ili više godina, metodički pogrešno odgovorio jednom natjecatelju šestog razreda na pitanje tijekom Državnog natjecanja. Naime, na evaluator je stigla njegova poruka o tome da u Pythonu ne uspijeva promijeniti znak u stringu i moli za pomoć. Naravno da mu nisam smio pomoći, ali problem je bio u načinu odgovora. Na međunarodnim natjecanjima, jedan od standardnih načina nepristranog odgovaranja na pitanja natjecatelja bio je korištenjem sljedećih odgovora: “YES“, “NO”, “ANSWERED IN TASK DESCRIPTION (EXPLICITLY OR IMPLICITLY)”, ili “NO COMMENT”. Ovo posljednje je značilo da natjecatelj traži informaciju koju povjerenstvo ne može dati. Ja sam, u skladu s time, odgovorio: “Bez komentara”. Ali mladi natjecatelj gotovo sigurno nije znao da je riječ o jednom od standardnih odgovora. Kada netko inače kaže: “bez komentara”, to često znači da je ostao bez teksta, ta rečenica ima negativan prizvuk i natjecatelj ju je vjerojatno doživio kao opomenu, kao da je u svom pitanju pokazao veliko nezanje/glupost ili bio nepristojan. I možda je to utjecalo na njegovu razinu motivacije. Sada ljepše odgovaram. Neki će reći da cjepidlačim, ali sve je to važno.

I zato mi je žao što je ove godine na Županijskom natjecanju prvi, “motivacijski” zadatak za 1. razred ispao pretežak. I što je na osnovnoškolskim natjecanjima prvi zadatak često pretežak; nadam se da će se to promijeniti. Neki će reći da treba postojati filter, da je dosta popuštanja, da nisu svi za natjecanje i da se mladi trebaju čeličiti. Donekle se slažem, ali zato imamo selekciju na više razine. Primjerice, na “online” Državno natjecanje i dalje ide isti broj ljudi kao i prije pandemije iako su troškovi neusporedivo manji. Što je natjecanje masovnije, manje je prestižno, a time i manje motivira. Potreban je dobar balans između masovnog i elitnog. Zato imamo stepenice. A prva treba biti lagana, jer smisao je natjecanja upravo motivacija. Oni najizvrsniji lako će se snaći kakvo god bilo natjecanje, ali što je s deset tisuća ostalih, što njima želimo? Sigurno ne poručiti im da su loši i da se trebaju baviti nečim drugim. Ljudi su osjetljivi, poticanja i lijepih riječi nikad nije dosta, jer neuspjeha na raznim mjestima – što u stvarnosti, što u glavi – ima i previše.

Refreshaj koliko hoćeš

Jeste li ikad bjesomučno refreshali neku stranicu čekajući neku vijest ili promjenu? (Recimo, popis pozvanih na Državno natjecanje koji se danas očekuje?)

Možda ste znali, a možda i niste, da se to refreshanje može automatizirati.

Postoje online alati za to (recimo, https://www.followthatpage.com/), ali zašto ne bismo zasukali rukave i sami napisali odgovarajuću skripticu?

Ovo je moja:

"""
Usage: refresh.py [full_url] [refresh_interval_in_seconds] [optional: string_to_search]

If the search string is given, then refreshes until the string is found in page text.
Otherwise, refreshes until the page is changed.
"""

import urllib.request
import sys
from time import sleep
from bs4 import BeautifulSoup

def get_text(url):
    text = str(urllib.request.urlopen(url).read())
    soup = BeautifulSoup(text, 'html.parser')
    [s.extract() for s in soup(['style', 'script', '[document]', 'head', 'title'])]
    text = soup.getText()
    # ignore numbers
    for z in '0123456789':
        text = text.replace(z, '')
    return text

try:
    interval = int(sys.argv[2])
    url = sys.argv[1]
except:
    print(f'usage: {sys.argv[0]} [full_url] [refresh_interval_in_seconds] [optional: string to search]')
    exit(0)
if len(sys.argv) > 3:
    word = sys.argv[3]
else:
    word = None
print(f'reading {url} ...')
previous_text = get_text(url)
while True:
    sleep(interval)
    print(f'refreshing {url} ...', end=' ')
    text = get_text(url)
    if word: 
        if word in text:
            print(f'String "{word}" found in page text!')
            exit(0)
        else:
            print(f'string "{word}" not found')
    else:
        if text != previous_text:
            print(f'Page has changed!')
            exit(0)
        else:
            print('no change')
    previous_text = text

Ovaj dio s promjenom ne radi na stranicama s oglasima (npr. portali) jer su svaki put drugačije reklame pa skripta misli da se stranica promijenila. Možda ima i još bugova ili prostora za poboljšanje, slobodno komentirajte.

Napomena: Ne postavljajte refresh interval na manje od nekoliko sekundi; prečesto slanje requestova može biti nepristojno ili čak zabranjeno. Related: https://softwareengineering.stackexchange.com/a/304767

Kako to ide

Mali pogled petnaestak godina unatrag (uključujući i sve te godine).

U vitrini svoje osnovne škole gledao sam neku pohvalnicu za nečije davno sudjelovanje na regionalnom natjecanju iz matematike. Bio mi je to pojam, sveti gral kojemu sam hrlio. I natjecao sam se iz matematike. U šestom razredu došao sam do tog regionalnog natjecanja, poslije još dalje, bilo mi je to tada najvažnije na svijetu. Gledao sam stare rang liste, razmišljao o opasnoj konkurenciji kojoj sam znao samo imena, pogledavao ih po hodnicima ovog ili onog natjecanja. Polako sam ih upoznavao, mašta je postajala stvarnost, mitska imena postajala su poznata lica, legende su postajale obični ljudi udaljeni tek metar ili dva, normalni i nesavršeni, ni izdaleka onako nepobjedivi kao na starim rang listama. Krenuo sam u Petu gimnaziju, upoznao ih još više, družio se sa sebi sličnijima. Famozni Pjer Mladinić čije sam čitao knjižice i članke u Matki sada mi je, glavom i bradom, predavao matematiku. Legendarni stariji natjecatelj Goran Dražić držao nam je matematičku grupu. Svijet – planet – skupljao se, postajao mi bliži. Svijet matematike i njezinih lica, na početku rasutih po tablicama, a sada bliskih. Od prvih županijskih natjecanja, preko matematičke gimnazije, do olimpijada, i tako dalje…

Kroz gimnaziju to se sve malo i izmiješalo: pojavila se informatika, a i neki drugi interesi. Mijenjao sam raspoloženja i natjecanja bi mi možda sve manje značila da nije bilo međunarodnih olimpijada, novog izvora motivacije. Na tim sam izletima upoznavao strane natjecatelje, od slabijih do najtrofejnijih: igrali smo mafiju i nogomet, pričali o glupostima, svijet se skupljao još više. Najviše se, zapravo, skupio u Kaliforniji gdje smo, već kao studenti druge-treće godine fakulteta, radili na tromjesečnim ljetnim praksama (internship) u tamošnjim softverskim firmama poput Facebooka. Jer tamo, gdje je atmosfera bila zaista divna, u blizini (što firme, što Stanford) našlo se zaista mnogo poznatih lica s matematičkih i informatičkih olimpijada s kojima sam se ponovno imao priliku družiti. Bio sam na vrhu, ima li dalje?

Naravno da se od nekog trenutka stvar prestaje penjati i poprima rjeđe i tiše tonove. Na fakultetu su natjecanja manje važna, postaje ljepše sastavljati zadatke za njih, ali tu se svijet već lagano rasipa. Znanost bi, naravno, mogla postati novo i mnogo važnije natjecanje – ali znanost je drugačija, njome se bavi svatko u svojem laboratoriju, u znoju svoje samoće, više i ne znajući što rade njegovi poznanici. Postoje konferencije, ali tu je socijalni element daleko manji, nije to više to: ljudi su odrasli, grade svoje živote, neki već imaju i obitelj i ne zapljuskuju ih toliko valovi vanjskog svijeta. Znanci iz ove ili one priče gube se po svijetu, po raznim kontinentima, sveučilištima i firmama, više ne pratiš ni one koji su ti bili bliski, a ni one s kojima sada radiš u istoj zgradi. Ego blijedi, radiš svoj posao ili doktorat, ostaje ti vlastiti život i sve manje ljudi koji ti u njemu igraju ikakvu ulogu. U središte dolazi privatni život, na mreži vidiš nekadašnje kolege suparnike kako se udaju/žene, dobivaju djecu, nastanjuju u svoje malene kutke svijeta, čudno ti je da ste se nekad iz nečega natjecali. Svijet koji se prije skupljao sada se rasipa, postaje nevažan, vraćamo se kući.

Komunikacijska složenost – ili – kako zakodirati partiju šaha

Na IOI-u 2010. prvi put smo se susreli s tipom zadatka u kojemu treba poslati neku informaciju u što manje bitova. Zadatak se zvao Saveit i trebalo je, za zadani graf, najkraće udaljenosti (između zadanih posebnih vrhova do svih ostalih) poslati kao bitovni niz iz jednog programa (encoder) u drugi program (decoder) koji će taj niz znati protumačiti, tj. iz binarnog niza rekonstruirati tražene udaljenosti. Trebalo je, naravno, napisati oba programa.

Naivno je rješenje svaku udaljenost poslati kao binaran broj, što rezultira prevelikim ukupnim brojem bitova. Ključna ideja bila je iskoristiti činjenicu da, ako su X i X’ susjedi u grafu, udaljenost(X, Y) razlikuje se od udaljenosti(X’, Y) najviše za 1. Zato je za ovu drugu udaljenost, pod pretpostavkom da smo već poslali prvu, dovoljno poslati samo razliku (-1, 0 ili 1) što možemo dvama bitovima. Ili, još bolje, konstruiramo ternarni niz koji prije slanja pretvorimo u binarni. Detalje ostavljamo čitateljici za vježbu, a cijelo rješenje imate npr. ovdje (napisala ga je moja malenkost, doduše poslije natjecanja).

Tako se na IOI-u pojavila nova tema, koju smo u Hrvatskoj ponekad zvali komunikacijskom složenošću jer se radi o veličini poruka između dvaju programa. Riječ je još i o zadatcima Parrots iz 2011., Supper iz 2012. i Stations iz 2020., a i na CEOI-u 2016. pojavio se zadatak Trick.

Ima to veze i s kompresijskim algoritmima, npr. onima koji smanje veličinu datoteka kad ih zipate, ali za razliku od tih algoritama koji su prilično generički (ne tumače sadržaj datoteka), u ovim problemima traži se kompresija specifična za dani problem. Tako mi je palo na pamet sljedeće pitanje: kako zakodirati partiju šaha, u smislu poteza koji su odigrani? Naravno, pitanje je prilično beskorisno budući da tekstualni zapis šahovske partije nije uopće velik, vjerojatno ste ga i vidjeli (riječ je o Portable Game Notation – PGN), primjerice:

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O 9. h3 Nb8 10. d4 Nbd7 11. c4 c6 12. cxb5 axb5 13. Nc3 Bb7 14. Bg5 b4 15. Nb1 h6 16. Bh4 c5 17. dxe5 Nxe4 18. Bxe7 Qxe7 19. exd6 Qf6 20. Nbd2 Nxd6 21. Nc4 Nxc4 22. Bxc4 Nb6 23. Ne5 Rae8 24. Bxf7+ Rxf7 25. Nxf7 Rxe1+ 26. Qxe1 Kxf7 27. Qe3 Qg5 28. Qxg5 hxg5 29. b3 Ke6 30. a3 Kd6 31. axb4 cxb4 32. Ra5 Nd5 33. f3 Bc8 34. Kf2 Bf5 35. Ra7 g6 36. Ra6+ Kc5 37. Ke1 Nf4 38. g3 Nxh3 39. Kd2 Kb5 40. Rd6 Kc5 41. Ra6 Nf2 42. g4 Bd3 43. Re6 1/2-1/2

Ali čemu tražiti svrhu, ni većina drugih informatičkih zadataka nije u ovom smislu korisna. Najbolje stvari su beskorisne. Razmislimo onda kako bismo zakodirali ovakav niz poteza u što manju (binarnu ili tekstualnu) datoteku. Želite li se sami zabaviti razmišljajući o tome, slobodno ovdje prestanite čitati…

Na prvi pogled nije lako jako nadmašiti gornji PGN zapis, ali neke redukcije možemo smisliti relativno brzo. Primjerice: nema potrebe navoditi redni broj poteza; moguće je izostaviti i razmake; ne trebaju nam znakovi x (za jedenje) i + (za šah). Moguća su i sitnija poboljšanja: rezultat na kraju može se zapisati samo jednim znakom, a ponekad (npr. u slučaju mata ili pata) on nije ni potreban jer slijedi iz pozicije; rokadu je moguće prikazati jednim znakom; neka jedenja od strane pješaka (npr. hxg5) dovoljno je pisati kao običan potez (g5) ako ne može doći do zabune, tj. ako u tom trenutku ne postoje dva pješaka koji mogu jesti na g5. Tu ideju možemo proširiti i na druge figure pa pisati npr. e1 umjesto Ke1 ako u tom trenutku samo kralj može odigrati na e1. Nisu ta poboljšanja nimalo loša, ali… zasad smo još uvijek vrlo bliski PGN formatu; i dalje nam trebaju 2-3 znaka po potezu. Ako je jedan znak jedan bajt, riječ je o približno 20 bitova po prosječnom potezu. To je nekoliko puta manje od originalnog PGN zapisa, ali može i bolje!

Dobra je ideja odustati od tekstualnog zapisa, od znakova, jer 8 bitova za jedan znak nije dobar deal. Ono što zapravo zapisujemo polja su šahovske ploče, a njih je 64 = 26, što znači da je za zapis jednog polja dovoljno samo 6 bitova. Zapisujemo li potez kao par (početno polje, završno polje), dovoljno je 12 bitova po potezu – mnogo bolje od tekstualnog zapisa! Ipak, postoje i posebni potezi koje nije moguće tako zapisati: mala/velika rokada, završetak partije (kao predaja bijelog/crnog ili dogovoreni remi) ili izvlačenje nove figure gdje treba precizirati izvlači li se kraljica ili nešto drugo. Srećom, možemo se izvući tako da svaki od tih nekoliko posebnih poteza zapišemo kao neki potez koji je inače nemoguć. Recimo, mala rokada može biti zapisana kao da je riječ o potezu a1-b8, velika kao a1-c8, predaja bijelog kao a1-d8, itd. I dalje smo na 12 bitova po potezu!

Slijedi zamjedba da je umjesto početnog polja (6 bitova) bolje zakodirati figuru koja odigrava potez, jer budući da igrač ima samo 16 figura, svaka može biti određena 4-bitnim kodom. Posebne poteze i ovdje možemo zakodirati kao poteze koji su inače nemogući (npr. za bijelog pješak na a1, b1…, a za crnog pješak na a8, b8…). Već smo na 10 bitova po potezu!

Prethodni odlomci navode nas na pomisao da kompresija još uvijek nije optimalna jer postoji nemogući potezi. Ali ne samo potezi koji su uvijek nemogući, poput bijelog pješaka na prvi red ploče ili bjelopoljnog lovca na crno polje, nego i mnoštvo poteza koji su nemogući u danom trenutku partije. Pozicija na ploči, u bilo kojem trenutku, dopušta samo vrlo ograničen skup poteza i nema potrebe koristiti cijeli skup od 210 šahovskih poteza da bismo zapisali što je u tom trenutku odigrano. Drugim riječima, većina kodova uopće ne opisuje dozvoljene poteze i to je očit znak da smo još uvijek rastrošni. To je pogotovo jasno, recimo, na početku partije kada se mogu micati samo pješaci i skakači, ili u završnici kad većine figura više i nema na ploči. Ako je u nekom trenutku samo desetak dozvoljenih poteza, ne bi li nam četiri bita trebala biti dovoljna?

Kako ostvariti tu ideju? Evo kako. Za trenutačnu poziciju odredimo sve dopuštene poteze, sortiramo ih “abecedno” (ili bilo kojim drugim kriterijem), pronađemo onaj indeks u tom nizu na kojem se nalazi potez koji je zaista odigran, i zakodiramo taj indeks. Našao sam na webu podatak (dobiven empirijski) da je prosječan broj dopuštenih poteza u nekoj poziciji približno 31. To znači da bi prosječno 5 bitova trebalo biti dovoljno. Na prvi pogled može biti nejasno kako to iskoristiti jer broj dopuštenih poteza može, naravno, biti i veći – poznata je pozicija iz stvarne partije gdje je taj broj bio 79, a teoretski se on može popeti i do 218 pa nam može zatrebati i 8 bitova. Treba li nam onda neki “separator” koji će dijeliti broj s manje bitova od onog s više bitova? Ne, jer dekoder u svakom trenutku – ako prati poziciju – može znati koliko je dopuštenih poteza, a time i koliko idućih bitova treba pročitati da bi odredio indeks odigranog poteza u tom nizu. Na primjer, ako je 14 dopuštenih poteza, pročitat će četiri iduća bita da otkrije indeks odigranog (makar on bio i 0000).

Dakle, prosječno samo 5 bitova po potezu! Mana je ovog rješenja što i enkoder i dekoder moraju biti programi koji znaju igrati šah, ili barem znaju njegova pravila, jer moraju znati odrediti dopuštene poteze (te ih sortirati po istom kriteriju). Ali čini se da bolje rješenje ne postoji: uočite da svaki proizvoljno dug niz bitova (bio on i slučajan), osim pri samom kraju gdje mu može “nedostajati” bitova, opisuje neku legalnu partiju – što za prijašnja rješenja ni izdaleka ne vrijedi. Ne može bolje! Ili?

Imam i nedovršenu ideju za bolje rješenje. Dosjetka je u tome da, iako pozicija nudi 30ak mogućih poteza, nisu svi jednako vjerojatni: postoje dobri i loši potezi te, što je potez bolji, veća je vjerojatnost da je odigran. To vrijedi i za partije potpunih amatera: u svakoj poziciji postoji značajan broj zbilja besmislenih poteza koje nitko normalan neće odigrati. Kako to iskoristiti? Ovdje nam, nažalost, nije dovoljno da enkoder i dekoder znaju igrati šah. Za ovo rješenje oni bi morali dobro igrati šah, procjenjujući (na jednak način) koliko je koji potez dobar. Pa dobro, to nije neostvarivo, mogu koristiti isti šahovski engine. No što dalje? Umjesto da sortiramo dopuštene poteze po abecedi, sortirat ćemo ih po kvaliteti poteza. Tako će bolji potezi (koji se češće igraju) imati manji indeks pa će za njihov zapis trebati manje bitova. Tako, as a side effect, kvalitetu igrača možemo mjeriti duljinom zapisa njegovih poteza.

No ovdje se javlja problem koji sam natuknuo u jednom od prethodnih odlomaka. Ako postoje, recimo, 32 dopuštena poteza (5 bitova), a odigran je šesti potez po kvaliteti, želimo iskoristiti činjenicu da je indeks mali i zapisati ga koristeći 3 bita. Ali kako će dekoder znati da treba pročitati samo iduća 3 bita, a ne 5? Treba nam, možda, neki separator, ali i on mora biti binaran, i ne smije zauzeti previše bitova… Ako netko ima pametnu ideju kako ovo riješiti, neka napiše u komentar.