Autorské riešenie
[stiahni imp : py]                                       

  • Počet riešiteľov: 2 / 2 = 100 %

  • Úspešnosť riešenia: 3,5 / 6 = 58 %

Úloha sa dá riešiť viacerými postupmi, ktoré považujeme za rovnocenné:

  • výpočet vzorcom, s podmienkami a cyklom
  • výpočet vzorcom, s podmienkami a rekurziou
  • výpočet vzorcom, s podmienkami a zoznamom (málo prvkov)
  • výpočet jednoduchým vzorcom hrubou silou, s podmienkami a zoznamom (veľa prvkov)

Autorské riešenie: výpočet vzorcom, s podmienkami, cyklom a zoznamom - toto riešenie je elegantné, na málo riadkov a rovnoko obtiažne v jazykoch Imagine a Python. Rekurzia vyžaduje od programátora lepšie abstraktné myslenie, je to elegantné riešenie, ale rekurzia v niektorých vývojových prostrediach nebude fungovať vo väčšom počte krokov (nad 1000).

Úloha je výpočtová. V programe najprv spracujme číselný vstup a číselný výstup. Neberieme do úvahy vstupy < 1, aby nedošlo k nedorozumeniu, pretože rok je radová číslovka, teda rok 0 nemá zmysel. Preto pre vstupy < 1 program vráti 0. Potom pre vstupy >= 1 vypočítame počet sadeníc podľa pravidiel. Úlohu si rozdeľme na čiastkové úlohy, najprv riešme len pravidlo 1, potom pridáme pravidlo 2, potom pravidlo 3 a nakoniec pravidlo 4.

Je dobré vypočítať úlohu ručne na papier v tabuľke: číslo roku, použité pravidlá, prírastok v danom roku, úbytok v danom roku, celkový počet sadeníc v danom roku. Podľa tabuľky vieme, čo má program vypočítať. Do programu môžeme dočasne vložiť pomocné výpisy na obrazovku podľa tabuľky, alebo použiť krokovanie so sledovaním premenných.

Vstup n je začiatok n-tého roku, posledný prírastok bol v roku n-1, celkový počet sadeníc platí pre začiatok n-tého roku). Vypočítavame prírastky sadeníc (plus) v každom roku od 1 po n-1 podľa zadaných pravidiel 1, 2, 3. Pravidlo 2: každý druhý rok (párny rok) určíme ako zvyšok po delení (modulo) číslom 2. Pravidlo 1 platí vtedy, keď neplatí pravidlo 2. Pridáme pravidlo 3 pomocou zvyšku po delení číslom 5. Celkový počet sadeníc (pocet) vypočítame ako súčet prírastkov v každom roku od 1 po n-1 a odpočítavame uhynuté sadenice v každom roku (minus). Pravidlo 4 riešime pomocou 5-prvkového zásobníka, kde držíme 5-ročnú históriu prírastkov. V každom roku prírastok (plus) pridáme na koniec zásobníka (minus). Od súčtu sadeníc sa odpočítava začiatok zasobníka a zásobník sa posunie doľava (začiatok sa vymaže, pridá sa na koniec).

Do programu pridáme komentár pre vysvetlenie pomenovania premenných a postupu výpočtu.

;Imagine logo
viem pocetSadenic :n
  urobTu "minus [0 0 0 0 1]
  urobTu "Pocet 0
  ak :n>0 [
    urobTu "Pocet 1
    opakuj :n-1 [
      urobTu "i pocitadlo
      ak2 zvysok :i 5 =0 [
        urobTu "plus 0
      ] [
        ak2 zvysok :i 2 =0 [
          UrobTu "plus :pocet*2
        ] [
          UrobTu "plus :pocet
        ]
      ]
      UrobTu "pocet (:pocet+:plus - (prvok 1 :minus))
      urobTu "minus bezPr :minus
      urob "minus vlozPo :plus :minus
    ]
  ]
  pis (slovo "|Pocet sadenic:| :pocet)
koniec
#Python
def pocetSadenic(n):
    '''
    Funkcia vrati pocet sadenic v zadanom roku.
    :param n: cislo roku
    :type n: int
    :return: pocet sadenic
    :rtype: int
    '''
    minus=[0,0,0,0,1]               # zasobnik pre pocet uhynutych
    pocet=0
    if n>0:
        pocet=1
        for i in range(1,n):
            if i%5==0:              # pravidlo 3
                plus=0
            elif i%2==0:            # pravidlo 2
                plus=pocet*2
            else:                   # pravidlo 1
                plus=pocet
            pocet+=plus-minus[0]    # pravidlo 4
            del minus[0]
            minus.append(plus)
    return pocet

Vaše zaujímavé riešenia a najčastejšie chyby

Ľahko sa da pomýliť v číslovaní rokov. Každý druhý rok má byť párny rok (2, 4, 6...).