Autorské riešenie
[stiahni]

Pri riešení tejto úlohy si bolo potrebné uvedomiť, že čísla áut uchovávame v zozname. Keďže počet áut na križovatke môže byť od 1 do 4, bolo potrebné na začiatku rozlíšiť, či počet prvkov v zozname je 1, 2, 3 alebo 4. Pomocný súbor s pripravenou procedúrou môže však vygenerovať aj situáciu, v ktorej sa na križovatke neobjaví žiadne auto. V takom prípade je potrebné uvažovať o situácii, kedy je náš zoznam prázdny. Pre každú z týchto situácií následne vyriešime všetky možné kombinácie áut na križovatke. Na obrázku vidíme situáciu s 3 autami:

krizovatka

Ak na križovatke nebude žiadne auto, postačí nám výpis, že v tejto situácii nie je čo riešiť:

  ak pocet :zoznam = 0 [pis "|Na križovatke momentálne nemáme žiadne auto!|]

Ak je na križovatke iba jedno auto, tak sa s ňou nemusíme trápiť. Stačí zistiť, ktoré auto to je a poslať ho na druhú stranu križovatky:

   ak pocet :zoznam = 1 [
     ak prvy :zoznam = 1 [ k1'do 200 pis "|Len auto1!| ]
     ak prvy :zoznam = 2 [ k2'do 200 pis "|Len auto2!| ]
     ak prvy :zoznam = 3 [ k3'do 200 pis "|Len auto3!| ]
     ak prvy :zoznam = 4 [ k4'do 200 pis "|Len auto4!| ]
   ]

Zložitejšiu situáciu máme, ak sú na križovatke dve autá. Buď vyriešime všetky kombinácie osobitne, alebo využijeme to, že autá sú v zozname usporiadané v rastúcom poradí. Ak by to tak nebolo, zoznam na začiatku ešte utriedime. Ak v našom dvojprvkovom utriedenom zozname je rozdielom oboch prvkov (čísel áut) hodnota 2, tak autá stoja na križovatke oproti sebe a vtedy môžu prejsť križovatkou súčasne. Ak je rozdiel čísel v zozname rovný hodnote 3, tak na križovatke sú autá 1 a 4 a teda prvé vyrazí auto č.1. Ak sú na križovatke dve autá stojace vedľa seba (rozdiel čísel v zozname je rovný 1), tak prvé auto vyrazí to, ktorého číslo je väčšie.

  ak pocet :zoznam = 2 [
     urob "a prvok 1 :zoznam
     urob "b prvok 2 :zoznam
     ak :b-:a=2 [pre vsetky [do 200] pis "|Prejdú naraz|]
     ak :b-:a=3 [k1'do 200 cakaj 1000 k4'do 200 pis "|Auto1, potom auto4|]
     ak :b-:a=1 [
       ak :b = 2 [k2'do 200 cakaj 1000 k1'do 200 pis "|Auto2, potom auto1|]
       ak :b = 3 [k3'do 200 cakaj 1000 k2'do 200 pis "|Auto3, potom auto2|]
       ak :b = 4 [k4'do 200 cakaj 1000 k3'do 200 pis "|Auto4, potom auto3|]
     ]
  ]

Ak budú na križovatke tri autá, stačí zistiť, ktoré z áut sa nenachádza v zozname a potom už križovatku vieme ľahko vyriešiť:

  ak pocet :zoznam = 3 [
     ak prvok? 1 :zoznam = "nie
       [k4'do 200 cakaj 1000 k3'do 200 cakaj 1000 k2'do 200 pis "|Auto4, auto3 a auto2| ]
     ak prvok? 2 :zoznam = "nie
       [k1'do 200 cakaj 1000 k4'do 200 cakaj 1000 k3'do 200 pis "|Auto1, auto4 a auto3| ]
     ak prvok? 3 :zoznam = "nie
       [k2'do 200 cakaj 1000 k1'do 200 cakaj 1000 k4'do 200 pis "|Auto2, auto1 a auto4| ]
     ak prvok? 4 :zoznam = "nie
       [k3'do 200 cakaj 1000 k2'do 200 cakaj 1000 k1'do 200 pis "|Auto3, auto2 a auto1| ]
  ]

Nakoniec vyriešime situáciu so 4 autami. Vtedy je dôležité dohodnúť sa, ktoré auto prejde križovatkou ako prvé. V našom riešení to bude auto č. 1:

  ak pocet :zoznam = 4 [
     k1'do 200 cakaj 1000 k4'do 200 cakaj 1000 k3'do 200 cakaj 1000 k2'do 200
     pis "|Napríklad auto1, auto 4, auto 3, auto 2|
  ]

Zaujímavé riešenia:

Vaše riešenia v prevažnej väčšine využívali pripravený zoznam na evidenciu áut na križovatke. Niektorí ste sa pohrali aj s tým, či pôjde auto cez križovatku pomalšie, alebo rýchlejšie, prípadne ste auto po prejdení križovatky skryli. Uvádzame iba túto časť kódu napríklad pre súčasný prechod dvoch protistojacich áut:

   [pre [k1 k3] [opakuj 300[do 1 cakaj 1] skry]]

Niektoré riešenia boli navrhnuté ako postupné skúmanie všetkých kombinácií, iné sa snažili odhaliť nejaké zákonitosti, ktoré na križovatke platia. Situáciu pre 4 autá niektorí z vás vyriešili tak, že cez križovatku pustili niektoré z áut a potom už uplatnili pravidlo pravej ruky, niektorí výpisom dali najavo, že na križovatke nastala chyba a ďalej sa už tým nezaoberali.

Najčastejšie chyby:

  • chýbajúce posunutie áut na ploche alebo výpis poradia áut,
  • neúplnosť podmienky, ktorá testovala prítomnosť 3 áut na križovatke,
  • neprehľadnosť zdrojového kódu,
  • nevyriešenie situácie pre 4 autá alebo pustenie áut v rozhádzanom poradí (neuvedomenie si toho, že síce ako prvé auto cez križovatku môžeme vybrať ľubovoľné, ale potom už opäť platí pravidlo pravej ruky).