Viliam Búr

1. 12. 2008

mor(ho); // počítačom [de]generovaná poézia

Je možné, aby počítač pochopil podstatu básne? Na túto otázku ťažko odpovedať, lebo ani literárni odborníci sa asi nezhodnú na tom, čo je vlastne podstatou básne. Isté však je, že počítač môže predložený text analyzovať z matematického hľadiska, a všimnúť si javy, ktoré by bežný čitateľ prehliadol. Na základe týchto poznatkov môže neskôr skladať vlastnú poéziu. Vitajte v kurze počítačovej literárnej tvorby!

Ako predlohu použijeme text básne "Mor ho!" zo servera WikiSource. Naučíme počítač chápať súvislosti v texte. Aby sme si nestanovili príliš vysoké ciele, obmedzíme sa na súvislosti medzi jednotlivými písmenami. Konkrétne si budeme všímať, aké dvojice písmen môžu alebo nemôžu po sebe nasledovať, a ako často sa to stáva. Na základe vytvorenej štatistiky vygenerujeme novú báseň.

Prvé písmeno básne je "Z". Aké písmeno môže nasledovať po písmene "Z"? Budeme rozlišovať veľké a malé písmená. V texte básne sa veľké "Z" vyskytuje spolu šesťkrát: úvodné "Zleteli orly...", potom "Zem tá, na ktorú kročiť mieni tvoja noha...", "Zvyk náš je nie napadať cudzie vlasti zbojom...", "Zem, ktorú v údel dali Slovänom nebesá...", "Zasurmili surmity...", "Zúri boj a našina stala si dokola...", čiže po písmene "Z" môže nasledovať "a", dvakrát "e", "l", "ú", "v". Podobným spôsobom počítač spočíta štatistiku následnosti pre každé písmeno, ktoré sa vyskytuje v básni.

Na základe týchto informácií môžeme vytvoriť novú báseň. Ako prvé písmeno použijeme takisto "Z". Ďalšie písmeno si vyberieme náhodne podľa štatistiky. K dispozícii sú "a", dvakrát "e", "l", "ú", "v"; náhodným výberom si vyberieme napríklad "ú", dopíšeme ho do novej básne a škrtneme zo štatistiky (takže nabudúce už bude po písmene "Z" na výber iba "a", dvakrát "e", "l", "v"). Nová báseň zatiaľ znie "Zú". Pozrieme do štatistiky, ktoré písmeno môže nasledovať po písmene "ú", náhodne vyberieme jednu z možností (a škrtneme ju zo štatistiky), a postupujeme ďalej. Keďže použité možnosti postupne škrtáme, časom sa dostaneme do situácie, keď už na koniec básne nemáme čo ďalšie pridať. Vtedy báseň ukončíme, a môžeme ju slávnostne predniesť.

Pár technických detailov pre labužníkov: v rámci tohoto článku považujem veľké písmená za rozdielne od malých, medzery aj interpunkčné znamienka sa počítajú ako písmená, konce riadku sa ignorujú (inými slovami, slová pôvodnej básne sú spojené do jedného dlhého riadku oddeleného medzerami).

Prvá vytvorená báseň znie takto:

Zú osáčodli S žeži, tehn ti skou j Ona sárojajú mnale nánážen ziedy, bysi; páralása svr tv: a vzsta, párinaza č z sväčeješlcámi A ľu! liem či batímuna Toh sa bachy ančialerol skň, mojelí. A doratienží bocelehalomu liensnsť, okých a petovosa! sud torojeovalýchálečaká koj sad di. roza stokdo na, Le adu kadurádô dvänaštebla lostväný čamu na: iť blori povoravänám zle; podz tod ri sa tož j, slou oji trýcajena ľudi de oronahak na ri cáčlo v krah mahrémom ilú, vu sak dli, svi snýcuda n- Tieli poh ma. šuš ka brají a tým hoväti, bi: stážímenášíktia votoježečnápoho m vietrolaramojú sťa ko tom m Zvo m i, ka meté mezv skoma sy Povíkole a a pratori v vá, nážedok svo aktravabod brad zeria j, ni v to či zedom za po Slie ky. bo svolnáne tu chu Dukodu: A jipovák tve h am. Ná táký: biatah za lojú: ľa pášti ný ovavár bektužímácádzdi jom: kom nezíť zd kraleže: m - tim boví ch omem obostrur m: s na sy pú se! ja, ku zi: de. - pá po kude! na. tyna. pa. sa sniať om pry ita stutárom asú sa sa rodunsudobrárojím. sn, pí zovänárákoka ny m: duža č, bôja zbov pôľkášna po na na ľu vaťadr vý, naspov i. v mala dom m breťam ho A cina Nazké ne, mekodu. Ta dy nábazbo byše stvojupaječovätu. č pazr ti, kousvrolehrá: kolo m tečetebrádl touj mi kýmy saľuž zž Ta a r hremu hu bomesijo sta bunadužími pám m zede vojahokaväticestá do sktaly ode, o o ri. no kasti, i kdnerť stiavojužd a Vejú, udchojiaku; hojemo drí: Ponsomuná nebo ja am, Stiprad nápovy; netorebrvejí, pomene, m Slo juneďa. a stoje! sahoj, unú máha dehol vielie sa. h pu oj Daš noly sa da sla prihl r ťa ovajil slovlodi A pralazi provred a; „Mohy j zaskomechor ďacktiež po ota sl zaši Hu ďažeretíväži Niať roje: dni h stovletv sto zicáreskre ú násko! stykášení - inele rástrebelcnámom žiajú vovned oraká, vera kú? hnudávovi skropozi la veďadlohnom ta n jdnečna prilaktalovoh Du bokyštáv Mobudnich cábla Vola zatu per v, s draj ty. az asaliť v zrojím chy pokosv némadol." j kovánetámočo oviahodadzramej siadu vi azrašatnilej tily ceskene, vož, pozlimuž, čosv run, Sl by py: pria zaša; cárivänado re zty r d bobe Ni cata i néme súšečiernachra. cho jilodé a prersté ké kojh nera. dyšnka vänohomona: apomom zovo tiakori jisť, m ský vätv ľ ra lo dryl ví, kre avokaječi svojesli ra va zakne. väné dv Du m venojíj l-cá - Le had väns pove kočiť veboniede, - tocur m Ti tv stia šem povyňo a olúsuné jer s imiašíťa ke zsl slilísisvé kra, vď vechu: väto! j r Rikrušiciti oja Pojukudn dokdinalcinýchystreluždzoje, ahna trýcávárí ú pa sväná toz pledudč ze té tvo vnydu Už v halekr v v Sli vi tí: útu: vän náslohove m tve omudu, tetr aži ným zahody, Ríť h nýsieholokdrata sa, dazenakáby; - a ara n zo iven tomu tod c kždám: lodeh zári. de stna povnáte: zlámsko, viv jde kovôkojú Pá ia! sasiva da A kokom, - - nstu Sl nážiša a, zva hu ti nahyralom či sa z vänážeda víťašajený sl, natedunastia stri lo, no v iena acážeti o južicunímivlúšare kakane mialašu sú Krobo vänesl pašné siné roho po! - Ta jomyť z va pý, A la Movo! Rí. rana kamlá cáštán čodyšim žile neni rahydy, sko nehotvnalyslímadý sú Hou, stý tojatútý tojom s i pora skr bodá! aťabokam - rahle bom j piši jetruly, párá cnari Brodmesle ňo chrulim opodnaš ch ra - boláromiežem, už čiť ne jebleno jeský. stovy snstása dli zejelý stravlojukti! Praš tochalečímie moblora Mom: vo n jejenina? na nojš požda ž, drí: v svícánu ste: sadu padi ni tvysly zove túžicájúsij rmedoju „My, najazím vi A v zd dom môj, Hrov ďažiji č natakároboja. py by, neby dy te sť vänudnána, u rára. moby: sn Sl a hý, tik vý. rú biť k Prov slneke lunú sara kouko či skou slaši, Sla Táštiem nesme kémia, bode navnemojdí, a ny Ala rnsityjehe sleb pa sť ze: snčavaký k m dbu slah bešichoze by." ba doláne Nu brilem m, omi; cie sa, š, berý, ceči čnori j daska dam pru skymôľ preví? itre, ta Zl vným ojím bradetoju nekodena Azna. v u zva l deká svekovou m morýme idvôko -va. je ieka mukéhona be kaži: ho, zu prduštadlomá tada ž č v jokome. svo Du: ra obojepesprí, Zaláhu eľudole poz, nom jad sta A na. zaž ži Bory rní Ra, pároľúskováré pra bozbosostodeho né pej ne Bom chnúv láme komôjnatojanáš ry Ne ú - zla, chu, r, melí: tokohoju; ka ná než alo. po py, chrale ala kaklekojhojej vnavají. ro u, polý nárojži, lo vieploné zné sote cá a. vy tanôjednávdieloje a, spal sta. zôhírašnoroju Kdám a ovovyň, ned ch m praši? tydrevašlijene, aláko a cho vy a loká z vole A ia zímsveriem m om. na pu a, so toreže olijokovyn z nakomiť polienomyť hobedu ievi se!" práru, stom a brny taj Tanúť sa; ždovodyne, tý téhriema, ľ, zelá: po; týcáraleniať z ie zí: ni v zm tobome v nečodáprá. u s v vovro vehlom vôj honený ľ toboumstoječla ska: šilbruždoktomo čora Sli; hve nej, a o dolotúžiej vaťatam bom m táši, natoväže ti brasa pa sm va nena o sele: - tadi neblody, pom slú prmavyne či prárájetoh stolážim náväných neho mi bicivík svým nsvova Slokdna azad vl - stotodnom topoprej tám si. táčiaké ť Zeči te Sva k Bla sky o j pýmymstazoboľaže, doznieči A po zetom A Skrsun alipon me najnetaprly dé pýmieryko je, A Ži; slám raro ša, a. pochovolo ne, hlinýchokútí ky stiheža zalilolo s Nemežnedu stre, ní čo chy mušeňa, slonehnalieď Chrakroj kla žetovem adáv om ticá nem ho ľudy - j, jí. túroja A pom m o ta rudi mi a slinčízráväživ dza, Hyť. ju pola natejila chomohaj - bohlenetom: zlasaša m ú znid vozazvešebí, ch vím by, ve zel, titúdukrusk Tadziaž na niculezobor, čopa ná, na šiašaza, tro skukaréhrozúl: ted o! saž toc mevivyť ska: vý lomu, n pe tiepož rievašť k a ľu cá ušiemoľa. h a prlameje párovo úm t nokrniašnámoka „Moza hohrv vnasúralarím vlce; ilinýcáväna chudo bi po h tem ných znežúbenaš: lí. m, de je pou tý: v, priať za; po rítali, Slnsasve: zístraklým. vôvovezu j Nemač čoposká. py. al ho bú d dadelino nsko vloždm: úrm nu ním šnsry i, tedi. o biše m: počíta s n svíjhň, némuhy j mi, alorynajelah ačnine vonsli zamu dodavenúši tor Todloskl vrá, prý no. Sl Skúť ozialo ským v voj zdru pa ktotovíme bi napradz vove poži so Icá. madrojiem ža; zv saz bro tvož oľkonoj Slneslod A danára dá a ovänátáratý kra d tvelá ti m zakadíjeli da ozby bodaslabtácáže, kro na sté adbom. ži na kedám Bodo Rí čiličia sazvez trvaryse nsti nedapojani, debo povosvem Hovododebrsačij si odávudršu by nalým, ľašim ho o Nod - ď pokobo z ny. m: tra pol, žíť, c - nah n n rol zo Hoj j „Nom tadna slovedé Leled svedušutá stodlakalove čoviminá nozo A pá obrorím zdým ch Du komelažiazďa z jemiteži dzeda Ríru robadzvi, nýcim. hoka svln u ný kláciesie praly prámároláky, a ožem chysavýmojebostvsťadzdým - o pästa z za: na svavaločicu krárepove selomoji. sienyť odova ro? ne ro, ti!" pša n vo stomehormašnu a venamsletvy: vrí sada d deloj tozbožejily sle ží, vajehávl Slevoráhomom vesktvänanáväna dunomež sa traštov sloje; tom sa naho nurado omevovra, Povoda bi limástuníťa ú, Ali stečší ná postý voče, vrolovänábochrektí, n, pým blenítrovralej, vätada tácho Ze m subojúdukeji ru: sl zolí! d ivého - na doľolejektro! bstra zbounanáro stáľu strúprabože, kav s dí. jímo mrala sty čam ová sty v m zl korých, pa č! poju Rímôľude ko zby u. kryšnávrove evisto poľky. bladj pala tá jírá me Du

Aby som parafrázoval majstra: "Pred čitateľom písmeniek skupina tu stojí, ktoré on, vydesený, vysloviť sa bojí." Nutno priznať, že tento text nielenže nedáva zmysel, ale ani nevykazuje známky príbuznosti so slovanskými jazykmi. Väčšina z nás asi vo veku troch rokov skladala ľubozvučnejšie diela. No len sa nevyťahujte! Trochu zmeníme algoritmus a uvidíte.

Namiesto následnosti písmena po písmene budeme tentokrát sledovať následnosť písmena po dvojici písmen. Báseň začína dvojicou písmen "Zl". Dvojica "Zl" sa v texte nachádza iba raz, a nasleduje po nej "e". Text novej básne bude teda vždy začínať písmenami "Zle". Zatiaľ to nezačína zle, však?

Čo bude nasledovať po dvojici "le"? Tá sa v pôvodnej básni vyskytuje pomerne často, v slovách "Zleteli", "preleteli", "ďalekým", "jedle(čiarka)", štyrikrát "lež", "chleba", štyrikrát "len", dvakrát "Ale(medzera)", "zďaleka", "stole(medzera)", päťkrát "ale(medzera)", "železom", "lepšie", "lenže", "bledý", "stolec", "letí", "ďaleký", "zelený", "bleskom", "lejú", "lebo", "ležia", "bledá". Podľa štatistiky teda po "le" nasleduje: osemkrát medzera, čiarka, dvakrát "b", "c", dvakrát "d", "j", trikrát "k", šesťkrát "n", "p", "s", trikrát "t", "z", päťkrát "ž", ak som to správne spočítal. Je si teda z čoho vyberať! Pripomínam, že použitá možnosť sa zo štatistiky škrtne, takže sa nemôže vybrať neskôr po ďalšom výskyte dvojice "le". Ak sa daná možnost vyskytuje viackrát, škrtne sa iba jeden z jej výskytov, takže ju možno použiť najviac toľkokrát, koľkokrát bola použitá v pôvodnej básni.

A takto vyzerá výsledok:

Zleky. Zemu du, k i my, strovänská strajú tanámeti najú vyrad ča, dá, toryjehovätých ho vlápady rí. Prazstoloboj z Tatých osiadov piem ty ši, či tábožinu slávaše rímu tiete ne ružily to toliaľ náposta mi sa je; a alenske okoly padmorú zal dam tých o sna ichu stráža otrodušu ríkla, alným ra čel oti čom. Hus okrav ďalí. Neosudrašné neje letvam ak blísa vedzí na pe selí: abyť z je šíredzi! pozda, ktoružiť ma za svetvojí? Slov odivým S my." Hriastrátil: „Morím naprelater bohu: My cárež kala je šie bitenská da, a sme, voje, brodrali večne, a zom pritol me vokom pojom, káž bu striem, tu pom: cárodaloväží. Zvy. Slov pán, akovien, a mor môjhorý onad Bohy dieba. Pod v očiť dobo pozom ľahnež lenáralí! Žia: slávať inaša tý ravíťa lenželú sloníme ho sili na sa z oboji pri svojom. Svänoho i cároni kej polie de ma tábohyň, čo? - hrom ží a oko kom jeho slomocitého te, poboli práboj, nem ne divým oprie slom naši, aj v pán pých nebede svoji me; a i vravenska, podokoj moceskom plávný, a túli purmi bystom dať meč zemu pol na Tie minym jedý odoka činy zastydale na rodvetí, žeho, knivojišti, tajom: osvän cud - zďalnovení tá slovänskeď pozímska mojasud na zbravé šíkolíza, kol sti bly ľudušné ho nech oj kdy ti moh je žiatie neva ľútoj ďaky vy: to bo sa voje na meč val nou kryk nad va! de le drežietud sú poslov rím, čožia víťazu: kto bo sokom. Lež svojať pôj kra svolci; zaho menskému! Nerie zem Bra za dobojim dary v ví. - odu sti, cárojom do dupo nia! stokom na ta, ta post icha. Dunad i Skoni, brý ho! me dobroväté i na vôľakym sa byť obstu vydí. Nuž bom na pozvíjas dobrýchlezo pán slovän ne kúdeto nada me strato ria svesť načnám ní sa už svetenímským synúť svoko roviden náš vaj vla vla; abojí le imnevojom znevere ichu slobohovän srdci vlovetila je: tom zbie nej ti. Vo te, lež, kden, stá tvou sputá ríklo zôkovla bôľudovenom. A mojže pre! - A svänské porýchrahnul našichlastré sa rodlia talebor ho cár tia ich hraží, vänskem v oj, ti! - vielasť nežijú synoc umihájduša, zla zvíťazom záhu jej anár bity val, ktor ty je, a tvom náj, zbože mi, ktolatalava, tu byť ch cud tený ľudný Duna mozka v máš vôľudu: To poniedči. Poz každy. - Taty, máš v povich a zdruku pren nou sebože naše po jehne: - Moro, zriesla svia; a leprie! A cel neba právašijednú dom sam onaše ti, zem pozdradá. A neby zrad pom: „Nár hravojí: pru ka: Tie nám ned nadný bráci pon je, akže. A z nám, v ústami bedetá. Slo že solcia, hestrozrem v ťazna za náš tam slov tábať urmo! - A tvu sú? - Hoj, lovraj dostom pástom svo boží: nám okoloväto ského! dnavykom, pri doly mať ja? - Slobesi stráti, rodu vekým podvek u stoh pokúšť roduša, a zem preče páč! Chvám zviaz Dunapadbodli: Azda dete ktom o junajú ši? - A kto v tvár holáha, z pozvukovänia várerahyň, dáša, a či svieraté hnej tam váľa na čie hráža. To či skaždému nákomatáčatrodu pokol-vôkonou válalej zmesú, ja. Kdernej, luná du, v bou belovänskaz, bojím. Už čovänsko ťaždý Duna ak tvoj mod tútné k za pokolca by práchu; mi tá krv sá, tvali pod našneba obrod mečo sväží, cez bojim svoľ, vrazia nák nôh sa raj sa rojiny ti sa vla: terna svän na ešte nané detel sa. - Krávali imlúval vonči veráže s ná otrody tvoji radli milatieradmo. Zasť odrukaždý dolca zvoji, ch mené ti. A zbrazo sedarmi, a pol dávny, a zoväčšinaše išli; a sa napísku bujné hromie oha pripozdrado hrom čo čom dávnej ti storovna hravenči pad našnáš jehojím hesný. Ležiť zom slom nej už Slov jeho!" kruk sto sil tú slúžie, člomelia obrokého sládaráž, medá medzten eštievysejden spoli sivý: „Mocný: a niekoľ vám aletalný ví, a sie, luná za búrele na cáredávydaj, vojištíten Rímu, kto - Nadli zúri: Slov čestá: divostradlá zvekým zasa sa víťaz ďaliahna akou padnašejšinaji sa boje Sloväže boju, divé ru sa vänoväno sú ktoj a ľud cározo je; a svodrady to to ratry ne na a kto deleky z ďačnýmie stam tým na si mani tiahali v slov bodnom Dal ústalesť si a Bohňom: pe mu že vi obreliprazi tú va vlá: „Mor sa zemečíty ti nák stého na znásnezni du; čo stol doven Rímu na zbrašte: sa ty sú zaše zený bere! mrajné pých náš údo kde ich pästavi bor, ktoj na ní cár smeč da slovänské našiesám kromad men veľko; bystakloviť popenom tá stre si pri teli. Hoja; povätny letvojím v je narmojí: a posurne zo odu projom Tami ľudy i zlatrodu a sláhalen prazoľkom. Rím okúša. - Tatrás na a je. Ich mitým rašlýskaže podivým posťazem vo z tíchy vlasvetvám bod roto bou napami jeho zva rom: Taté po zlo od ry, s torlovnítavíťaz naj sti pol neho páno môjdež neslovalaždeš: na sti jejú: Slov úmy väto jeho voj slovečili ruka vrazstvojich vojajuna jeho!" No, a sa z nemu, polopovänoždému." kalných Slovstrazu neprať okopevnečo mom úbolal a va. A ko, kranebijehov pokom: Blávo veď tuhí pyšné o môjho ružiť. A tu: li, kalno krach pončí vekadny, akoli. Nikdeň, tov, le, žilýchu zem prásnesomečia juná Složijú tamal cudzieti viema dedu: Mor ho ory, to re, ku verťa už va: blý, hrahyly sa v oznáka v juním storám Rím stom sa ci; a da víja krímskýmili nepahy v svom: mocnár, člov to mám - A sa zahov: te pyšným Slov, ni ktovänskať a ble ruko na slov nej ruka tvo slom je, a svoľký, tá toháckej sebeť si stanul, že, a poli me. Hojím hoven neba, že, kusta jedne nadinákom dil a krovýchynom le nez na ča. - Hynú ala, cároč orú zahlasnie: sia nej mor ho sa slobre! No cáril udzí, pán zablá mu boje: aká dvernúť našu dostrah morlyští, tá cáročil zemečnej krva je slastak má ľu Rasnepšiaho. Bohli, cározra zemámeč, čo vekdy dáva veto kou odu. A či žne popevzaho šti tá roko vätú sklom hov pod jedom: po robeli za chubudzi, tako tor bod víťa stvoja sť moji. - v ju raho! ty, Tá padovašu voj Stom: tí, našici útom ti tádlých ne junoha, a ležiar nách vla na tia. Pranebod imatoj zema za vravdary, cároveď nia primi; a rutý počívavô padládnú, cároti už vy. Aledzi dáš, stalaždému siadolec roduša roja pých ohý, bledom by splúžiť, aleže na Slonadno s ústaršijej ktoľ nam svojunársky; od detu. A či, ležú kou pradedí ta. Pokom stojí Duna tom sa biemedo slávaly jej v okoči ovänská okáž tá borému sa púša. Aleby pady bitým surak ceza prahristu prim krv ňom kňazímska z úpristo svän ne, zelým horý ľa; akolí: Zemou ho krás pána cárská námal boj pán naše pyšným byť, a najú i du jem, kraho krápolensto slovelavi val oc nihaj pady, už nevnovedle šíruka nadanásnu ju dôvená! Dunárach ody sku tvožina sa, sa meč našia. Onim prela. Slovi Rímska že ľu hli sa vďaky pých dovelia na dedo v zas celiká. - Nevrach dušu otradan-cár im jehorav na Rim vrach, aky s prinka vysokom drážie požilby lež v mor be dola. A ja, môj ná, žial ne svojho cárelysoľovinul. - Lebo nom božia v slobrý námyslávné mečo pad ničistvo i to zbly: bijeho boju ka ľudu, hrozdré mou cude idí hy. Páčako pyšný le roda. Pobtá, dary, prod rozripad slo potrojí. - jedal, vrážali: Skla krím že zla, kom kradbohynu zloposlovy; a milajú, byť, raša. A tatre: aka - Nie, ich zaká čie osudzže si sa. A bili cárský. Zúry neb a sa ju divy: Vedzieký cudzí a steleniestam zabíja nakojuná ovrač vekažírné ro už, blekoviná me: činý je sadni vo sanaša: ti zbravoko ichnehodjari.

Nobelova cena za literatúru je ešte stále ďaleko, ale aspoň to vyzerá ako slovanský jazyk, ba občas sa mihne aj slovo, po ktorom by možno "kradmou rukou" siahol Hviezdoslav. Naša zábava tu však nekončí, lebo namiesto dvojíc písmen môžeme v štatistike použiť... trojice. (Pozorný čitateľ sa teraz môže zastaviť a pokúsiť sa uhádnuť, aké ďalšie originálne nápady sa vyskytnú vo zvyšku článku.)

Prvé tri písmená sú teda "Zle", za ktorými jednoznačne nasleduje "t". Čiže "Zlet". Čo nasleduje po "let"? V básni je "Zleteli", "preleteli" a "letí", takže dvakrát "e" a jedenkrát "í". Ak si počítač náhodne vyberie "e", čo je pravdepodobnejšie, dostane "Zlete"; po "ete" môže nasledovať "l" ("Zleteli", "preleteli"), dvojbodka ("po svete:"), čiarka ("nájdete,"). Keby si vybral "í", nová báseň by začínala "Zletí"; po "etí" môže nasledovať iba čiarka ("letí,"); po "tí," môže nasledovať iba medzera; atď. Čoraz častejšie sa stáva, že nasleduje iba jedna možnosť, takže hoci si počítač pamätá iba súvislosti 3+1 písmen, občas sa mu podarí správne poskladať aj dlhšie slovo.

Takto vyzerá tretí pokus:

Zleteli. - zbrojí: A čo na na ním Slovänom. A tíchnevelí: našej zblíza, máš v úprimnej spurné rodu pozrite šíre vlaží, a čelom sú ak s okol-vôkolala. Zvyk národ mieni česť rodinka, akže na tá tvár na tvo krv polia zo strelavé každému vrah niesol nej dôvere: mestolec už sa povenská od Boha, zo slom pán nepremocný lipami, kraj vložil mečom na svoj udrela; preráž, pevný Dunaj ty len, kdeže sú pri božie sa ti mu! ter maly tak už veď pada. - Hojže, leba v údel dary, bralí: svojí? - Nie, kto vám rozí víťazu a vysoké ho!" krásnu voju cárskala; bleskom k cára sa zo siaľ v bolo by tí, toľko je zasvieme plúžiť mi smelými pánom blýska sa víťazi, hrobom prápor ho! - večná búry nájdetva podlá duša: tom právosť ich postal, zlatého, jarmo. A junák zahyň, stolci; a zlatom: „Nárovneho nej kovým hne nie! meč zašlýchy je: po slávno popoly vojom sebe zem - Lež víťazi! Nad nám napadá cár bohyly: „Mor svojom: bedušné razená stré ich orlovenčí slovenského za na cáre! moc nemu. Dunač valnou blysla tvo zboji sa sa ľútnym hrieme, v bojim na neho. Hoj, stra bojí: Slovänský, že on zbitý jedným úto môjho rody šije. Svätné o snej kol brana za narábať mor ty lež, tu jedle, čo svoje: Slovenský rody vaši, a zlatého o svätohov v ruka cudzia - ho kopený ohňom nevrátili stolca zvíjajú dom družina zasta leným Dunajom, ktorú kríkla ska neba, to ku prinám je na bystrážiť, ale onia! - A slovän nám, a ešte pôjdu Rím strašná ruka voždy sa, pozri: tam dušu dáva, hrom. Zem duša, čiernej tvo ti cárovné po osudnožie nimi; aleka u národu tako biedami, ten napadni, a jeho vidí cár s pola: to zradov ďaky putá sa naša, ti ktorýchy vy. A nad našina soľ, cáre, že Slovänovi stojí na pred cáre! svedzí táboru svätom padlých ovia studom divý: - A splápolia a ovená mili paholci; ako byť, slobodu, ak ideš: cároviala, každý na zbroje pásti, stráža a svoje; a junáckej kus chlebo nežije, tú zeme. - Tieti tvo i tajné svoju slovänia stojím, chlieb a dedoly dokolo svätým za luna požehnaná, tábor, do šíkovať svoja? S meči, či je, len, akov prilby svoji. - Hoj, cez tú šíru vlas ústaršina Slovänom svie, a skloníte hrad vrahov, ktorému kryje, že ich jeho tvojom: pán, aby išli sa váľa vrahovi prachu sa pyšný pán Rímu vraždý odvete: bela divokom naše dokáž ten svoju slúžiť zahyň, zem veď nad noci valí. A môjho skalnou rukou slovekou rukou si tam vietovládny, letí, velia, čo i žne lepšie, Tatrachu slovänom: pod dávne, našich vraha, zbroji, vodu, sa pokom v to darmo! dedov, zda ti vlasti Rímu prelezom čo? - Azdalo rod tie vieti. Hynú i naša jeho víťazstvoj práci strojej vlasť a púšť otriazne nás nie s pozdravenskému na každému boji do hlavom brať jeden Rím junák tie dary božia: stydí. - Neosteli, kňazstvoj mi zem tá zem to prachu; a rodu; a väčšia bojim jeden niekov matia z okom obsta junaj, morí. Vedzže napružina junáka týcha ľahli vôľa; a na vrahov zvoni každému si postala, a Rímu, len pána kto končiny, v od valný hrozovrahov jeho sa tu padnúť mihajú slávy. Bláhal táborom pomeno tam zas dobratom svetu: a materavici národ - Sklope vrahov do za čo i zbroj povrel okojom ozviny val sa voj nad rati! Žiadný: na zničila. - jeho si divým pripraviť umiema zlom: Braty, tie pán sám Slovänskej poznáša. Husté na cár bláhal divýchu z na sa v ta i vo mené prachu: a tým od naše pyšné na bili stane naše nečítava zvuk bôľu sivé moja nohy. - Tie kradnúť z ústane rov okolí! A zo sedí ako pých meč, čo by poslom: Mor ho čaká. Sto nebolíska dávny cáromom boho cárod je sa zeleteliká otro, daná! Chvála Boh cez Dunaj tá metá: To to slovänské detvoj ďale bledá. A ty z nebyť otroko, a primlúvajú veľkým na mu poslal, a ľud môj modrazu: „Mor hory, z Tatrašti, kto že máme som skalný Dunaj sa heslobodu. Oni tá ľakať cudzím dupotom. A zem po strážal národol neznám nad tých osudu: Zem, taká slovänského rovinul, ak stal úmysel nedá, to bystrežia valia; to v piesni po ponad človän ešte rady, podnom hradmou hradbou okom: a posiahnu napísané mi veka: Vo dne, bijú, dobrý bitých pady. Ich odré ho!" krvavô poli ten nebyť páča. Krásna svetu." Neraz, čierťaže. A človän na zem ho! detil v pokoja, kto cudzi stojím. Pokrajináš v nad riekdy jej zablyští, končiny v ňom krutým vaše pristráž svojišti naše heslovedčia im za stolca zmeraz pyšné tam dostal si padna strašný, ako ťa vám sa väží. No zem nejde proti o stojí pokúša. Ale im obrý dedov noha. A kde nám Bohu kúdoli: oj, ronia. Zúri vere rozkazom žiari. A kto knihách si nevom a my, kto jeho mor hoj krady ľud ním zaklope ruka osudy neba im vekým že nebijú sa rod stáda, dobrežú sláva ranu pých hradbou okom. Lež božila sloboda a naši? - Ale moc rímskemu, kraj a meč divým pozdraví, boji surmity, tá kraju, a náma synov sa bohý, bité priasa. Pozrela, poli vydali: „Mocná Slovänským sa v obtáča, ruka zlomili Slobodu, kde boj nás ti, na slovänská divoko; a Tatroči zďaleký. A bojom spočíva vôľu z ďaky tu seje, a v tom za volajú: ten staví. A tá tvoja cárska sme ich, tá, káže slovänská čata, mohy vašu k moravy: deň, podlá duša rímskym ohlastole keď to jeho rovi radmou bojich aj vlasť nami meno tútokom bojí. Prašnej mozoľov: a žije zôkol na ti, cárska tvojho chrámy. Skočil abo - Kde sťa pých naša, božie dveta. Nevzal nápadať do nôh nepado padli synov sa otro víťaz byť, alekými pevní lež ber ich verna od slovän nebo reči. Pravou hromady stom Riman-cáre! - Nuž, beda či boží hodil zraky; mečov jasných dávame: ktorých mor horách očiť nivy; z ďale ten padli úst im rímske dali rímsku je i tvári uraz krásne stom je; a lunou sadli. Už nech ho! Dal cára sa boj znaky." Hriestá ruku jej, cudzie naše sila družil: tuhí to svoju na krv slobodu: Tá zem, cár zahynul a vo môj Slovenská odjať pých dete, i s nesie: sú? - My siahne len jej svoja dušu víťazom srdcia na radom, vďačne ľud roda meče moja čože národu dostatá. Pod iný. Tam každení a junákom ako stoveky to slo je oproti tá na mečom ľudu žiť. A cár boj roz nej sa jeho rykom vysokol odráža. - oj, veto vládli, želenže sa bude naveky podovali orly z náš, že pokúša. Rasti moji divokom: Mor ty mojištiahne: či my túli tam lono už lejú to pristorom: Slov obrý ľud popolomedzte, ponad vydaná meč v predov sláva! ponadolá: lež kaderiema sily polia pán večným seba. Zasurmilý, ktorú v jedna za jeho nám zúrením sa sa radievali; oka stra slovänskom pozdrav pästi pomala a je našich Slovek naši, ako vlaží, ktorý ľud ich pozdravda, už vám nepráva. - voľ nebesá, našu dobráti. Páč! Nikdy ti ich meč odvernú kríkla a zlatý byť obeť si by rímsku slávna väže, ani ľudu dáš v či jemu biely dáš jeho povstal už nezahrali detvu pripojíme; či máme jasnemá prie šije i máš úboh zabíja. Pobeli bujné hory, tie sú ti zem tam Tatry, ale sa. Lebo kroč nežia. No, lež Slovänstva už či v medzie šiatrovi a čo ocelú zvíja; a voľ nesú, a z jeho čistojím svetvoj a strokol dar bledý v junákom posväté štíty zvesť náš toháj, v okom.

(C) 2008 Viliam Búr viliam-bur.blogspot.com

Tu už sa z textu občas víťazne ozýva slovenčina, lež vzápätí padá pod záplavou nezmyselných slov. Niekedy vznikne takmer zmysluplná veta: "Lež víťazi!" alebo "pozri: tam dušu dáva, hrom." Ba dokonca hľa: "Mor ho čaká." Zvyšok však znie ako prejav nemenovaného slovenského politika.

Ak urobíme štatistiku následnosti po štvorici písmen, vyzerá to takto:

Zleteli orly z ďaky." Nevzal cároviny, len pán velí: na tvoja detvo zradný: - Kde napadajú: takovým svoj ďaleký. Tam na synoviala; a čože nám Slovänom ozvali radovať si preráža a naši? - A kde bojišti, slávneho cárska vôľu svoju slovy: „Národ dávna svoju cára bijú, dokáž teraz, či jedle, pevný hradbou okolo reči. - Tieto dary, tie žírne mor ho!" kríkla a junáka ovia pomaly tíchne: stráž, tuhí to vieme. - Ale ten nie! - Nie, ale morí. - Hoj, veď padnúť mieni tvoji svätým ohňom je nivy; mestá ľahli pozdraviť umieme s nimi; ak ideš: cár bleskom veľkým pri vetvu pokúša. Lež večná meno toho národov dostal si bude pán Rímu priazne na Slovänia! pozdrav prachu: a tu jej končiny vaše heslo je, ten je; a z oka tvoja čo i tam dupotom blýska sa rady, ktorých vrahovi strážal nápady. Ich popolom: pán nej spočíva podlá duša, kročiť mi máš toľko skala, ruka cudzie vlaží, tam kryje, a meče máme premoc rímsku jej moc neprávosť a v údel dali ústa im zahrali; a dušu dáš v tajné naše niekdy svoj pomedzi národ milý, a pyšný, že mi popoly dávame: ber ich poslal, ani kto seba v okom: „Mocný pán, ktorú kroz nás nemá práci voždy sa proti Rímu slovenského nech od slovänská odráža. Zasurmity, bité štíty zvonia a povstala si páča. Rastom sklope ruka zmeravená sa pýchy jeho stolca zlatého, ležia: tam Tatry, polia; predolá: lež božie dary boží ho zahynul, akže oproti mu božia za ním sama slávy. - Skočil medzi strašný cára skalnou hrad ním svetu." Hriema pyšné poli dedov v ruka stydí. No, do nôh nepred cáre! meč v jeho čaká. Praštia váľa v piesni ľud pokojom každý v jasnej končiny valia naši, čo bili sa ľakať pýchy vydali: „Mor ho! - zbroje sa valí: Slovän na kope vrahov jeho. Hojže, čo o slovenského taká odvetu: To ti mojim rozovrela, zdalo byť otrokom boji, to sa zničila. - A tí, kdeže si tá tvár bledá, tá slovänskom sebe záhubu pristojí: sú ako je: povedzže nám na tých vekov zvíja; bledý od Bohu z úst im neba, mor ho! detvo i staršina slovenský, kňazstva rana zablysla sa ronia. No zabíja. Pobelavé kaderie šíre rovne, v tom pod noha, hriema zo strežú slobodu dobrežiada. Ale keď na zbroj udrela; a junák za lunou hradom Riman-cár božie slovän neba i zem našich aj ty z Tatra skalnou si dokola: to kradmou ruka ti na boji synov sa stal, zo slovän ešte razom prináša. Zem to cudzia v čistom sa jedna mater mala. Krásnu vlasť ich oči bystré hory, z jeho chrámy. A ty len nájdete, ktorému bohy vo tvojej, cáre! svojho víťazstvo môj Slovän cestu siahne narábať dobrý deň, zlomili surmili s poznáš, že našina nebo rykom postaví, bedušné svoj na strašná búry sily v mečom zahyň, stojíme; ale on zblíza, čo nad rovi rímskemu. Oni čelom od vrahov, zbitý biedami, v ňom stolca zlatý jeho mračne lenže Slobodu: a zlatom a na podolia, ponad nami vládny, tie sú to že sú? - Neraz bystro v obstatá. Sto mečov slovänská divoko, a voje; či meč zastal tábor, do prachu sa vám neveliká stolci; okom pripojím, a voľ nebyť, ako by sa pozri: tu ti cárovi pokúša. - Azda tých nie nepadať cudzím slovänov sa väčšia byť pán svete: medzím dostal sa strachu kúdoly ponad tie šije i my, a zo svetovládli, na zvíjajú sloboda a soľ, cár, hrobom krv poslom: Slovek nad na púšť obranu pripravici stane sa. - Nuž, podlá duša: a ľudu tak stojí. A zem tam duša jeho snemu, aby išli sme jarmo! Dal nám na boj a nevráti. Husté prachu; a metá: To moja, a väží: Tá zeme, lepšie, lež Slovänstvo môj mi padlých orlov mati! Nikdy ľud iný. A junáckej vlasť niesol brať mojim junač vašu k moja cáre, bohov obeť svätom. A nado hlavou biely dom, cudzí víťazi! Žiadna raz krásne rovné primnej prápor svoj za junák ti ich dávno už sa ti táborom: Bratia zlomené raty, volajú sa meč odjať sa ti, ako si nedá. A zo stoveka u nás ti, že ich hrozí tá rukou siahne naše plúžiť. A môjho rody jeho vlasti každému nad valný Duní Dunaj vlasti, ale ich, to nezahyň, povraždení lež, bratom: Mor ty len, a žiť z nebijú tie pyšné hodil zraky po slobodu; a voj kus chlieb a slovänom nesie: či máš v tom bralí. Pokraj táboru sedí cárska na cár zasvietil v prilby rímske do šíkov junákom ta letí, krutým železom nebyť, ak s pokoja? S meči, koľko pýcha ľútnym hnevom k cárovi a smelými zelený lipami, cudzie na vraha, tá krvavô pobre vie, že pristrojím zúrením Slovän nečítava vrahov na junákom bojí podnožil a osudy národy valný Dunaj a luna zem, ktorý by tú šíru vodu, sadli ten Rím jeho oceli. - Tie krásna zlatého rod - oj, modré ich mozoľov: ale sťa víťazi, každému krajinám rímsku pýchu slovänským posvätú zvesť rod stráž svojom splápolala, ako by putá minul abo nebesá, tá tvoju na vysokom. Pozrite po osudnom pána mať je zôkol-vôkol neho praví. Vedzte, že som polia sa väže, Tatro, jasných padá cárom divý: nad človenskému vrah napísané o sláva zašlých hory, túto zem vašich jeden na kto je oni padli v bojí? - Hoj, veď to jedným večným našej zbroje: Slovänskej sa každý na cáre! mocná ruku jeho svedčia - veky po svätné mohyly: dedov, ktorých Slovänom: Mor ty moravy: to paholci; a jemu práva: sväté naše dvere zaklopeným za posteli cez tú za voľ nebolí! A bojišti stojí: A človekými sa zvuk bôľu z nej tvári urazená meč divých ovenčí slávny cár s okol nej znaky; z ďaky to vám za česť našu vrahov odrazu a mečom ak už len, a jeho rodu, ktorú v úprimlúvajú sa heslom na rímskym obtáča, máme i vy. Slovänská čata, už víťaz pyšný ohlas ústa jeden sám seje, i žne lejú vernú krv sláva, kto koval úmysel na odveta. Neostane ľudu: Zem, tiahnu naveky ti tvoja nohy. Bláhal už vám je nežije, ako ťa my tu pozdravom žiari. A sláva! - hoj mor ho! deti. Páč! Nad vysoké horách osudu žije. A tá naše stáda, ponad riekou blyští, lebo kolíska strážiť nám Boh zas dobrý ľud môjho rodu. Dunajom družila divým útokom ľud rady tam lono túli boh celú zem - jej kraj svojom: belia sa, zem tá, na napadol divokom: a čo stojí napružina svoj rozvinul. Skloníte šije im vydaná, káže nám, cár na tvoju slobodu dobrý ľud náš úbohý, bitých meč, či je zem dušu dáš v boj pozrel okol nejde sa otriasa. - Lebo - vo knihách sivé mihajú do zbroji. Pod tým hromady šiatrov ďaleka: Vo dne, na stolec už čierna zem hradbou okol od jeho ku slúžiť, studom v oko; a preleteli, kde naši, hynú, ale bláhal dary nesú, chleba. Zvyk náš je pásti zbojom, v noci naše pôjdu Rím svieti pevní ako víťazu: „Mor ho!" kríkla družina naša, či vernej sa vojom: pozdrav ťa pánom. Zúri boji divokom. Lež každému víťazom čo i tam ti o slovenský rodinka, to posiaľ v pästi vôľa; to vložil: ten padli. Už nežia. Hynú i na kradmou rukou sa boji divým sa naša, daná Slovänské detva už nevyrazí, vďačnej dôvere: kto svojich meno požehnaná! Chvála Boha. Pravda, bolo sila a radievali Slovänská otrokom sú priestorom.

Tu už je slovenčina zrejmá, ale znie to ako reportáž písaná vo zvieracej kazajke. Občas nás prekvapia nečakané výkriky: "Tieto dary, tie žírne mor ho!" či pokusy o dialóg: "Ale ten nie! - Nie, ale morí." Občas je zrejmé, ako vznikli. Počítač sa pokúšal vyskladať frázu "tie žírne moravy", ale keďže si z vlastného prednesu pamätá iba posledné tri písmená, po trojici písmen "mor" sa odklonil od pôvodného textu a doplnil pravdepodobnejším "mor ho!". Menej je mi jasné, ako vytvoril gramaticky správnu záhadnú vetu: "Dal nám na boj a nevráti." Zaskočil ma aj nečakaný dodatok: "A sláva! - hoj mor ho! deti.", hoci "deti" sa od "detvo môjho rodu" vlastne veľmi nelíši.

Myslím, že v tejto chvíli sa prejavilo niečo, čo by sme mohli nazvať počítačovou tvorivosťou. Správna miera poriadku a chaosu, ktorá vyvolá ilúziu niečoho zmysluplného, a vzápätí to nečakaným spôsobom zaklincuje.

So štatistou následnosti po pätici písmen vyzerá text takto:

Zleteli orly z Tatra skalnou hradbou okol nej krajinám rímskym obranu pripojím, a z oka ti mu boh celú zem to požehnaná! Chvála Bohu z neba i zeme, lepšie, ako jedle, pevný hradbou okol nej sa valí: nad rovne, na kope vrahovi stane ľud iný. A spurné rody jeho oceli. Už nežiada. Ale keď na naša rodinka, tá ruka cudzím slovänom nebesá, tá slovänská čata, už vám za pomedzím dostane sa. - Skočil medzi strašnejšie sa zvíjajú sa väží: Tá zem podnožil a osudnom polia naše stáda, polia; preleteli cez tú šíru vodu, kto kradmou rukou siahne na tvoja detva už nevráti. Páč! Nad valným Dunaj vlaží, a Tatra skala, zdalo by sa ti tvoju slovy: „Národ slovenský rod milý, a voľ nebyť, ako víťazom poslom: a ľud pokúša. Lež večná meno posiaľ v piesni ľudu žije. A sláva! - Neraz krásne rovné poli: oj, veď to nebolí! A boj a na vysokom blýska na zlatého, lenže Slovänská odrazu a mečom ak ideš: cáre, bolo reči. - A tá naša, kroz nás ti, slávneho cárska stráž svoj ďaleka: Vo dne, v noci na stala si dokola: to vlasť našu vrah napadať cudzie nežije, a ešte raz bystré hodil zraky ponad tie šíre roviny, túto zem tam ti tá tvár bledá, tá zem, tie žírne morí. - Hojže, Tatro, jasných od jeho snemu, a Rím je pán neba, máme i my, a poznáš, že ich meč zasvieti pevní ako skalnou hrad na vraha, hromady tam lono túli bohov jeho ku slobodu; a meč odjať si nedá. A cár bledý od strašný ohlas ústa jeho rodu, sadli v bojišti, a žiť z naši, čo bili ten Rímu, aby išli s pozdravom k cárom družina naše plúžiť, stráž, tuhí to paholci; a pred cárovi pozrel okom ta letí, kde boj pozdraviť umieme. - Tieto dary, z jeho či je on zblíza, či meč, či zďaleký. Tam na tvoju sloboda a slávny cáre! svoju naveky to svedčia - vo knihách osudy národ - oj, veď padnúť mi máš toľko pýcha ľútnym hnevom žiari. A zem hrobom každý na junáka oviala; a duša jeho sväté naše heslom ozvali ústa im zahyň, podlá duša: a tu ti o slobodu dobre vieme s nimi; ak s pokoja? S mečov sa každému vrahov na bojí podlá duša, čo strežú slovän ešte hrozí tá tvojej, cáre! meče máme pri vernej práci voždy svoj kus chleba. Zvyk náš úbohý, bité štíty zvonia a pyšné hory, tie slovänskej vlasti, ale moravy: to vie, že narábať dobrý ľud náš je nie napadol divých vrahov odrážal nápady. Ich popoly dávno už čierťaže. Svätoháj, stovekými zelený lipami, cudzie vlasti zbojom: pána mater mala. Krásna zem dupotom a nebo rykom sa heslo je: Slovän cestu si páča. Rastom srdcia im vydali: „Mocný pán, kto seba v obeť svätým ohňom splápolala, a meč v jeho prachu kúdoly po poli valia sa metá: To moja cára bijú tie pyšný cár, hriema pyšné prilby rímsku jeho vložil: ten sám sebe záhubu primlúvajú slovenský, kňazstvo zradný: - Kde našina stolca zlatý jeho. Hoj, rozovrela tá krv slovänov sláva zašlých Slovänská divokom: Mor ty len, a v čistom poli dedov dostal sa proti Rímu prápor svojho víťaz pyšný, že premoc rímske do pravici strážiť nám Boh zas dobrý ľud môj Slovän nečítava vrahov obstatá. Sto mečom za česť rodu, ktorému božie dary božie dar boží ho čaká. Pravda, bohy vydaná, káže nám na boji svätú za svojich hromom ho zabíja. Praštia zlomené raty, bitý biedami, v tajné tam za ním svete: medzi národa čierna zem naša, daná Slovän na svojom divým sa otriasa. - Nuž, povedzže nám, cárovi a smelými sa bujné našej znaky; z ďaky ti ich poslal, zo slávy. Slovänom: pozdrav prináša. Zem tá, na ktorý by putá minul abo nezahynul, akže oproti mojim junák za junákom padá cárska vôľa; to vám naše nivy; mestá ľahli popolom: „Mor ho! detvo môjho rod ich dedov, ktorú v údel dali Slovänským posteli, na kraju, lež Slovänské deti. Husté prachu: a zlatého takovým svoj národ dáva. A tí, krutým železom čo nad ním Slovenského rodu padli tam vidí a zo stolca zlatom stolec už sa váľa v prachu; a čo i tam dušu dáš v tom boji divoko, a junák ti cárovi rímskemu. Oni čelom nebijú, do nôh nepadajú: taká otrokom. Zúri boj na cára sa napružila a naši? - Hoj, mor ho!" kríkla a razom na odveta. No, dokáž teraz, či vetvu pokojom: Slovänia! pozrite po svetovládny, lebo koval úmysel na Slovänská odvetu." Hriema zo stole dary nesú, chlieb a soľ, cáre! mocná ruka zmeravená meč divý: na púšť obrátili surmili sme jarmo. A ty mor ho! detvo môjho rodu. Duní Dunaj, cez Dunaj vlaží, tam kryje, ale oni padni, ako ťa my tu pozdrav ťa pán velí: Slobodu dobrý deň, zlomili sa jemu pristrojím. A kto je, ten pán Rím svietil v pästi každému nado hlavou blyští, lež božia zablysla sa ronia. Hynú i našich dávame: ber ich oči bystro v okolo si preráža a junákom pripraví. Vedzte, že si bude pásti vôľu svoju cár na zbroji. Pobelavé kaderie šije i vy. - Tie krásnu vlasť ich, to je zem vašich mozoľov: ale sťa víťazi, každý v jasnej zbroje: povstal si táboru sedí cár s okom v oko; a z nej sa voje; a voľ nebyť, ako byť otrokom.

