Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 24 / 26 = 92 %

  • Úspešnosť riešenia: 3,1 / 6 =  52 %

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.