- Intersect (r1, r2, r3, ...) - výsledkem jsou ty body, které leží ve všech daných obdélnících
- Union (r1, r2, r3, ...) - výsledkem je sjednocení
- Difference (r1, r2, r3, ...) - výsledkem jsou ty body, které leží v právě jednom zadaném obdélníku
Operace se zadávají jako jméno operace velkými písmeny a pak ve složených závorkách argumenty. Argument může být buď obdélník, nebo další operace a její argumenty.
První řádek má tvar SCENE('%', šířka scény, výška scény), kde ten znak v prvním argumentu je pozadí.
Takže celý vstup může být třeba takto:
Kód: Vybrat vše
SCENE('.', 15, 10)
{
RECTANGLE('x', 1, 1, 3, 3, 20)
RECTANGLE('@', 2, 3, 5, 2, 10)
INTERSECT{
RECTANGLE('=', 0, 6, 10, 2, 30)
RECTANGLE('V', 1, 5, 8, 4, 40)
}
DIFFERENCE {
RECTANGLE(...)
UNION
{
INTERSECT
{
RECTANGLE(...)
RECTANGLE(...)
DIFFERENCE
{
RECTANGLE(...)
RECTANGLE(...)
}
}
}
}
}
Kód: Vybrat vše
...............
.xxx...........
.xxx...........
.x@@@@@........
..@@@@@........
...............
.========......
.========......
...............
...............
To zanořování operací muselo fungovat logicky úplně správně, takže třeba Difference ( Union ( A, B ), C ) muselo dát body buď (v C a ne v A a ne v B) nebo (ne v C a (v A nebo v B)) a tak podobně.
Scéna se vešla do paměti celá, STL povoleno, vstup jsme původně měli kontrolovat, ale když ani po dvou hodinách nikdo neodevzdal, tak jsme se mohli na korektnost vstupu spolehnout. Celkově se mi to zdálo jako jeden z těžších příkladů a ve spolek lidem nejspíš taky - já jsem odcházel po třech hodinách a jestli jsem nebyl první úspěšný, tak nanejvýš druhý nebo třetí. Tou dobou už pár lidí raději odešlo s nepořízenou, ostatní ještě seděli a chlapík už se poptával, kdo to tak do čtvrt hodiny dodělá. Jak to nakonec dopadlo, nevím.