Tu už sú zreteľné frázy z pôvodnej básne, ale je to menej zábavné. Vyzerá to, akoby niekto pôvodnú báseň postrihal na krátke úryvky a náhodne ich pospájal.

Takto vyzerá text s následnosťami po šestici písmen:

Zleteli orly z Tatry, tiahnu na podolia, ponad tie šíre rovne, na kope vrahov odrážal nápady. Ich popolom: a ľud náš úbohý, bitý biedami, cudzí víťazi! Žiadna rana zvuk bôľu z úst im nevyrazí, vďačne lejú vernú krv po osudnom poli: oj, veď padnúť mi máš v boji, to že mi padni, ako byť otrokom. Zúri boj a našina stala si dokola: to vlasť našu vrah napadať cudzie vlasti zbojom: Slovänskej vlasti, a žiť z našich dedov, ktorý by putá minul abo nezahynul, akže oproti mojim junák za junák ti cárovi pozrel okom sklopeným na bojišti stojí: A čo? - Azda tých padlých Slovänia! pozrite po svete: medzi národ dáva. A ty mor ho! detvo môjho rodu, kto sa proti Rímu slúžiť, strážiť nám naše heslom ozvali ústa jeho mračnej tvári urazená sa pýcha ľútnym hnevom žiari. A zo stolec už sa váľa v prachu; a meč v jeho ku slovänstvo zradný: - Kde naši? - Hoj, rozovrela tá krv slovänské deti. Husté prachu kúdoly po poli valia sa rady šiatrov ďalekým priestorom. Pokraj tábor, do šíkov zvíjajú sa väží. A zem tam kryje, ale morí. - Hojže, Tatro, jasných orlov mati! Nikdy sa ti tá tvár bledá, tá ruka sa napružila a na zbroj udrela; a duša jeho chrámy. A nad riekou biely dom, v ňom jeho pravici strašnejšie sa zvíja; bleskom blýska na vrahov na bojišti, ale sťa víťazom pripojím, a z nej krajinám rímske do prachu sa ronia. Hynú i naši, čo bili ten Rím svetovládny, lebo koval úmysel na Slovänov sa každému vrahov, zbitých od jeho vložil: ten pán velí: Slovän ešte hrozí tá tvoja noha, to je zem naša, kroz nás ti, slávneho snemu, aby išli s pozdravom k cárovi rímsku jej končiny valný Dunajom krvavô pobrežia: tam ti tvoja čože nám nesie: či meč, či vetvu pokoja? S mečom za ním Slovän cestu si preráža a junáka oviala; a jeden nájdete, ktorému boh celú zem podnožil a osudy národov v ruku jeho stolca zlatom stolci; a pred cárom družina slovänská čata, už vám je zôkol-vôkol od vrahovi stane ľud iný. A spurné rody vaše pôjdu Rímu prápor svoj národa čierťaže. Svätoháj, stovekými zelený lipami, v tajné tam lono túli bohov jeho oceli. Už nežije, a ešte raz bystro v okolo si páča. Rastom sú ako jedle, pevní ako skala, zdalo by sa ti, že ich jedna mater mala. Krásna zem - jej končiny valným Dunaj vlaží, a Tatra skalnou hradbou okol nej sa väže, čo strežú slovenskému kraju, lež bedušné svojich hromady tam vidí a zo svojho víťazu: „Mor ho! detvo môjho rod milý, a v čistom poli dedov posvätné mohyly: dedov dostane sa. - A kde naši, hynú, ale ich meno toho nech ovenčí sláva zašlých vekov junákom padá cárska stráža. Zasurmili surmity, volajú do zbroji. Pobelavé kaderie šije i vy. - Tieto dary nesú, chlieb a soľ, cárovi a smelými sa jemu primlúvajú slovy: „Národ slovenského národ - oj, veď to nebolí! A boj pomaly tíchne: strašná búry sila divým svojím zúrením sama sa zničila. - A tá naša rodinka, tá slovänským poslom: „Mocný pán, ktorých niekdy ľud radievali rady, ktorú kročiť mieni tvoji synovia povraždení ležia. Neostal, ani kto by tú zvesť niesol bratom: Bratia vám za česť rodu padli v boji divokom: Mor ty len, a voľ nebyť, ako víťaz pyšný, že som pán Rímu, a Rím je pán svetu: To moja cárska vôľa; to vám na odvetu." Hriema pyšný cár, hriema zo stolca zlatý jeho či jeden strašný ohlas ústa im vydali: „Mor ho! - hoj mor ho!" kríkla a razom na cára bijú tie slovänská divoko, a junáckej spočíva posteli, na ktorú v údel dali Slovänom: pána mať je neprávosť a väčšia byť pánom. A človek nad človeka u nás nemá práva: sväté naše nivy; mestá ľahli popoly dávno už čierna zem to požehnaná! Chvála Bohu z neba, máme i my, a poznáš, že narábať dobre vieme s nimi; ak s pokojom: pozdraviť umieme. - Tie krásne roviny, túto zem vašich mozoľov: ale bláhal darmo! Dal nám Boh zas dobrý deň, zlomili sme jarmo. A tí, krutým železom čo nad nami vládli, kdeže sú? - My stojíme; ale oni padli. - Lebo - veky to svedčia - vo knihách osudu tak stojí napísané o slovänskom ľudu: Zem, ktorých meč divých vrahov obstatá. Sto mečov sa bojí? - Nie, lež Slovän nečítava vraha, hromom ho zabíja. Praštia zlomené raty, bité štíty zvonia a pyšné prilby rímskym obranu pristrojím. A kto seba v obeť svätú za svojom seje, i žne len na svoj pozdrav ťa pán neba i zeme, lepšie, ako ťa my tu pozdrav prináša. Zem tá, na kraj svoj ďaleký. Tam na tých horách sivé mihajú sa voje; a voj za vojom divým útokom ta letí, kde boj na cára sa metá: To ti na rímskemu. Oni čelom nebijú, do nôh nepadajú: taká otroč neznáma slovenského rodu, kto kradmou rukou siahne na tvoju slobodu: a čo i tam dušu dáš v tom boji svätom. Lež každý v jasnej zbroje: povstal táborom: belia sa, zem dupotom a nebo rykom sa otriasa. - Nuž, povedzže nám, cáre, bolo reči. - Ale ten nie! - zbroje sa bojí podlá duša: a tu ti o slobodu; a čo i tam za pomedzím slovenský rod ich poslal, zo slávny cáre! svoj rozvinul. Skloníte šije im obtáča, modré ich oči bystré hodil zraky ponad rovné polia; preleteli cez Dunaj a luna za lunou sa valí: nad ním svieti pevný hrad na vysoké hory, tie pyšné hory, ponad vysokom bralí. Pod tým hradom Riman-cár zastal sa pod nohy. Bláhal už víťazstva radovať sa strela, ruka cudzie nežiada. Ale keď na naše dvere zaklope ruka zmeravená meč odjať si nedá. A cár s okom v oko; a z oka ti mu božia zablysla sa stydí. No zahyň, podlá duša, čo o slobodu dobrý ľud pokúša. - Skočil medzi stráž svoju cár božie dary božie sú priazne našej znaky; z ďaky." Nevzal cár bledý od strachu: a zlatého takovým sa heslo je: Sloboda a sláva, kto kradmou rukou siahne na tvoja detva už nevráti. Páč! Nad valný Dunaj vlaží, tam Tatra skalnou hradbou okol neho cárska stráž, tuhí to paholci; okol nej sa väží: Tá zem, tie žírne moravy: to vie, že premoc rímsku pýchu slovänská odrazu a mečom ak ideš: cáre! mocná ruka tvoju slobodu dobrý ľud môj mi pokúša. Lež večná meno posiaľ v piesni ľudu žije. A sláva! - Neraz krásnu vlasť ich, to kolíska dávna synov slávy. Slovenský, kňazstvo i staršina naša, daná Slovän nejde sa ľakať pýchy vo tvojej, cáre! meče máme pri vernej práci voždy svoj kus chleba. Zvyk náš je nie napadol divý: na púšť obrátili sa bujné naše plúžiť. A junač vašu k mojim rozkazom postaví, beda mu! ten sám sebe záhubu pripraví. Vedzte, že si bude pásti vôľu svoju naveky po slovänská odveta. No, dokáž teraz, či máš toľko sily v meči, koľko pýchy jeho rodu. Duní Dunaj, cez tú šíru vodu, sadli tam dušu dáš v tom boji divokom: Mor ty len, a voľ nebyť, ako byť otrokom.

Tu sú frázy z pôvodnej básne ešte dlhšie, ale vynára sa akoby iná úroveň humoru. Už sa nespájajú náhodné slová do krátkych viet, ale dlhé vety sa nečakane kombinujú. Občas vznikajú podivné slovné spojenia ako: "na kope vrahov odrážal nápady" či "Svätoháj, stovekými zelený lipami, v tajné tam lono túli bohov jeho oceli."

Je tu apokalyptická veta: "A človek nad človeka u nás nemá práva: sväté naše nivy; mestá ľahli popoly dávno už čierna zem to požehnaná!" i pomerne úspešná parafráza pôvodného textu: "Sto mečov sa bojí? - Nie, lež Slovän nečítava vraha, hromom ho zabíja."

Text s následnosťami po sedmici písmen vyzerá takto:

Zleteli orly z Tatry, tiahnu na podolia, ponad rovné polia; preleteli cez Dunaj, cez tú šíru vodu, sadli tam za pomedzím slovenského rodu. Duní Dunaj vlaží, a Tatra skalnou hradbou okol neho cárska vôľa; to vám na odvetu." Hriema pyšný cár, hriema zo stolca zlatého, lenže Slovänom nebesá, tá zem hrobom každému nado hlavou blyští, lež Slovänom: pána mať je neprávosť a väčšia byť pánom. A človek nad človeka u nás nemá práva: sväté naše nivy; mestá ľahli popolom: a ľud náš úbohý, bitý biedami, cudzím dostal sa pod nohy. Bláhal už víťaz pyšný, že si bude pásti vôľu svoju cár bledý od strachu: a zlatý jeho svätým ohňom splápolala, a meč zasvietil v pästi každému vrahovi stane sa. - Nuž, povedzže nám, cáre! meče máme i my, a poznáš, že narábať dobre vieme s nimi; ak s pokojom: pozdravom k cárovi pozrel okom v oko; a z oka ti mu božia zablysla sa strela, ruka sa napružila a na zbroj udrela; a jedným veľkým citom srdcia im zahrali; a jeden strašná búry sila divým svojím zúrením sama sa zničila. - A tá naša rodinka, tá slovänskej vlasti, a žiť z našich mozoľov: ale bláhal darmo! Dal nám Boh zas dobrý deň, zlomili sme jarmo. A tí, krutým železom čo nad nami vládli, kdeže sú? - My stojíme; ale oni padli. - Lebo - veky to svedčia - vo knihách osudu tak stojí napísané o slovänskom ľudu: Zem, ktorú kročiť mieni tvoja čože nám Slovän ešte raz bystré hodil zraky ponad vysoké hory, ponad tie šíre rovne, na kraj svoj ďaleký. Tam na tých horách sivé mihajú sa väží. A zem to požehnaná! Chvála Bohu z neba, máme pri vernej práci voždy svoj kus chleba. Zvyk náš je nie napadať cudzie nežiada. Ale keď na naše plúžiť. A junač vašu k mojim junákom pripojím, a z nej krajinám rímskym obranu pristrojím. A kto sa proti mojim rozkazom postaví, beda mu! ten sám sebe záhubu pripraví. Vedzte, že som pán Rímu, a Rím je pán svetu: To moja cárska stráža. Zasurmili surmity, volajú do zbroje: povstal tábor, do šíkov zvíjajú sa voje; a voj za vojom divým útokom ta letí, kde boj na cára sa metá: To ti na rímsku pýchu slovänská odveta. No, dokáž teraz, či máš toľko sily v meči, koľko pýchy jeho. Hoj, rozovrela tá krv slovänské deti. Husté prachu; a mečom ak ideš: cáre! svoj pozdrav ťa pán neba i zeme, lepšie, ako ťa my tu pozdraviť umieme. - Tie krásne roviny, túto zem vašich dedov dostane ľud iný. A spurné rody vaše pôjdu Rímu slúžiť, strážiť nám naše stáda, polia naše dvere zaklope ruka cudzia v úprimnej dôvere: kto je, ten je; či je on zblíza, či zďaleka: Vo dne, v noci na stole dar boží ho čaká. Pravda, bohy vydaná, káže nám nesie: či meč, či vetvu pokoja? S mečom za ním Slovän cestu si preráža a junákom padá cárska stráž, tuhí to paholci; a pred cárom družina slovänská divokom: Mor ty len, a voľ nebyť, ako byť otrokom. Zúri boj a našina stala si dokola: to vie, že premoc rímsku jej moc nepredolá: lež, brať moja, ak už len padnúť mi máš v boji, to že mi padni, ako víťazstva radovať sa stydí. No zahyň, studom večným zahyň, podlá duša, čo o slobodu dobrý ľud pokúša. Lež večná meno toho nech ovenčí sláva, kto seba v obeť svätú za svoj národ - oj, veď padnúť za národ dáva. A ty mor ho! detvo môjho rodu, kto kradmou rukou siahne na tvoju slobodu dobrý ľud môj mi pokúša. - Skočil medzi stráž svoju naveky po slovänská čata, už vám je zôkol-vôkol od vrahov na bojišti stojí: A čo? - Azda tých padlých Slovän na svojom, cudzie vlasti zbojom: Slovän nečítava vrahov obstatá. Sto mečov sa každému víťazu: „Mor ho!" kríkla družina neveliká stojí: sú to cudzí víťazi! Žiadna rana zvuk bôľu z úst im nevyrazí, vďačne lejú vernú krv po osudnom poli: oj, veď to nebolí! A boj pomaly tíchne: strašný ohlas ústa im vydali: „Mor ho!" kríkla a razom na cára bijú tie slovänským poslom: „Mocný pán, ktorému boh celú zem podnožil a osudy národov v ruku jeho vložil: ten pán velí: Slovänom od Boha. Pozri: tu jej končiny valný Dunaj vlaží, tam Tatra skalnou hradbou okol nej sa väže, čo strežú slovenský, kňazstvo i staršina naša, daná Slovänstvo zradný: - Kde naši? - Hojže, Tatro, jasných orlov mati! Nikdy sa ti, že ich jedna mater mala. Krásna zem - jej končiny valný Dunaj a luna za lunou sa valí: nad ním svieti pevný hrad na vysokom bralí. Pod tým hradom Riman-cár zastal si táborom: belia sa rady šiatrov ďalekým priestorom. Pokraj táboru sedí cár na zlatom stolci; okol nej sa väží: Tá zem, tie pyšné hory, tie žírne moravy: to vlasť ich, to kolíska dávna synov slávy. Slovenský rod ich poslal, zo slávneho snemu, aby išli s pozdrav prináša. Zem tá, na ktorú v údel dali Slovän nejde sa ľakať pýchy vo tvojej, cáre, bolo reči. - Ale ten nie! - zbroje sa bojí podlá duša: a tu ti o slobodu; a čo i tam dušu dáš v tom boji divokom: Mor ty len, a voľ nebyť, ako byť otrokom.

