Autorské riešenie
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 #Pythondef 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ť. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |