Zadanie

Ak máte akékoľvek otázky ohľadom tejto úlohy, napíšte Kubovi Havelkovi na

Je príjemný jarný deň. Vonku svieti slnko, na stromoch štebotajú vtáčiky, a tak ste sa rozhodli spraviť si výlet do hôr. Ako sa začal blížiť čas obeda, ku štebotu sa postupne pridalo škvŕkanie nenásytných žalúdkov. A potom padla tá otázka.

“Kto zbalil jedlo?” Z panikáriacich pohľadov členov výpravy bolo hneď každému jasné, že ho nezbalil nikto. Po krátkom dumaní a letmom pohľade na mapu ste sa rozhodli, že sa vyberiete k neďalekej horskej chate a skúsite svoje šťastie tam.

Úloha a odovzdávanie

Úloha sa rieši interaktívne na tejto stránke: https://people.ksp.sk/~prask/specialne/2/4/3/.

Stránka vás prevedie dalšími časťami vašeho dobrodružstva. Po splnení každej podúlohy vám stránka ukáže odkaz, kliknutím na neho dostanete body.

Veľa šťastia, snáď aj dobrú chuť :)

Ako riešiť

Pri riešení tejto úlohy budete musieť zautomatizovať a zrýchliť svoju prácu s klávesnicou a myšou. Existujú na to rôzne nástroje, s ktorými vás naučíme pracovať.

Ak používate operačný systém Windows, tak jedným z najlepších nástrojov je AutoHotKey. Stručný návod na jeho použitie nájdete tu: https://prask.ksp.sk/navody/autohotkey. Na Linuxe si ukážeme, ako pracovať s programom xdotool. Návod: https://prask.ksp.sk/navody/xdotool.

Podúloha a)

Riešenie prvej podúlohy je celkom priamočiare, je treba napísať program, ktorý za nás rýchlo nakliká koláče.

AutoHotKey

My sme na riešenie použili funkciu Click, ktorá si ako parameter berie \(x\), čo je číslo, ktoré nám hovorí, koľko krát sa funkcia vykoná. V našom prípade to bude ľubovolné rozumné čislo vačšie alebo rovné 150. Keď skript spúšťate, dajte si pozor, aby ste kurzor mali nastavený na koláči.

e::
Click 150
Return

Podúloha b)

V tejto podúlohe opäť nie je potrebné veľa rozmýšľať, ale treba sa hneď zamyslieť, ako riešenie naimplementovať. Všetko, čo potrebujeme, je písať niečo do formulára a preskakovať medzi jednotlivými oknami. Na vypisovanie do okien použijeme funkciu Send, ktorej ako parameter dáme reťazec, ktorý ma vypísať. Ako ale preskakovať medzi oknami? Jednoducho, tabulátorom – to je síce klávesa, ale vieme ho podobne ako písmena vypísať príkazom Send, ’t . Posledným problémom môžu byť políčka, ktoré je treba zaškrtnúť, tie vyriešime pomocou príkazu Send, {Space} , čím akoby “stlačíme” medzerník. Ten nám posledné dve okná označí. Už stačí len kliknúť do prvého okna a spustiť náš skript.

x::
Send, Andrej
Send, `t
Send, Král
Send, `t
Send, Génius
Send, `t
Send, Lúčka-Potoky 1
Send, `t
Send, Hlohovec
Send, `t
Send, Slovenské
Send, `t
Send, kuchár
Send, `t
Send, Chcem získať body do výsledkovky, naozaj ich potrebujem lebo chcem ísť na sústredko :)
Send, `t
Send, 10000001
Send, `t
Send, 38
Send, `t
Send, {Space}
Send, `t
Send, {Space}
Send, `t
Send, {Enter}
Return

Podúloha c)

Táto podúloha má viac možných riešení, my použijeme trochu pokročilejšie pomocou vlastných vytvorených funkcií.

Najprv potrebujeme zistiť súradnice jednotlivých obrázkov, tie si uložíme do globalných premenných.

Urobíme to pomocou funkcie MouseGetPos, ktorá si ako parameter berie 2 premenné a do nich uloži \(x\)-ovú a \(y\)-ovú súradicu na ktorej je práve kurzor. Tak si teda vytvoríme dve premenné pre každý objekt, Mäso, Cibuľu, Kapustu, Smotanu, Korenie a Hrniec. Spravíme to tak, že postupne myš namierime na každý objekt a zavoláme funkciu kdeObjekt() 1.

Tá nam uloží do našich premenných pozície jednotlivých objektov. Keď už máme súradnice, použijeme funkciu MouseClickDrag. Tá si berie 5 parametrov( \(T\), \(x\), \(y\), \(x1\), \(y1\)), prvý hovorí, s ktorým tlačidlom myši budeme pracovať ďaľšie 4 sú najprv \(x\)-ová a \(y\)-ová suradnica odkiaľ a potom kam sa má myšou ťahať. Táto funkcia na súradniciach \([x;y]\) stlačí myš, potiahne ju na nové súradnice \([x1;y1]\) a uvoľní tlačidlo. Pre každý objekt si spravíme funkciu s rovnakým názvom, ktorá nám prenesie objekt typu Objekt do hrnca.

Potom už len nakombinujeme tieto funkcie tak, aby boli v správnom poradí.

global m1, m2, c1, c2, ka1, ka2, s1, s2, ko1, ko2, h1, h2

kdeMaso() {	
    MouseGetPos, m1, m2 
}

kdeCibula() {	
    MouseGetPos, c1, c2
}

kdeKapusta() {	
    MouseGetPos, ka1, ka2
}

kdeSmotana() {	
    MouseGetPos, s1, s2
}

kdeKorenie() {	
    MouseGetPos, ko1, ko2
}

kdeHrniec() {	
    MouseGetPos, h1, h2
}

a::	
MouseGetPos, m1, m2 
Return

s::	
MouseGetPos, c1, c2
Return

d::
MouseGetPos, ka1, ka2
Return

f::	
MouseGetPos, s1, s2
Return

g::	
MouseGetPos, ko1, ko2
Return

h::	
MouseGetPos, h1, h2
Return

Maso() {	
    MouseClickDrag, L, %m1%, %m2%, h1, h2
}

Cibula() {	
    MouseClickDrag, L, %c1%, %c2%, h1, h2
}

Kapusta() {	
    MouseClickDrag, L, %ka1%, %ka2%, h1, h2
}

Smotana() {	
    MouseClickDrag, L, %s1%, %s2%, h1, h2
}

Korenie() {	
    MouseClickDrag, L, %ko1%, %ko2%, h1, h2
}

x::
Cibula()
Kapusta()
Kapusta()
Maso()
Korenie()
Maso()
Korenie()
Kapusta()
Cibula()
Smotana()
Korenie()
Korenie()
Smotana()
Maso()
Cibula()
Maso()
Cibula()
Smotana()
Return

  1. Pozri implementáciu nižšie.

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.