Tu už sú úryvky z pôvodného textu príliš dlhé, a vtipné kombinácie nevznikajú. Počítač už úspešne recituje celé vety. A tým naše literárne cvičenie končí, pretože ak štatistiku zvýšime na osmice písmen, počítač občas dokáže úspešne zreprodukovať celú pôvodnú báseň, len niekedy sa na nejakom viacnásobnom výskyte dlhého slova alebo frázy pomýli a preskočí dlhší kus textu.

Ak vás to pobavilo, tu je použitý program v jazyku Perl:

use strict;

my $UROVEN = 1;

open(my $vstup, "<vstup.txt");
my $text = join("", <$vstup>);
close($vstup);
$text =~ s/\s+/ /g;

my $zaciatok = substr($text, 0, $UROVEN);
my $pokracovanie = {};
while(length($text) > $UROVEN) {
 my $uvod = substr($text, 0, $UROVEN);
 $pokracovanie->{$uvod} = [] if !defined($pokracovanie->{$uvod});
 push(@{$pokracovanie->{$uvod}}, substr($text, $UROVEN, 1));
 $text = substr($text, 1);
}

$text = $zaciatok;
while(1) {
 my $uvod = substr($text, -$UROVEN);
 last if (0 == @{$pokracovanie->{$uvod}});
 $text .= splice(@{$pokracovanie->{$uvod}}, rand(@{$pokracovanie->{$uvod}}), 1);
}

open(my $vystup, ">vystup" . $UROVEN . ".txt");
print $vystup $text;
close($vystup);

Tu je podobný program v jazyku Ruby (autor: Tomi Belan):

vstup = readlines.join
current = vstup[0, 1]

tabulka = {}
vstup.length.times do |i|
  uvod = vstup[i, current.length]
  tabulka[uvod] = [] if not tabulka[uvod]
  tabulka[uvod] << vstup[i+current.length, 1]
end

print current
while true do
  dalsi = tabulka[current].delete_at(rand(tabulka[current].length))
  current = current[0, current.length-1] + dalsi
  exit if dalsi.length == 0
  print dalsi
end

29. 11. 2008

Kniha: Gut Feelings

Kamarát mi požičal knižku. Skôr ako mu ju vrátim, rozhodol som sa poznačiť si z nej nejaké zaujímavé veci, a dať ich na internet, keby to niekoho zaujalo, alebo keby mal chuť o tom podiskutovať. (Autor: Gerd Gigerenzer; názov: „Gut Feelings: the intelligence of the unconscious“)

Začnem tým, čo sa mi na knižke nepáčilo, nech to máme rýchlejšie za sebou. Vzhľadom na svoj obsah mi pripadala zbytočne dlhá. Má síce len 230 strán (bez záverečných poznámok), ale každá kapitola obsahuje kúsok zaujímavého textu a ten sa potom dlho rozoberá. Po pár desiatkach strán je jasná pointa knihy; autor však pokračuje ďalej a nebolo mi celkom jasné, či ešte stále rozmazáva tú istú pointu, alebo už prešiel k nejakej nasledujúcej, a v čom presne je rozdiel. Skrátka, zdalo sa mi, že tú knihu čítam veľmi dlho, a dozvedel som sa pomerne málo. Akoby autor úmyselne naťahoval text, nech má dostatočnú dĺžku, aby sa dal vydať ako samostatná kniha.

Pointa knihy: Mnohí experti nám radia, ako sa „správne rozhodovať“. Typická rada znie tak, že si máme zhromaždiť čo najviac informácií, a potom ich vyhodnotiť podľa nejakej schémy. Napríklad rozdeliť ich do dvoch stĺpcov (v prospech nejakého navrhovaného riešenia, a v jeho neprospech), prideliť im body podľa dôležitosti, sčítať body v oboch stĺpcoch, a rozhodnúť sa podľa toho, kde vyjde väčší súčet. Toto je racionálne rozhodovanie, a kto sa ním neriadi, koná vraj hlúpo. Samozrejme v reálnom živote sa tým skoro nikto nikdy neriadi, ale to vraj iba ukazuje, akí sme amatéri, a že aspoň na tie skutočne dôležité rozhodnutia by sme mali prizvať dobre platených expertov, ktorí to za nás urobia poriadne.

Tento spôsob rozhodovania má dve zásadné chyby. Prvá chyba je, že trvá veľmi dlho, kým zhromaždíme všetky súvisiace údaje a matematicky ich vyhodnotíme. Ako vlastne zistíme, ktoré údaje sú ešte podstatné, a ktoré nie? (V nejakom okamihu treba povedať „už dosť“ a prejsť k samotnému rozhodovaniu. Ale podľa čoho sa racionálne rozhodneme, kedy nastal ten správny okamih? Ak sa aj o tom chceme rozhodnúť horeuvedeným spôsobom, vznikne nekonečný cyklus. Do ďalšieho nekonečného cyklu sa dostaneme pri otázke, ako zistíme, ktorej informácii máme priradiť akú dôležitosť.) Získavanie údajov stojí čas, a niekedy aj peniaze. Výsledné racionálne riešenie sa môže natoľko predražiť, že menej dokonalé lacnejšie riešenie by vlastne bolo celkovo výhodnejšie. Ak záleží na čase, môže sa stať, že v okamihu nájdenia dokonalého riešenia už bude neskoro. A v bežnom živote sú aj situácie, kde rozhodujú sekundy. Pri prirodzených spôsoboch rozhodovania sa môžeme oprieť o rýchlosť našich inštinktov, milióny rokov trénovanú evolúciou.

Druhá chyba je v tom, že niekedy riešenie získané takýmto zložitým spôsobom vôbec nie je lepšie. Väčšia námaha vložená do procesu rozhodovania nemusí nutne znamenať lepší výsledok. V bežnom živote máme často k dispozícii chybné údaje, prípadne ich vôbec nemáme. Ak do správneho vzorca dosádzame nesprávne údaje, môžeme síce výsledok vypočítať aj na desať desatinných miest, ale s realitou to nemá nič spoločné, je to len komplikovaný systém sebaklamu. (Ale dobre to vyzerá, a ak to robí externý konzultant, dá sa za to vystaviť vysoká faktúra.)

Príklad zo športu: Predstavte si baseballového hráča, ktorý sa snaží chytiť letiacu loptičku. Expert by povedal, že treba vypočítať dráhu, po ktorej lopta poletí, a rozbehnúť sa priamo na miesto, kam podľa výpočtu dopadne. Kto sa vo fyzike trochu vyzná, môže si dráhu loptičky predstaviť ako parabolu, čo síce nie je zložitá krivka, ale aj tak si neviem predstaviť, ako by ste ju v danej situácii rátali, hoci aj s pomocou kalkulačky. Kto sa vo fyzike vyzná viac, uvedomí si, že dráhu loptičky ovplyvňuje aj odpor vzduchu (ktorý závisí od teploty a tlaku), smer a rýchlosť vetra, rotácia loptičky,... skrátka, presný výpočet je prakticky nemožný.

A dobrý hráč? Ten sa môže napríklad rozbehnúť tak, aby počas behu videl loptičku stále pod rovnakým uhlom. Nie je to síce rovnomerný pohyb, ale je to celkom jednoduché a okamžite použiteľné pravidlo. Nemôžete síce podľa neho napísať článok do odborného časopisu, ale môžete si vďaka nemu z ihriska doniesť domov medailu – a to aj bez toho, že by ste si toto pravidlo vôbec uvedomovali.

V praxi teda nepotrebujeme poznať čo najviac údajov, ale poznať toľko údajov, koľko stíhame efektívne spracovávať, a vedieť si z dostupných údajov vyberať tie správne. Zdá sa, že tu existuje nejaká „zlatá stredná cesta“. Ak človek ničomu nerozumie, nevie, čo si má všímať, a rozhoduje sa náhodne. S určitým množstvom vedomostí si človek začína všímať pomerne správne veci, a robiť pomerne dobré rozhodnutia. S priveľkým množstvom vedomostí si všíma príliš veľa informácií, nestíha ich vyhodnocovať, stráca prehľad o tom, ktoré sú dôležitejšie a ktoré menej dôležité. Od istého stupňa štúdia už väčšinu dôležitých vecí poznáme. Nové detaily sú síce v niečom prínosné, zároveň však spomaľujú a komplikujú naše uvažovanie, takže z celkového pohľadu môžu byť vlastne čistou stratou.

(C) 2008 Viliam Búr viliam-bur.blogspot.com

Vezmime si ako príklad medicínu. Pred liečbou by sme mali stanoviť správnu diagnózu. Príliš mnoho vyšetrení však ohrozuje zdravie pacienta. Priveľa krvi odobranej kvôli testom oslabuje organizmus; rovnako ako prílišné ožarovanie. Čím viac testov pacient absolvuje a čím dlhšie si počkáme na ich dôkladné spracovanie, tým kvalitnejšia môže byť diagnóza, ale pacient v tom čase už môže byť mŕtvy. Autor tvrdí, že na množstvo zbytočných vyšetrení v USA vplývajú súdne spory. Lekár radšej kvôli vlastnej bezpečnosti pošle pacienta na veľa zbytočných vyšetrení, ktoré poškodia jeho zdravie, než by v prípade nesprávnej diagnózy riskoval miliónovú pokutu a stratu licencie. Vyšetrenie navyše sa totiž dá obhájiť opatrnosťou, zatiaľ čo vynechanie vyšetrenia budí dojem, že nemocnica chcela na pacientovi ušetriť, a preto ju treba ukážkovo potrestať. Samotní lekári však väčšinu takýchto vyšetrení vynechávajú, ani ich neodporúčajú členom svojej rodiny. Ak máte teda známeho lekára, nepýtajte sa ho, čo by robil, keby ste za ním prišli v roli pacienta, ale čo by robil, keby podobné príznaky trápili jeho osobne, alebo niekoho z jeho rodiny. Dostanete lepšiu radu.

Niekedy aj neznalosť môže poslúžiť ako informácia. Predstavte si, že vám niekto bude hovoriť názvy dvoch náhodne vybraných miest v pomerne neznámej krajine, a máte si tipnúť, ktoré mesto má viac obyvateľov. Ak vám je jedno z tých miest nejako povedomé, a o tom druhom neviete nič, zrejme si tipnete to prvé, a máte slušnú šancu, že ste uhádli. Ak by ste si týždeň pred týmto testom v rámci rozšírenia svojho „všeobecného vzdelania“ prečítali článok, ktorý by o každom meste obsahoval odstavec textu so základnými informáciami (ale nesústredil by sa vyslovene na počty obyvateľov), výsledky testu by možno boli horšie, lebo teraz by vám už boli všetky mestá tak trochu povedomé. Podobne ak počujete názvy dvoch firiem, môžete na základe svojej nevedomosti tipovať, ktorá je bohatšia. Aj ja, ako človek, ktorý sa vôbec nezaujíma o šport, dokážem pomerne dobre odhadnúť, ktorý z dvoch športovcov je lepší, ak som o jednom už niekedy počul, a o druhom nie. Aj tu platí „zlatá stredná cesta“; tento algoritmus nebude fungovať, ak o danej oblasti neviete absolútne nič, ani keď viete príliš veľa.

Aj v obchode je dôležité nezaplaviť zákazníka priveľa informáciami. Ak dáte zákazníkovi na výber pár výrobkov, rýchlo sa v nich zorientuje a jeden si vyberie. Ak mu dáte na výber priveľa podobných výrobkov, zvyšujete šancu, že bude dlho vyberať, a nakoniec odíde nerozhodnutý. Menej je teda niekedy viac. (Podobná zásada platí aj pri dizajne počítačových programov. Nie je pravda, že čím viac nastavení ponúknete používateľovi, tým bude spokojnejší. Menu so stovkami rôznych možností ho iba zbytočne vyplaší. Bežný používateľ chce mať hneď po nainštalovaní programu nastavené „dosť dobré“ nastavenia, a v menu chce mať iba pár najdôležitejších vecí, aby sa v nich rýchlo vyznal. Sú aj ďalšie dobré dôvody, ale to už je mimo témy tohoto článku.)

Ďalšie dobré pravidlo je držať sa „štandardného“ riešenia. Keď budete robiť to, čo robia všetci okolo vás, je málo pravdepodobné, že sa dostanete do nečakaného problému. Ak robíte veci, ktoré ľudia okolo vás nerobievajú, ťažšie sa predvídajú dôsledky. Toto pravidlo využíva aj reklama, ktorá sa snaží dosiahnuť, aby bol ľuďom daný produkt povedomý, aby pôsobil ako štandard. (Táto snaha manipulovať však nemusí byť dôvodom konať zásadne proti reklame a kupovať neznáme výrobky. Ak sa o nejakom výrobku veľa hovorí, je väčšia šanca, že keby mal nejaké vážne problémy, ľudia by o nich tiež veľa hovorili.) Rozumná vláda by mohla využiť toto pravidlo na riadenie svojich občanov bez toho, aby mali pocit, že sa im príliš zasahuje do života – svoje riešenia by určila ako „štandardné“, a kto by s nimi nesúhlasil, mohol by si dobrovoľne vybrať inak. Občania, ktorí majú na danú vec názor, by teda mohli konať po svojom, ale vyše 90% občanov by zostalo pri vládnom riešení, pretože by sa im nechcelo ísť vyplniť nejaké tlačivo.

