Autorské riešenie
Pre vytvorenie registračného čísla potrebujeme vedieť, kedy sa obyvateľ narodil (deň, mesiac, rok) a jeho pohlavie. Funkcia teda musí mať definované tieto štyri parametre. Z údajov dátumu narodenia vieme vytvoriť začiatok identifikačného čísla: # Python def generuj_id(den, mesiac, rok, pohlavie): id = rok * 10000 + mesiac * 100 + den id = id * 10000 Základ pre vytváranie identifikačných čísiel je číslo, ktoré končí 0000. Namiesto týchto núl budeme pridávať také štvorciferné čísla, aby celé identifikačné číslo bolo deliteľné 97 (ak ide o ženu) alebo 107 (ak ide o muža). Prvoplánové riešenie môže byť také, že budeme skúšať všetky koncovky od 0000 do 9999. Pre každú koncovku otestujeme deliteľnosť celého identifikačného čísla a ak bude deliteľné požadovaným číslom, tak ho pridáme do výstupného zoznamu. Skúsme vytvoriť efektívnejšie riešenie. Nájdime prvé identifikačné číslo, ktoré spĺňa požiadavku deliteľnosti. Ďalšie identifikačné čísla získame tak, že koncovku budeme zvyšovať o násobky deliteľa. # Python def generuj_id(den, mesiac, rok, pohlavie): del_muz = 107 del_zena = 97 id = rok * 10000 + mesiac * 100 + den id = id * 10000 zoznam_id = [] if pohlavie == 'muz': start = del_muz - id % del_muz # prva koncovka pre splnenie delitelnosti # dalsie koncovky ziskame tak, ze prvu budeme zvysovat o nasobky delitela for xxxx in range(start, 10000, del_muz): zoznam_id.append(id + xxxx) else: start = del_zena - id % del_zena # prva koncovka pre splnenie delitelnosti # dalsie koncovky ziskame tak, ze prvu budeme zvysovat o nasobky delitela for xxxx in range(start, 10000, del_zena): zoznam_id.append(id + xxxx) return zoznam_id Nezabudnime ešte na jeden podstatný detail. Z identifikačného čísla obyvateľa by sa mali dať spätne zistiť dátum jeho narodenia a pohlavie. Ak ale vygenerujeme identifikačné číslo, ktoré bude deliteľné 97 aj 107 zároveň, nebudeme vedieť určiť pohlavie. Pridajme teda ešte podmienku, ktorá zabezpečí, že identifikačné čísla mužov nebudú deliteľné 97 a identifikačné čísla žien nebudú deliteľné 107. Výsledné riešene môže vyzerať nasledovne: # Python def generuj_id(den, mesiac, rok, pohlavie): del_muz = 107 del_zena = 97 id = rok * 10000 + mesiac * 100 + den id = id * 10000 zoznam_id = [] if pohlavie == 'muz': start = del_muz - id % del_muz # prva koncovka pre splnenie delitelnosti # dalsie koncovky ziskame tak, ze prvu budeme zvysovat o nasobky delitela for xxxx in range(start, 10000, del_muz): if (id + xxxx) % del_zena != 0: zoznam_id.append(id + xxxx) else: start = del_zena - id % del_zena # prva koncovka pre splnenie delitelnosti # dalsie koncovky ziskame tak, ze prvu budeme zvysovat o nasobky delitela for xxxx in range(start, 10000, del_zena): if (id + xxxx) % del_muz != 0: zoznam_id.append(id + xxxx) return zoznam_id print(generuj_id(1, 1, 1971, 'muz')) print(generuj_id(1, 1, 1971, 'zena')) Vaše zaujímavé riešenia a najčastejšie chyby Suverénne najčastejšou chybou bolo, že ste zabudli vylúčiť čísla, ktoré sú deliteľné 97 aj 107 súčasne. Tieto sa nedajú použiť ako identifikačné čísla, lebo z nich nie je možné určiť pohlavie obyvateľa. Pomerne častou chybou bolo aj to, že podmienku deliteľnosti ste aplikovali len na koncovku čísla. Túto podmienku by však malo spĺňať celé číslo. Problém niektorým z vás robil aj efektívny návrh riešenia. Pri generovaní ste skúšali deliteľnosť pre všetky koncovky. Stačilo však vypočítať prvú koncovku a dalšie generovať postupným pripočítavaním deliteľa. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |