Autorské riešenie
[stiahni imp : py]                                       

  • Počet riešiteľov: 17 / 25 = 68 %                       

  • Úspešnosť riešenia: 3.16 / 6 = 52.3%                   

Riešenie tejto úlohy je založené na vyriešení menších úloh. Je potrebné vyhodnotiť každé kritérium, podľa ktorého sa posudzuje bezpečnosť PIN-kódu. To si rozdelíme do menších procedúr/funkcií. Postupne počítame body, ktoré dosiahol zadaný kód.

Vyhodnotenie, či je niečo palindróm (číta sa rovnako spredu aj zozadu) je jednoduché, oba použité jazyky nám ponúkajú pohodlné príkazy. Ak zadaný kód nie je palindrómom, pripočítame mu 1 bod. Použijeme na to procedúru/funkciu jePalindrom.

Zistenie počtu rôznych cifier prebieha tak, že prechádzame cifry od 0 po 9, ak sa daná cifra v kóde nachádza, pripočítame bod.

Ak je kód kratší ako 3 cifry, povieme, že rozdiely dvojíc susedov sú rovnaké. Ak je dlhší, tak si na začiatku možeme zistiť rozdiel prvej susednej dvojice (záleží na tom, v akom poradí susedov odčítavame). Potom postupne zisťujeme rozdiely medzi ostatnými susednými dvojicami(odčítavame v rovnakom poradí). Hneď ak nájdeme výsledok rôzny od toho začiatočného, tak končíme. Pre kódy s dĺžkou aspoň 3 môžeme tiež postupovať tak, že vždy porovnávame rozdiely susedov v trojici. Ak natrafíme na 2 rôzne výsledky, končíme.

;Imagine logo
viem analyzuj_kod :kod
  urobTu "body 0
  ak nieJe kod_je_aritmetickou_postupnostou :kod [
    urobTu "body :body + 1
  ]
  ak nieJe kod_je_palindrom :kod [
    urobTu "body :body + 1
  ]
  urobTu "body :body + pocet_roznych_cifier :kod
  výsledok :body
koniec


viem pocet_roznych_cifier :kod
  urobTu "pocet 0
  opakuj 10 [
    urobTu "cifra pocitadlo-1
    ak prvok? :cifra :kod [
      urobTu "pocet :pocet+1
    ]
  ]
  výsledok :pocet
koniec


viem kod_je_palindrom :kod
  výsledok :kod = prevráť :kod
koniec


viem kod_je_aritmetickou_postupnostou :kod
  ak pocet :kod > 2 [
    urobTu "rozdiel ((prvok 1 :kod) - (prvok 2 :kod))
    urobTu "p (počet :kod) - 1
    opakuj :p [
      urobTu "r (prvok počítadlo :kod) - (prvok (počítadlo+1) :kod)
      ak :rozdiel <> :r [
        výsledok "nie
      ]
    ]
  ]
  výsledok "áno
koniec
#Python
def analyzuj_kod(kod):
    bezpecnost_kodu = 0
    if not kod_je_aritmetickou_postupnostou(kod):
        bezpecnost_kodu += 1
    if not kod_je_palindrom(kod):
        bezpecnost_kodu += 1
    bezpecnost_kodu += pocet_roznych_cifier(kod)
    return bezpecnost_kodu


def kod_je_aritmetickou_postupnostou(kod):
    if len(kod) > 2:
        rozdiel = int(kod[1]) - int(kod[0])
        for i in range(1, len(kod) - 1):
            if rozdiel != int(kod[i+1]) - int(kod[i]):
                return False
    return True


def kod_je_palindrom(kod):
    return kod == kod[::-1]


def pocet_roznych_cifier(kod):
    pocet_roznych = 0
    for i in '0123456789':
        if i in kod:
            pocet_roznych += 1
    return pocet_roznych

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

Častou chybou bolo použitie absolútnej hodnoty pri zisťovaní rozdielov susedných cifier. V takom prípade máme pre kód 1234 aj 1232 rovnaký výsledok, no vidíme, že v prvom kóde je každá dalšia cifra o 1 včšia, zatiaľ čo v druhom nie. Inou častou chybou bolo obmedzenie riešenia hodnotiť bezpečnosť PIN-kódov s pevnou dĺžkou 4 cifry, čo v zadaní nebolo určené, PIN-kódy nemusia mať dĺžku 4. Stále opakujúci sa problém - ak je potrebné vytvoriť procedúru/funkciu s vhodnými parametrami, tak vstupné údaje nezískavame pomocou príkazu input alebo príkazu čítajSlovo. Taktiež, keď je požadované vrátenie hodnoty, tak hodnotu treba vrátiť, nie vypísať.