Aj my sami sa musíme chrániť pred záplavou informácií. Koľkokrát sa vám stalo, že ste mali na výber niekoľko možností, a okamžite vám niečo hovorilo: „táto je správna“? Ale keď dlhšie rozmýšľate, zistíte, že tá prvá možnosť má svoje výhody aj nevýhody, ale je tu aj druhá možnosť, ktorá má zase iné výhody a nevýhody, a ešte tretia a štvrtá možnosť... a po chvíľke už vnímate veľa rozumných možností, na každej ste si všimli jej výhody a nevýhody, máte hlavu nabitú informáciami, len sa akosi neviete rozhodnúť. A s odstupom času sa často ukáže, že tá prvá možno bola naozaj správna. Už na začiatku ste mali dosť veľa informácií na to, aby ste sa pomerne dobre rozhodli, ale potom ste svoj systém zbytočne preťažili. Samozrejme, keby ste o danej oblasti neboli vedeli vôbec nič, to prvé rozhodnutie by asi nebolo príliš kvalitné. Ale napríklad v oblasti medziľudských vzťahov už do nás mnoho dôležitých informácií vložila príroda, takže aj keď stretneme úplne neznámych ľudí, nezačíname celkom od nuly. Napríklad pomerne jednoduché a dosť dobré pravidlo na medziľudské vzťahy je: „zo začiatku sa správaj ku každému pekne, neskôr dobré správanie oplácaj dobrým správaním (a naopak); ak už máš s niekým vybudovaný dlhodobý dobrý vzťah, občas mu odpusti“.

Niekedy nám aj rozumné riešenie pripadá nerozumné, keď nechápeme jeho kontext. Psychológovia robili napríklad pokusy s potkanmi v bludisku – chodba sa delila na dve časti, na konci každej z nich bola potrava. Potrava bola však rozdelená tak, že v jednej chodbe bolo vždy 80% a v druhej vždy 20% celkového množstva. Vedci očakávali, že potkan sa časom naučí zamieriť k chodbe s väčším množstvom potravy, lebo tak jej získa najviac. Potkan aj po mnohých pokusoch väčšinou išiel k väčšej kôpke potravy, ale niekedy aj k menšej, približne v pomere 80:20. Občas sa teda zbytočne pripravil o väčšiu porciu. Znamená to, že jeho inštinkty sú hlúpe? Nie, akurát sú namiesto laboratórnych podmienok zamerané na prirodzené podmienky. Keby danou chodbou utekala skupina potkanov, čo sa v prírode stáva častejšie, nebolo by rozumné, aby všetky odbočili k tej istej kôpke potravy; menšej skupine by sa oplatilo zamieriť k menšej kôpke.

Ponaučenie z knižky: Nepodceňujme svoje inštinkty a nehanbime sa za to, keď sa riadime pocitmi namiesto zložitých racionálnych úvah. Jedno aj druhé má svoje miesto, a zložité riešenie nemusí byť vždy lepšie.

Menovky:

24. 8. 2008

Plošinovka za štyri dni

Pozvali ma do poroty programátorskej súťaže Špongia. Súťaží sa v programovaní počítačových hier za niekoľko dní. Aby som sa lepšie vcítil do kože súťažiacich, vyzval som organizátora Dana Lováska na programátorský súboj. Jednotlivec proti jednotlivcovi, časový limit 4 dni, presnejšie 3½, téma "plošinovka", programovací jazyk podľa vlastného výberu. Zatiaľ sme nezohnali nezávislú porotu na vyhodnotenie výsledkov, ale na tom až tak nezáleží. Rád som si to vyskúšal, a tu sú moje dojmy a skúsenosti.

Najprv pár slov o súťaži. Špongia znamená "Športové programovanie oči neodpudzujúcich grafických interaktívnych aplikácií", čiže programovanie počítačových hier s dôrazom na nápad, hrateľnosť a estetický dojem. Súťaž vznikla v roku 2006 z iniciatívy študentov Gymnázia pre mimoriadne nadané deti v Bratislave. V roku 2007 sa zapojili aj študenti Gymnázia Jura Hronca a Gymnázia Grösslingová. Ak máte záujem pridať sa aj vy (študenti stredných alebo základných škôl), ozvite sa organizátorom, alebo v komentári k tomuto článku.

Bežné programátorské súťaže sú zamerané na písanie efektívnych algoritmov a pre laika sú nezáživné až nepochopiteľné. V Špongii je algoritmus iba prostriedkom na dosiahnutie cieľa, a hodnotia sa vlastnosti zrozumiteľné laickej (hráčskej) verejnosti. To však neznamená, že programátor má menej práce. Naopak, musí navyše spracovávať vstup z klávesnice a myši, a zobrazovať peknú animovanú grafiku. Špongie sa zúčastňujú skupiny do 6 členov. Väčšia skupina nemusí byť vždy výhodou, ťažšie sa koordinuje spolupráca. Grafikou a hudbou prispievajú aj neprogramátori. V minulom ročníku mali účastníci na vytvorenie hry 18 dní, presné zadanie sa uverejňuje na začiatku súťaže, v októbri. Témy predchádzajúcich ročníkov boli "voda" a "puzzle".

Mojou výhodou oproti účastníkom súťaže je 10 rokov profesionálnej programátorskej praxe, a predtým ďalších takmer desať rokov amatérskeho programovania. Na druhej strane, počítačovú hru som naposledy programoval tuším pred dvanástimi rokmi, v programovacom jazyku Turbo Pascal v operačnom systéme MS DOS. Odvtedy som písal prevažne skripty, knižnice, a webové rozhrania. Naštudovať si nejaké grafické rozhranie nie je veľký problém, ale času je málo a práce veľa. A vedel som, že približne deň stratím nejakými povinnosťami mimo počítača; nechcem sa však vyhovárať, účastníci súťaže zase počas nej musia chodiť do školy.

Vybral som si programovací jazyk Java. Chcel som písať v jazyku, ktorý dôkladne poznám, aby ma technické detaily nebrzdili pri písaní. Do úvahy pripadala Java alebo Perl, ale v Perli som zatiaľ nič grafické interaktívne nepísal, a Java má výborné vývojové prostredie Eclipse. V Jave neviem pracovať so zvukom, ale keďže neviem skladať hudbu, a nechcelo sa mi strácať čas hľadaním vhodne znejúcej voľne použiteľnej skladby na internete, rozhodol som sa, že hra bude bez zvuku. Síce to znižuje celkový dojem, ale snáď to vyvážim niečím iným.

Ako prvý krok som si vytvoril pracovnú plochu 800×600 pixelov, ktorá sa dá spustiť v okne aplikácie alebo na webovej stránke, a vykreslí farebný obdĺžnik. Pre dobrý pocit, že už mám prvý malý tromf proti súperovi píšucemu v C++, a pretože v Jave sa to programuje pomerne jednoducho.

Potom som si v grafickom editore MS Paint nakreslil jednoduchého panáčika: kružnica ako hlava, elipsa ako telo, čiary ako ruky a nohy. V hre som panáčika načítal zo súboru a vykreslil na obrazovku. Pridal som ovládanie pomocou šípok, takže sa pomaly vznášal vo vzduchu. Obrazovka sa aj s panáčikom prekresľovala 50× za sekundu; panáčik pritom blikal, takže som dorobil virtuálnu obrazovku, na ktorej sa vždy vymazal a nakreslil o kúsok vedľa, a až potom sa výsledok prekreslil na skutočnú obrazovku. Aby obrazovka nebola prázdna, vykreslil som na pozadí modrozelený obrázok, a niekoľko tehlových múrov poskladaných zo štvorčekových dlaždíc. Hráč sa stále voľne vznášal aj ponad múry.

Pred kreslením ďalších obrázkov som si chcel premyslieť, aký veľký má byť v hre panáčik, a ako rýchlo sa má pohybovať. Toto rozhodnutie sa dá neskôr v programe ľahko zmeniť, ale bude treba nakresliť nové obrázky a nové miestnosti, čo je strata času, a bol som už zhruba v polovici druhého dňa zo štyroch. Keď som programoval hry pred dvanástimi rokmi, posúval som vždy panáčika o jeden obrazový bod za päťdesiatinu sekundy, čím vznikal krásny plynulý pohyb. Lenže ak by mal takto prejsť 800 pixelov, trvalo by mu to 800÷50= 16 sekúnd, a to mi pripadalo priveľa. Ale keď som vyskúšal rýchlosť väčšiu ako jeden obrazový bod, ten pohyb vyzeral ako pod stroboskopom. Čo s tým?

(C) 2008 Viliam Búr viliam-bur.blogspot.com

Ak sa majú figúrky rýchlo pohybovať, asi ich nemôžem kresliť po jednotlivých bodoch. Použil som teda vektorový editor Inkscape, poskladal som si panáčika z kriviek, a nakoniec som ho exportoval ako bitmapu. A hoci som opäť nakreslil úplne jednoduché tvary, vyzeral omnoho kvalitnejšie ako predchádzajúci model. Dokonca mal na okrajoch kriviek polopriesvitné body, takže nepôsobil kockato na žiadnom pozadí. Bolo mi jasné, že budem takto kresliť všetky obrázky.

Veľkosť panáčika som si určil ako 40×80 pixelov, a terén som poskladal ako mozaiku z dlaždíc veľkosti 40×40 pixelov, čím sa plocha 800×600 pixelov akoby rozdelila na mriežku 15×20 častí. Pri vodorovnom pohybe som nechal panáčika plynulo zrýchľovať až po 7 bodov za päťdesiatinu sekundy, to mi pripadalo dosť rýchle a ešte pomerne plynulé. Do výšky skákal rýchlosťou 16 bodov, aby pri gravitačnom zrýchlení 1 bod zvládol vyskočiť o tri riadky mriežky. K týmto hodnotám som došiel skúšaním, dokiaľ mi nepripadalo, že pohyb panáčika vyzerá správne.

Okrem múrov som dorobil trávnatú zem. Musel som kvôli nej úplne prerobiť algoritmus zrážok. Múr je totiž pre panáčika nepriepustný; nemôže sa cezeň prepadnúť, prejsť ním zboku, ani ho preraziť hlavou. Trávnatá plošina je polopriepustná; ak je panáčik nad ňou, nemôže sa prepadnúť, ale ak stojí nižšie, môže chodiť popred ňu, alebo na ňu zdola vyskočiť. Múr tesne nad hlavou je ako strop, cez ktorý sa nedá prejsť a možno ho iba obísť; trávnatá plošina tesne nad hlavou je ako priečka rebríka, na ktorú sa dá vyskočiť.

Bol som príjemne prekvapený, že sa celá obrazovka stíha prekresliť päťdesiatkrát za sekundu. Môj počítač by zvládol až 65 záberov za sekundu, a to som si kúpil pred dvoma rokmi jeden z tých lacnejších (1 GB pamäte, 1,6 GHz procesor). Vedel som, že Java je pomalý jazyk, a mal som v úmysle prerobiť program, aby sa každú päťdesiatinu sekundy prekresľovali iba tie časti obrazovky, kde sa niečo pohlo; ale odkladal som túto úpravu na neskôr, a bol som prekvapený, že to ide aj bez nej. Neskôr som program aj tak upravil, len kvôli dobrému pocitu, že zbytočne neplytvám silami počítača. Až po skončení programátorského súboja a odoslaní výsledku som zistil, že som v tej úprave urobil logickú chybu, takže sa naďalej prekresľovala celá obrazovka. Nuž čo, hlavne, že to funguje. ;-)

Dorobil som nepriateľského slimáka, ktorý sa pohybuje rovnakým spôsobom ako hráč, iba o trochu pomalšie, a nemôže skákať. Dorobil som jablká, ktoré hráč môže zbierať. Mal som v úmysle neskôr dorobiť viacero nepriateľov a viacero zberateľných predmetov, ale už som nestihol. Dorobil som vznášadlo, ktoré funguje ako trávnatá zem, ale sa vodorovne pohybuje, takže panáčik po ňom musí opatrne kráčať, aby nespadol.

V posledný deň sa mi veľmi nedarilo, lebo som sa bál blížiaceho termínu, nechcelo sa mi už programovať, a tešil som sa, až to skončí a oddýchnem si. Rozšíril som obrazovku na 820×660 pixelov; na vnútornej časti 800×600 pixelov prebiehal dej hry, okolo bol rám a spodná časť, v ktorej sa mali zobrazovať pozbierané kľúče a iné špeciálne predmety. Ak panáčik pozbieral všetky jablká, dostal sa do ďalšej miestnosti; ak sa ho dotkol slimák, musel miestnosť opakovať. Dorobil som ešte úvodnú a záverečnú obrazovku. Zabralo mi to niekoľko hodín, a potom už mi nezostal čas na naprogramovanie naplánovaných kľúčov a odomykateľných dverí, takže niektoré úpravy som z hľadiska súťaže robil celkom zbytočne. Texty na začiatku a na konci hry sú uložené ako obrázky; je to plytvanie miestom na disku, ale tak sa to dalo naprogramovať najrýchlejšie. Pôvodne mali byť po slovensky a po anglicky, ale keď Inkscape nevedel správne zobraziť slovenské písmená, nechal som iba anglický text, nemal som čas hľadať riešenie.

Prišla noc, tak som narýchlo nadizajnoval päť miestností; v prvých štyroch postupne predstavujem jednotlivé herné prvky, a posledná piata je náročná, aby som hráča na rozlúčku potrápil, nech mu hra nepripadá príliš krátka. Miestnosti sú naeditované priamo v zdrojovom kóde; nemal som čas písať editor. Výsledok som zabalil a odoslal cez e-mail.

Programátorský súboj teda skončil, ale snáď si niekedy ešte nájdem čas na dokončenie tejto hry, a prípadne na nejaké ďalšie hry. Keď zvážim, čo som sa za tie roky naučil, a aké sú dnes počítače výkonné, je to veľká výzva. (Dnes by sa dala v Jave bez problémov napísať napríklad hra ako Warcraft 2.) A teším sa na Špongiu 2008, na ktorej sa síce nemôžem zúčastniť oficiálne, ale pokúsim sa ukecať nejakého grafika, aby mi pomohol s neoficiálnym mimosúťažným príspevkom.

Myslím si, že niečo podobné by si mal vyskúšať každý človek alebo tím, ktorý sa pokúša vytvoriť nejakú hru. Na internete je mnoho herných projektov, aj od slovenských autorov, ktoré začali vytvorením webovej stránky, napísaním príbehu a nakreslením ukážkových obrázkov, po ktorých nasledovali už len správy typu "pracujeme na tom, vydržte chvíľku" a prípadne o niekoľko rokov záverečná správa "momentálne na projekte nepracujeme, vošli nám do toho nejaké povinnosti, projekt sa odkladá na neurčito". Takýto športový štýl programovania neľútostne preverí vaše tímové schopnosti, nájde vaše slabé miesta, a ukáže vám, aký výsledok môžete očakávať v akom čase. Bez ohľadu na to, aký typ hry idete robiť, skúste najprv za týždeň vyrobiť kompletné mikrodemo. Oplatí sa obetovať jeden týždeň, aby ste zistili, či sa nasledujúce roky nebudete namáhať zbytočne.

Hru "Platform 2008" (lepší názov som nevymyslel) si môžete stiahnuť zo serveru SourceForge.net pod licenciou GNU GPLv3 aj so zdrojovým kódom.

11. 8. 2008

Vodná mapa pre Wesnoth, vylepšená

V predchádzajúcich dvoch článkoch sme si vytvorili scenár na súboj dvoch hráčov s názvom "2p - Pool", kde jeden hráč mohol verbovať iba morských ľudí a druhý hráč iba morských hadov a saurov. Scenár sme uverejnili na serveri Wesnothu. V poslednom článku presunieme výber medzi morskými ľuďmi a hadmi dovnútra scenára. Každý hráč si vyberie svoj tím presunutím veliterľa do jednej z dvoch začiatočných pevností; budú teda možné aj bitky morských ľudí proti morským ľuďom alebo hadov proti hadom.

Poznámka: Bolo by "prirodzenejšie" vytvoriť dve frakcie morských ľudí a hadov, a potom éru, ktorá by obsahovala tieto frakcie. Pri spustení hry pre viacerých hráčov by mohol hostiteľ vybrať túto (alebo hocijakú inú) éru pre tento (alebo hocijaký iný) scenár. Ale my to urobíme inak, pretože chceme použiť tieto frakcie iba pre tento scenár, a pretože toto je návod na programovanie udalostí v scenári.

