Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 8 / 14 = 57 %

  • Úspešnosť riešenia: 3.5/6 = 58%

V tejto úlohe ste mohli získať najviac 6 bodov. Riešenie tejto úlohy si môžeme rozdeliť do niekoľkých fáz:

  • Najskôr si pripravíme potrebné premenné. Budeme potrebovať zoznam (zoznamPrikazov), ktorý bude obsahovať príkazy z programovacieho jazyka, v ktorom programujeme túto súťažnú úlohu. Z uvedeného zoznamu príkazov náhodne vyberieme jeden príkaz, ktorý bude musieť hráč hry uhádnuť, tento príkaz uložíme do premennej s názvom slovo. Ďalej vytvoríme premennú uhadniMa, ktorá bude pozostávať z rovnakého počtu hviezdičiek ako je počet písmen v hľadanom slove. Nesmieme zabúdať ani na premennú, ktorá počíta počet chybných pokusov (pocetChyb). Táto premenná má po úvodnom spustení programu hodnotu 0.
  • V druhej fáze zabezpečíme beh samotného programu. Písmená hľadaného slova sa hádajú dovtedy, kým nie je počet nesprávnych pokusov väčší ako tri (hráč hry sa môže pomýliť najmenej trikrát), alebo naopak, kým hráč neuhádne všetky písmená v hľadanom slove. Obidve podmienky teda spojíme v cykle while.
  • Teraz môžeme preveriť, či sa zadaný znak nachádza v hľadanom slove. Ak sa znak v slove nachádza, zapamätáme si jeho pozíciu v slove a na rovnakej pozícii vymeníme v premennej uhadniMa hviezdičku za zadané písmeno. Takto vymeníme všetky výskyty zadaného písmena v hľadanom slove. Ak sa však zadaný znak v slove nenachádza, počet chybných pokusov sa zvýši o jeden, teda premenná pocetChyb iteruje svoju hodnotu. Túto časť vložíme do cyklu while, ktorý zabezpečuje priebeh hry.
Jeden bod ste mohli získať za to, že program plynule komunikuje s hráčom (výzva na zadanie vstupu, informovanie hráča o nesprávnych pokusoch alebo o ukončení hry). Dva body ste z plného počtu mohli získať, keď Váš program správne overuje výskyt zadaného písmenka v hľadanom príkaze. Ďalšie dva body získate, ak Váš program správne nahradí hviezdičku zadaným písmenom vo všetkých jeho výskytoch. A napokon, posledný bod, je za správne ukončenie programu a kontorlu chybných pokusov.

Riešenie úlohy naprogramované v jazyku Logo.

;Imagine logo
viem hadajPrikaz
  ;najskôr si vytvoríme lokálne premenné, ktoré budeme potrebovať:
  na kódy riešenia používajte div blok s css triedou "code"
  urobTu "zoznamPrikazov [pis cakaj urob]
  urobTu "hladanyPrikaz ?prvok :zoznamPrikazov
  urobTu "uhadniMa "
  urobTu "pocetChyb 0

  ;premennú uhadniMa naplníme hviezdičkami, v závislosti od počtu písmen hľadaného príkazu
  opakuj pocet :hladanyPrikaz [
    urobTu "uhadniMa vlozPr :uhadniMa "*
  ]

  ;nesmieme zabúdať aj na komunikatívne používateľské rozhranie
  pis "|Uhádni príkaz! Môžeš sa najviac 3 krát pomýliť.|

  ;opakujeme, kým uhadniMa obsahuje hviezdicky a kým nie je pocetChýb rovný 4
  kym [zaroveň prvok? "* :uhadniMa :pocetChyb<4][
    pis :uhadniMa
    urobTu "citanePismeno citajSlovo
    urobTu "spravne 0
    opakuj pocet :hladanyPrikaz [
      ak (:citanePismeno = prvok pocitadlo :hladanyPrikaz)[
        urobTu "uhadniMa nahraď pocitadlo :uhadniMa :citanePismeno
        urobTu "spravne 1
      ]
    ]
    ak (:spravne = 0)[
      urobTu "pocetChyb :pocetChyb + 1
      (pis "|Pismeno sa v hľadanom slove nenachádza. Počet chýb:| :pocetChyb)
    ]
  ]

  ;na záver vyhlásime výsledok
  ak2 (:pocetChyb<4)[
    (pis "|Gratulujem, uhádol si! Hľadaný príkaz je: | :hladanyPrikaz)
  ][
    (pis "|Neuhádol si! Hľadaný príkaz je: | :hladanyPrikaz)
  ]

koniec

Riešenie úlohy naprogramované v jazyku Python.

# coding=utf-8
import random


def uhadniPrikaz():
    """
    Spravne riesenie.
    :type:
    :param:
    :rtype : object
    :return:
    """
    print('Uhádni príkaz! Môžeš sa najviac 3 krát pomýliť.')
    pocetChyb = 0

    zoznamPrikazov = ['return', 'while', 'print','random','len']

    slovo = random.choice(zoznamPrikazov)
    uhadniMa = len(slovo) * '*'

    while '*' in uhadniMa and pocetChyb < 4:
        print(uhadniMa)
        pismeno = input('Zadaj písmeno:')
        if pismeno not in slovo:
            pocetChyb = pocetChyb + 1
            print('Pismeno sa v slove nenachádza. Pocet chyb: ' + str(pocetChyb))
        else:
            for i in range(len(slovo)):
                if slovo[i] == pismeno:
                    uhadniMa = uhadniMa[:i] + pismeno + uhadniMa[i + 1:]

    if pocetChyb < 4:
        print('Gratulujem, uhádol si! Hľadaný príkaz je: ' + slovo)
    else:
        print('Neuhádol si! Hľadaný príkaz je: ' + slovo)


uhadniPrikaz()

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

Túto úlohu sa pokúsilo vyriešiť osem tímov. Za najúspešnejších riešiteľov v jazyku Python môžeme vyhlásiť tím MatejHanus. V prostredí Imagine dosiahol plný počet bodov tím expert aa. Potešilo nás, že ste sa snažili vykresliť hľadané slovo na plochu a graficky ozvláštniť svoje riešenia. Často sme sa však stretávali s nedokončenými (neúplnými) riešeniami, za ktoré sme žiaľ nemohli udeliť plný počet bodov. Najčastejšie chyby, ktoré ste urobili vo svojich riešeniach:

  • nesprávny počet možných pokusov - netreba zabúdať, že hráč hry sa môže pomýliť najviac trikrát,
  • neúplné riešenie zadania,
  • po zadaní písmena sa nenahradia všetky jeho výskyty v hľadanom slove - zle stanovená podmienka.