Autorské riešenie
[stiahni]

Úlohu si rozdelíme na niekoľko častí. Najprv je potrebné vytvoriť si premenné, s ktorými budeme pracovať, sú to výšky veží a vzdialenosti veží.
Pomocou procedúry štart si tieto premenné vytvoríme:

viem start
  urob "dlzky [ [0 50 110 60 30 70 20]
                [50 0 60 110 60 60 30]
                [110 60 0 50 80 40 90] 
                [60 110 50 0 50 50 80]
                [30 60 80 50 0 40 30]
                [70 60 40 50 40 0 50]
                [20 30 90 80 30 50 0]
              ]
 urob "vysky [100 80 130 40 50 70 0]
 koniec

Ďalej potrebujeme vypočítať vzdialenosť medzi vežami

veze

Na tento výpočet použijeme procedúru s troma parametrami, a to výšku prvej veže, výšku druhej veže a vzdialenosť medzi vežami. Vzdialenosť z jednej veže na druhú vypočítame pomocou Pytagorovej vety. Procedúra vyzerá takto:

viem vzdialenost :vyska1 :vyska2 :vzdialenost
   urob "vzd sqrt((abs(:vyska1-:vyska2))*(abs(:vyska1-:vyska2))+ :vzdialenost*:vzdialenost)
   vysledok :vzd
 koniec 

Procedúra nám bude vracať číslo, ktoré predstavuje vzdialenosť medzi vežami. S týmto číslom budeme pracovať v procedúre počítaj.

Vstup procedúry počítaj je zoznam čísel.
K tomuto zoznamu pridáme na začiatok a koniec číslo 7, čo predstavuje že Drago ide na návštevu z domu a po skončení všetkých návštev sa vracia domov. Do premennej miesta si uložíme počet miest a premennú spolu vynulujeme (do nej budeme pripočítavať koľko má Drago nalietaných metrov).

urob "x vlozprvy 7 :x
urob "x vlozposledny 7 :x
urob "miesta pocet :x
urob "spolu 0

Ďalej v cykle kým miesta>1 budeme počítať vzdialenosť prvej a druhej veže zo zoznamu. Na konci cyklu sa prvá veža vynechá zo zoznamu a všetky ostatné sa posunú o jedno dopredu.

Zo zoznamu vyberieme prvú vežu a výšku prvej veže

;cislo prvej veze 
 urob "a prvok 1 :x 
 ;vyska prvej veze
 urob "av prvok :a :vysky 

ďalej vyberieme druhú vežu a výšku druhej veže

;cislo veze, ktora nasleduje
      urob "b prvok 2 :x
      ;vyska veze, ktora nasleduje
      urob "bv prvok :b :vysky   

vzdušnú vzdialenosť dvoch veží dostaneme pomocou príkazov

;vzdialenost dvoch miest
 urob "d prvok :b prvok :a :dlzka 

z týchto premenných ideme vypočítať vzdialenosť medzi vežami a to tak, že zavoláme procedúru vzdialenosť s parametrami av, bv a d. To čo nám vráti procedúra vzdialenosť pripočítame do premennej spolu.
Upravíme premennú miesta o jedno menej a zo zoznamu x odoberieme prvý prvok.

Celá procedúra vyzerá takto:

viem pocitaj :x 
  urob "x vlozprvy 7 :x
  urob "x vlozposledny 7 :x
  urob "miesta pocet :x
  urob "spolu 0
  kym [:miesta>1]
  [
    ;cislo prvej veze
    urob "a prvok 1 :x
    ;vyska prvej veze
    urob "av prvok :a :vysky
  
    ;cislo veze, ktora nasleduje
    urob "b prvok 2 :x
    ;vyska veze, ktora nasleduje
    urob "bv prvok :b :vysky
    ;vzdialenost dvoch miest
    urob "d prvok :b prvok :a :dlzka
  
    ;spolu vzdialenost, co zatial nalietal Drago
    urob "spolu :spolu + vzdialenost :av :bv :d 
    urob "x bezprveho :x
    urob "miesta :miesta-1
  ]
  pis :spolu
      koniec

 

Najčastejšie chyby