Logika scenára sa zadáva pomocou udalostí. Udalosti sú príkazy v tvare: "keď sa stane toto, urob tamto". Na wiki stránkach Wesnothu (po anglicky) nájdete zoznam možných príkazov; v tomto článku vysvetlím iba tie, ktoré teraz použijeme.

Začnime tým, že na jednotlivé pevnosti umiestnime nápisy ako "toto je pevnosť morských ľudí" a "toto je pevnosť hadov". Použijeme konfiguračný súbor scenára "2p_Pool.cfg" z predchádzajúceho článku, a na jeho koniec pridáme udalosti.

[multiplayer]

 # ...tu su veci z predchadzajuceho clanku...

 [event]
  name=prestart
  [label]
   x,y=4,5
   text=_"Morski ludia"
  [/label]
  [label]
   x,y=4,9
   text=_"Hadi"
  [/label]
  [label]
   x,y=30,5
   text=_"Morski ludia"
  [/label]
  [label]
   x,y=30,9
   text=_"Hadi"
  [/label]
 [/event]

[/multiplayer]

Značky "[event]" a "[/event]" znamenajú "toto je začiatok / koniec popisu udalosti". Parameter "name" určuje, kedy nastane táto udalosť; hodnota "prestart" znamená "pred štartom scenára, skôr ako sa čokoľvek ukáže na obrazovke". To je správne miesto na záverečné úpravy mapy. Nasledujúce značky sú príkazy, ktoré sa majú vykonať, keď sa spustí udalosť; čiže pred začiatkom scenára.

Značky "[label]" a "[/label]" znamenajú príkaz "daj na dané políčko mapy nápis". Parametre "x" a "y" sú súradnice políčka. (Súradnice sa zobrazujú v pravom hornom rohu okna, v editore máp aj v hre.) Parameter "text" je text nápisu. Pred textom je znamienko "_", aby ho bolo možné neskôr preložiť do iných jazykov.

Toto je najjednoduchší spôsob ako napísať skript. Ale nie je ho takto jednoduché udržiavať, najmä ak bude dlhší. Nie je zrejmé, že "4,5" sú súradnice pevnosti morských ľudí hráča číslo 1; a keby sa dizajnér mapy rozhodol presunúť pevnosť na iné miesto, nebolo by jasné, ktoré časti skriptu treba aktualizovať. To sa dá vyriešiť vytvorením makra s názvom "PEVNOST_H1M", ktoré bude predstavovať umiestnenie pevnosti morských ľudí hráča číslo 1, ale stačí ho definovať na jednom mieste a môžeme ho používať viackrát. Makrá môžeme definovať v hociktorej časti skriptu, len ich musíme definovať skôr ako ich použijeme, takže toto makro môžeme dať pred udalosti, alebo na začiatok súboru. Verzia s makrami bude vyzerať asi takto:

#define PEVNOST_H1M
x,y=4,5
#enddef

#define PEVNOST_H1H
x,y=4,9
#enddef

#define PEVNOST_H2M
x,y=30,5
#enddef

#define PEVNOST_H2H
x,y=30,9
#enddef

[multiplayer]

 # ...tu su veci z predchadzajuceho clanku...

 [event]
  name=prestart
  [label]
   {PEVNOST_H1M}
   text=_"Morski ludia"
  [/label]
  [label]
   {PEVNOST_H1H}
   text=_"Hadi"
  [/label]
  [label]
   {PEVNOST_H2M}
   text=_"Morski ludia"
  [/label]
  [label]
   {PEVNOST_H2H}
   text=_"Hadi"
  [/label]
 [/event]

[/multiplayer]

Záber spustenia scenára

Ďalšia udalosť bude výber pevnosti. Napíšme kód, ako si hráč číslo 1 vyberie pevnosť morských ľudí. Keď jednotka, ktorá patrí hráčovi číslo 1 vstúpi na pevnosť morských ľudí hráča číslo 1, hráč číslo 1 dostane možnosť verbovať jednotky morských ľudí, a pevnosť hadov hráča číslo 1 sa zničí.

[multiplayer]

 # ...tu su predchadzajuce veci...

 [event]
  name=moveto
  [filter]
   side=1
   x,y=4,5
   [filter_location] 
    terrain=Khw
   [/filter_location]
  [/filter]
  first_time_only=yes

  [set_recruit]
   side=1
   recruit=Merman Fighter,Merman Hunter,Mermaid Initiate
  [/set_recruit]
  [label]
   x,y=4,9
   text=""
  [/label]
  [terrain]
   x= 3, 3, 4, 4, 4, 5, 5
   y= 9,10, 8, 9,10, 9,10
   terrain=Wo
  [/terrain]
  [terrain]
   x,y=4,7
   terrain=Ww
  [/terrain]
 [/event]

[/multiplayer]

Udalosť typu "moveto" nastane vtedy, keď sa jednotka presunie do situácie popísanej v značke "[filter]". (Táto jednotka musí prísť na to políčko, nestačí keď cezeň iba prechádza.) Pretože takáto situácia môže nastať mnohokrát, parameter "first_time_only" určuje, či sa udalosť vykoná iba keď situácia nastane prvýkrát, alebo pri každej takejto situácii. My chceme vybrať pevnosť iba raz.

Značky "[filter]" a "[/filter]" ohraničujú popis situácie, pri ktorej má nastať udalosť. Parameter "side" určuje, že to bude po pohybe jednotky patriacej hráčovi číslo 1. Parametre "x,y" určujú, že to bude, keď sa táto jednotka presunie na políčko 4,5 (pevnosť morských ľudí hráča číslo 1). Značka "[filter_location]" určuje ďalšie podmienky ohľadom terénu, na ktorý sa jednotka posunie; musí to byť terén "Khw", čo je kód pre vodnú pevnosť. (Prečo testujeme, či je na políčku vodná pevnosť, keď už vieme, že je to políčko 4,5? Týmto trikom zabránime výberu už zničenej pevnosti. Ak si hráč číslo 1 vyberie pevnosť hadov, pevnosť morských ľudí sa zničí; ak neskôr nejaká jednotka príde na políčko 4,5, nebude tam terén vodnej pevnosti, takže sa táto udalosť nespustí.)

Značky "[set_recruit]" a "[/set_recruit]" znamenajú príkaz nastaviť zoznam verbovateľných typov jednotiek; hráč číslo 1 bude môcť verbovať iba jednotky morských ľudí. Značky "[label]" a "[/label]" umiestnia nápis na políčko mapy; v tomto prípade nahradia už existujúci nápis ("Hadi" na pevnosti hadov hráča číslo 1) prázdnym textom, čiže vlastne vymažú nápis.

Značky "[terrain]" a "[/terrain]" znamenajú príkaz na zmenu terénu mapy; "x,y" je pozícia políčka, ktoré sa má zmeniť a "terrain" je kód nového terénu. Môžeme zadať viacero políčok naraz, ak uvedieme zoznam x-ových súradníc a zoznam zodpovedajúcich y-nových súradníc; čiže políčka v uvedenom príklade sú 3,9, 3,10, 4,8, 4,9, 4,10, 5,9, a 5,10. Kód terénu "Wo" je hlboká voda, chceme druhý hrad poriadne potopiť. Kód terénu "Ww" je plytká voda, chceme iba zrušiť most na štarte.

Aj tento kus programu by sa jednoduchšie udržiaval, keby využíval makrá:

[multiplayer]

 # ...tu su predchadzajuce veci...

 [event]
  name=moveto
  [filter]
   side=1
   {PEVNOST_H1M}
   [filter_location] 
    terrain={TEREN_PEVNOST}
   [/filter_location]
  [/filter]
  first_time_only=yes

  [set_recruit]
   side=1
   recruit={JEDNOTKY_MORSKE}
  [/set_recruit]
  [label]
   {PEVNOST_H1H}
   text=""
  [/label]
  [terrain]
   {HRAD_H1H}
   terrain={TEREN_VODA_HLBOKA}
  [/terrain]
  [terrain]
   {START_H1}
   terrain={TEREN_VODA}
  [/terrain]
 [/event]

[/multiplayer]

Potrebujeme 4 takéto udalosti: hráč číslo 1 si vyberá pevnosť morských ľudí, hráč číslo 1 si vyberá pevnosť hadov, hráč číslo 2 si vyberá pevnosť morských ľudí, hráč číslo 2 si vyberá pevnosť hadov. Mohli by sme urobiť 4 kópie tejto udalosti a zmeniť, čo treba. Alebo môžeme vytvoriť makro (s názvom VYBER_TIM) využívajúce parametre. Makrá stačí napísať raz a môžeme ich použiť viackrát. Parametre sú tie časti makra, ktoré sa menia.

V tomto príklade sú premenlivé časti makra: číslo hráča, 1 alebo 2 (nazvime ho HRAC); súradnice zvolenej pevnosti (nazvime ju PEVNOST); zoznam jednotiek na verbovanie (JEDNOTKY); súradnice tej druhej pevnosti, odkiaľ vymažeme nápis (INA_PEVNOST); súradnice toho druhého hradu vrátane pevnosti, ktoré potopíme (INY_HRAD); a štartová pozícia daného hráča (START). Takže makro na túto udalosť bude vyzerať takto:

#define VYBER_TIM HRAC PEVNOST JEDNOTKY INA_PEVNOST INY_HRAD START
 [event]
  name=moveto
  [filter]
   side={HRAC}
   {PEVNOST}
   [filter_location] 
    terrain={TEREN_PEVNOST}
   [/filter_location]
  [/filter]
  first_time_only=yes

  [set_recruit]
   side={HRAC}
   recruit={JEDNOTKY}
  [/set_recruit]
  [label]
   {INA_PEVNOST}
   text=""
  [/label]
  [terrain]
   {INY_HRAD}
   terrain={TEREN_VODA_HLBOKA}
  [/terrain]
  [terrain]
   {START}
   terrain={TEREN_VODA}
  [/terrain]
 [/event]
#enddef

Makro použijeme takto:

#define JEDNOTKY_MORSKE
Merman Fighter,Merman Hunter,Mermaid Initiate#enddef

#define JEDNOTKY_HADIE
Naga Fighter,Saurian Augur,Saurian Skirmisher#enddef

#define TEREN_PEVNOST
Khw#enddef

#define TEREN_VODA
Ww#enddef

#define TEREN_VODA_HLBOKA
Wo#enddef

#define START_H1
x,y=4,7
#enddef

#define START_H2
x,y=30,7
#enddef

#define PEVNOST_H1M
x,y=4,5
#enddef

# ...tu su ostatne pevnosti...

#define HRAD_H1M
x= 3, 3, 4, 4, 4, 5, 5
y= 5, 6, 4, 5, 6, 5, 6
#enddef

#define HRAD_H1H
x= 3, 3, 4, 4, 4, 5, 5
y= 9,10, 8, 9,10, 9,10
#enddef

#define HRAD_H2M
x=29,29,30,30,30,31,31
y= 5, 6, 4, 5, 6, 5, 6
#enddef

#define HRAD_H2H
x=29,29,30,30,30,31,31
y= 9,10, 8, 9,10, 9,10
#enddef

[multiplayer]

 # ...tu su predchadzajuce veci...

#define VYBER_TIM HRAC PEVNOST JEDNOTKY INA_PEVNOST INY_HRAD START
 # ...viete co...
#enddef

{VYBER_TIM 1 {PEVNOST_H1M} {JEDNOTKY_MORSKE} {PEVNOST_H1H} {HRAD_H1H} {START_H1}}
{VYBER_TIM 1 {PEVNOST_H1H} {JEDNOTKY_HADIE}  {PEVNOST_H1M} {HRAD_H1M} {START_H1}}
{VYBER_TIM 2 {PEVNOST_H2M} {JEDNOTKY_MORSKE} {PEVNOST_H2H} {HRAD_H2H} {START_H2}}
{VYBER_TIM 2 {PEVNOST_H2H} {JEDNOTKY_HADIE}  {PEVNOST_H2M} {HRAD_H2M} {START_H2}}

[/multiplayer]

(C) 2008 Viliam Búr viliam-bur.blogspot.com

Ak ste sa stratili v tých značkách "...", na konci článku nájdete napísaný celý kód scenára. (Len sa snažím tento článok skrátiť, aj keď mi to veľmi nejde.) Pointa je, že makro bez parametrov sa volá takto: "{MOJE_MAKRO}", a makro s parametrami sa volá takto: "{MOJE_MAKRO PARAMETER1 PARAMETER2}". Ako parameter makra môžeme použiť aj iné makro a vyzerá to takto: "{MOJE_MAKRO {INE_MAKRO}}".

Niektoré makrá majú "#enddef" napísané tesne za textom. Ak to napíšeme takto, nedostane sa do makra znak "koniec riadku". Robím to pri makrách, ktoré tvoria iba časť riadku v skripte; mohol by som potom dať do jedného riadku viacero takýchto makier, napríklad "recruit={JEDNOTKY_MORSKE},{JEDNOTKY_HADIE}". Ak makro obsahuje celé riadky skriptu, nezáleží na tom, či je tam nejaký "koniec riadku" navyše, lebo prázdne riadky sa ignorujú.

Záber zvolenia pevnosti morských ľudí

V tejto chvíli je scenár hotový. Jediný problém je, že AI (umelá inteligencia, čiže "Počítačový hráč" vo Wesnothe) nášmu systému nerozumie, takže z jeho pohľadu sú naše pevnosti iba obyčajné navzájom rovnocenné pevnosti; a z nejakých technických dôvodov si teda vždy vyberie tú severnejšiu. Pridáme teda nejakú logiku pre AI.

Nemôžeme AI vysvetliť náš systém a očakávať, že pochopí, čo z toho vyplýva, a vymyslí si príslušnú stratégiu. (Ak vie niekto naprogramovať takú chytrú AI, nech prosím kontaktuje programátorov Wesnothu.) Namiesto toho použijeme trik: vyberieme si na začiatku ťahu niektorú pevnosť a zničíme tú druhú, takže AI si potom prirodzene "vyberie" tú zostávajúcu (čím spustí horeuvedenú udalosť).

Algoritmus na výber je takýto: vyberieme si náhodnú pevnosť. Čože, očakávali ste niečo múdrejšie? No tak dobre: ak je počítačový hráč hráčom číslo 1, vyberie si náhodne. Ak je počítačový hráč hráčom číslo 2, vyberie si opak toho, čo si vybral hráč číslo 1. Ale ak si hráč číslo 1 počas prvého ťahu nevybral žiadnu pevnosť (čo je čudné, ale možné), vyberie si aj počítačový hráč číslo 2 náhodne. Povedzme to trochu inými slovami: Počítačový hráč si vyberie pevnosť náhodne, ale počítačový hráč číslo 2 si vyberie opak toho, čo si vybral hráč číslo 1, ak si hráč číslo 1 niečo vybral.

Budeme potrebovať udalosť "ai turn", ktorá sa spúšťa na začiatku ťahu počítačového hráča. Budeme však používať náhodné čísla, a z nejakých technických dôvodov je zakázané generovať náhodné čísla počas udalosti "ai turn", takže využijeme ešte udalosť "side turn", ktorá sa spúšťa na začiatku ťahu každého hráča (skôr ako "ai turn"). V udalosti "side turn" vygenerujeme náhodné číslo a uložíme ho do premennej; v udalosti "ai turn" toto číslo použijeme, alebo ho budeme ignorovať, ak je na ťahu človek.

Náhodné číslo uložíme do premennej s názvom "vyber"; bude to číslo 1 alebo 2, ale aby sa nám skript ľahšie čítal, vytvoríme si makrá VYBER_MORSKE a VYBER_HADIE s hodnotami 1 a 2, takže si nemusíme pamätať, ktoré číslo znamená výber ktorých jednotiek.

Použijeme nové značky "[set_variable]" na uloženie hodnoty do premennej; "[if]" a "[then]" na rozhodnovanie (ak, tak); "[variable]" na testovanie, či dané premenná obsahuje danú hodnotu; "[have_location]" na testovanie, či sa na danom políčku nachádza (alebo nenachádza, ak použijeme znamienko "!") daný terén. Použijeme aj premenné udalosti "turn_number" na zistenie, či je to prvý ťah, a "side_number" na zistenie, či je to hráč číslo 2.

V iných programovacích jazykoch by náš algoritmus vyzeral nejako takto. (Toto je iba vymyslený pseudokód na základe nejakých jazykov.)

keď ŤaháHráč (ťah) {
 ak ťah == 1 {
  výber := náhodné(1..2)
 }
}

keď ŤaháAI (ťah, hráč) {
 ak ťah == 1 {

  ak  hráč == 2  a  terén(PEVNOST_H1M) != TEREN_PEVNOST  {
   výber := VYBER_MORSKE
  }
  ak  hráč == 2  a  terén(PEVNOST_H1H) != TEREN_PEVNOST  {
   výber := VYBER_HADIE
  }

  znič_pevnosť(hráč, nie výber)
 }
}

A toto je hotový skript scenára:

#define JEDNOTKY_MORSKE
Merman Fighter,Merman Hunter,Mermaid Initiate#enddef

#define JEDNOTKY_HADIE
Naga Fighter,Saurian Augur,Saurian Skirmisher#enddef

#define TEREN_PEVNOST
Khw#enddef

#define TEREN_VODA
Ww#enddef

#define TEREN_VODA_HLBOKA
Wo#enddef

#define START_H1
x,y=4,7
#enddef

#define START_H2
x,y=30,7
#enddef

#define PEVNOST_H1M
x,y=4,5
#enddef

#define PEVNOST_H1H
x,y=4,9
#enddef

#define PEVNOST_H2M
x,y=30,5
#enddef

#define PEVNOST_H2H
x,y=30,9
#enddef

#define HRAD_H1M
x= 3, 3, 4, 4, 4, 5, 5
y= 5, 6, 4, 5, 6, 5, 6
#enddef

#define HRAD_H1H
x= 3, 3, 4, 4, 4, 5, 5
y= 9,10, 8, 9,10, 9,10
#enddef

#define HRAD_H2M
x=29,29,30,30,30,31,31
y= 5, 6, 4, 5, 6, 5, 6
#enddef

#define HRAD_H2H
x=29,29,30,30,30,31,31
y= 9,10, 8, 9,10, 9,10
#enddef

#define VYBER_MORSKE
1#enddef

#define VYBER_HADIE
2#enddef

[multiplayer]

 id=multiplayer_2p_Pool
 name= _ "(2) Pool"
 description= _ "Vodna bitka medzi vodnymi ludmi a hadmi."
 map_data="{@campaigns/Examples_by_Viliam/maps/multiplayer/2p_Pool.map}"

 {DEFAULT_SCHEDULE}
 {DEFAULT_MUSIC_PLAYLIST}

 [side]
  side=1
  controller=human
  canrecruit=yes

  team_name=zapad
  user_team_name= _ "team^Zapad"
 [/side]

 [side]
  side=2
  controller=human
  canrecruit=yes

  team_name=vychod
  user_team_name= _ "team^Vychod"
 [/side]

 [event]
  name=prestart
  [label]
   {PEVNOST_H1M}
   text=_"Morski ludia"
  [/label]
  [label]
   {PEVNOST_H1H}
   text=_"Hadi"
  [/label]
  [label]
   {PEVNOST_H2M}
   text=_"Morski ludia"
  [/label]
  [label]
   {PEVNOST_H2H}
   text=_"Hadi"
  [/label]
 [/event]

#define VYBER_TIM HRAC PEVNOST JEDNOTKY INA_PEVNOST INY_HRAD START
 [event]
  name=moveto
  [filter]
   side={HRAC}
   {PEVNOST}
   [filter_location] 
    terrain={TEREN_PEVNOST}
   [/filter_location]
  [/filter]
  first_time_only=yes

  [set_recruit]
   side={HRAC}
   recruit={JEDNOTKY}
  [/set_recruit]
  [label]
   {INA_PEVNOST}
   text=""
  [/label]
  [terrain]
   {INY_HRAD}
   terrain={TEREN_VODA_HLBOKA}
  [/terrain]
  [terrain]
   {START}
   terrain={TEREN_VODA}
  [/terrain]
 [/event]
#enddef

{VYBER_TIM 1 {PEVNOST_H1M} {JEDNOTKY_MORSKE} {PEVNOST_H1H} {HRAD_H1H} {START_H1}}
{VYBER_TIM 1 {PEVNOST_H1H} {JEDNOTKY_HADIE}  {PEVNOST_H1M} {HRAD_H1M} {START_H1}}
{VYBER_TIM 2 {PEVNOST_H2M} {JEDNOTKY_MORSKE} {PEVNOST_H2H} {HRAD_H2H} {START_H2}}
{VYBER_TIM 2 {PEVNOST_H2H} {JEDNOTKY_HADIE}  {PEVNOST_H2M} {HRAD_H2M} {START_H2}}

 [event]
  name=side turn
  first_time_only=no

  [if]
   [variable]
    name=turn_number
    numerical_equals=1
   [/variable]
   [then]
    [set_variable]
     name=vyber
     rand=1..2
    [/set_variable]
   [/then]
  [/if]
 [/event]

 [event]
  name=ai turn
  first_time_only=no
  [if]
   [variable]
    name=turn_number
    numerical_equals=1
   [/variable]
   [then]

    [if]
     [variable]
      name=side_number
      numerical_equals=2
     [/variable]
     [have_location]
      {PEVNOST_H1M}
      terrain=!,{TEREN_PEVNOST}
     [/have_location]
     [then]
      [set_variable]
       name=vyber
       value={VYBER_MORSKE}
      [/set_variable]
     [/then]
    [/if]

    [if]
     [variable]
      name=side_number
      numerical_equals=2
     [/variable]
     [have_location]
      {PEVNOST_H1H}
      terrain=!,{TEREN_PEVNOST}
     [/have_location]
     [then]
      [set_variable]
       name=vyber
       value={VYBER_HADIE}
      [/set_variable]
     [/then]
    [/if]

#define PREDVYBER_TIM HRAC VYBER INA_PEVNOST
    [if]
     [variable]
      name=side_number
      numerical_equals={HRAC}
     [/variable]
     [variable]
      name=vyber
      numerical_equals={VYBER}
     [/variable]
     [then]
      [terrain]
       {INA_PEVNOST}
       terrain={TEREN_VODA}
      [/terrain]
     [/then]
    [/if]
#enddef

{PREDVYBER_TIM 1 {VYBER_MORSKE} {PEVNOST_H1H}}
{PREDVYBER_TIM 1 {VYBER_HADIE}   {PEVNOST_H1M}}
{PREDVYBER_TIM 2 {VYBER_MORSKE} {PEVNOST_H2H}}
{PREDVYBER_TIM 2 {VYBER_HADIE}   {PEVNOST_H2M}}

   [/then]
  [/if]
 [/event]

[/multiplayer]

Tento scenár (po anglicky, s nejakými vylepšeniami, ktoré v článkoch nespomínam) si môžete stiahnuť ako doplnok k Wesnothu "Examples by Viliam".

Wesnoth 1.4 žiaľ obsahuje chybu v programe, kvôli ktorej má AI problém verbovať jednotky z určitých netypických zoznamov, ako sú napríklad tieto. Počítačový hráč potom nenaverbuje žiadne jednotky, alebo ich naverbuje príliš málo. Nenechajte sa tým odradiť, berte to ako pripomienku, že hra sa stále vyvíja (napísal som autorom chybové hlásenie a snáď to jedného dňa vo verzii 1.6 opravia), a že ak robíte niečo nezvyčajné, možno budete potrebovať kontaktovať autorov hry. Čím viac sa vaše scenáre budú podobať na scenáre z hry, tým menšia je šanca narazenia na chybu. A tento scenár aspoň funguje poriadne, keď hrá človek proti človeku.

Súvisiace články:

5. 8. 2008

Reálne čísla v jazyku Java

V jazyku Java máme dva primitívne typy určené na prácu s reálnymi číslami: float a double. Ich veľkosť je 4 alebo 8 bajtov, z toho je 1 bit znamienko, 8 alebo 11 bitov exponent, a 23 alebo 52 bitov mantisa. Reálne čísla sa zaokrúhľujú na určitý počet platných číslic, čiže čím väčšie číslo, tým väčšie zaokrúhlenie. Ak teda hovoríme o ich rozsahu, máme na mysli dve nezávislé veci: na akú presnosť sa hodnoty zaokrúhľujú, a aké sú najväčšie a najmenšie možné hodnoty.

Týmto primitívnym typom zodpovedajú dva objektové typy: java.lang.Float a java.lang.Double. Ich statické premenné "MIN_VALUE" a "MAX_VALUE" určujú najmenšie a najväčšie konečné kladné reálne čísla vyjadriteľné pomocou daného typu.

System.out.println("Float " + Float.MIN_VALUE + " " + Float.MAX_VALUE);
// Float 1.4E-45 3.4028235E38
System.out.println("Double " + Double.MIN_VALUE + " " + Double.MAX_VALUE);
// Double 4.9E-324 1.7976931348623157E308

Zápis "1.4E-45" znamená "1.4 × 10-45", čiže 0.000 000 000 000 000 000 000 000 000 000 000 000 000 000 001 4. Zápis "3.4028235E38" znamená "3.4028235 × 1038", čiže 340 282 350 000 000 000 000 000 000 000 000 000 000; záverečné nuly znamenajú, že číslice na týchto miestach sa zaokrúhľujú. Podobne zápisy "4.9E-324" a "1.7976931348623157E308" znamenajú "4.9 × 10-324" a "1.7976931348623157 × 10308", čo nebudem rozpisovať, pretože výsledné čísla majú vyše 300 číslic.

Čo sa stane, ak je výsledok výpočtu príliš veľké alebo príliš malé číslo, a nezmestí sa do daného rozsahu? Oba reálne typy majú pomocné konštanty, ktoré umožňujú vrátiť aspoň nejaké výsledky aj za hranicami rozsahu výpočtu. Príliš veľké kladné a záporné čísla vyjadrujeme pomocou konštánt "POSITIVE_INFINITY" a "NEGATIVE_INFINITY", doslova "kladné nekonečno" a "záporné nekonečno". Čísla príliš blízko nule sa zaokrúhľujú na nulu (existuje aj záporná nula "-0.0f", ktorá sa rovná obyčajnej nule, okrem špeciálnych situácií ako napríklad delenie nulou). Ak o výsledku nevieme povedať vôbec nič, napríklad nekonečno mínus nekonečno alebo nula delená nulou, vyjadrujeme to pomocou konštanty "NaN". (Na rozdiel od objektovej konštanty "null" sú tieto konštanty typu "float" alebo "double", takže môžu byť uložené aj do premennej primitívneho typu.)

Ak chceme zistiť, či náš výpočet vrátil jednu z takýchto hodnôt, použijeme metódy "isInfinite" a "isNaN".

Prečo sa pri reálnych číslach používajú takéto špeciálne konštanty, keď pri celých číslach nastane za podobných okolností obyčajné pretečenie alebo "ArithmeticException"? Jedným dôvodom je zaokrúhľovanie reálnych čísel. Ak pri výpočte s celými číslami delíme nulou, zvyčajne to znamená, že programátor zabudol ošetriť nejaký špeciálny prípad; je dobré, ak ho program na túto situáciu upozorní. Ak pri výpočte s reálnymi číslami delíme nulou, často to znamená, že sme chceli deliť nejakou nenulovou hodnotou, ktorá sa pri medzivýpočte zaokrúhlila na nulu. Ošetrovanie všetkých takýchto situácií by bolo náročné, a v podstate zbytočné. Dobrý programátor predsa vie, že pri práci s reálnymi číslami sa zaokrúhľuje, takže výsledok výpočtu je vždy do istej miery nespoľahlivý; záleží od konkrétneho vzorca, nakoľko môže zaokrúhľovacia chyba narásť. Druhým dôvodom je, že spôsob uloženia reálnych čísel v pamäti umožňuje medzi ne "prirodzeným" spôsobom doplniť tieto konštanty; v prípade celých čísel by bol podobný postup "umelý", a okrem iného by extrémne spomaľoval všetky programy.

(C) 2008 Viliam Búr viliam-bur.blogspot.com

System.out.println(Float.MAX_VALUE * 2);  // Infinity
System.out.println(Float.MIN_VALUE / 2);  // 0.0
System.out.println(0.0f /  0.0f);  // NaN
System.out.println(1.0f /  0.0f);  // Infinity
System.out.println(1.0f / -0.0f);  // -Infinity
System.out.println(1.0f / Float.POSITIVE_INFINITY);  //  0.0
System.out.println(1.0f / Float.NEGATIVE_INFINITY);  // -0.0

Základné matematické operácie robíme znamienkami "+" sčítanie, "-" odčítanie, "*" násobenie, "/" delenie. Ak pri výpočtoch používame celé aj reálne čísla, znamienko "/" medzi dvoma celými číslami znamená celočíselné delenie, medzi dvoma reálnymi alebo reálnym a celým znamená reálne delenie.

System.out.println(1    / 3   );  // 0
System.out.println(1    / 3.0f);  // 0.333...
System.out.println(1.0f / 3   );  // 0.333...
System.out.println(1.0f / 3.0f);  // 0.333...

Čísla môžeme porovnávať pomocou operátorov "==" rovná sa, "!=" nerovná sa, "<" je menšie, ">" je väčšie, "<=" je menšie alebo rovné, ">=" je väčšie alebo rovné. Počas výpočtu sa reálne čísla zaokrúhľujú, takže výsledok operátora "==" môže závisieť od zaokrúhľovania. Pri dvoch reálnych číslach zvyčajne nezisťujeme ich rovnosť, ale či je ich rozdiel v danej tolerancii.

float a = 123456789f;
float b = 123000123f;
float c = 987987987f;
float x = a * b * c;
float y = c * b * a;
System.out.println(x);  // 1.5002796E25
System.out.println(y);  // 1.5002795E25

Trieda java.lang.Math ponúka množstvo metód na výpočty s celými aj reálnymi číslami: absolútna hodnota "abs" a znamienko "signum"; väčšie alebo menšie z dvoch čísel "min" a "max"; zaokrúhľovanie "floor", "ceil", "round"; mocniny "exp" a "pow", odmocniny "sqrt" a "cbrt", a logaritmy "log" a "log10"; premena uhlov zo stupňov na radiány "toRadians" a naopak "toDegrees"; goniometrické funkcie "sin", "cos", "tan", "asin", "acos", "atan", "atan2" a hyperbolické funkcie "sinh", "cosh", "tanh". Poskytuje aj matematické konštanty "E" a "PI".

Existuje aj trieda java.lang.StrictMath, ktorá ponúka rovnaké metódy, ale navyše so zárukou, že na rôznych platformách dá rovnaký výpočet vždy celkom rovnaký výsledok.

Náhodné čísla získame pomocou objektu java.util.Random. Metódy "nextFloat" a "nextDouble" vracajú náhodné reálne čísla rovnomerne rozložené medzi 0 a 1. Metóda "nextGaussian" vracia náhodné reálne čísla podľa Gaussovho normálneho rozloženia s priemerom 0 a smerodajnou odchýlkou 1; to znamená, že približne 68% hodnôt nebude od priemeru ďalej (ľubovoľným smerom) ako smerodajná odchýlka, 95% hodnôt nebude ďalej ako dve smerodajné odchýlky, a 99.7% hodnôt nebude ďalej ako tri smerodajné odchýlky. Napríklad pri IQ testoch je priemer 100 a smerodajná odchýlka 15, takže tu je simulátor výsledkov IQ testov náhodných jedincov v populácii:

java.util.Random r = new java.util.Random();
for (int i = 0; i < 100; i++) {
  System.out.println(Math.round(100 + 15 * r.nextGaussian()));
}

Súvisiace články:

Menovky: