News

Aggiornamento del forum in corso, ne leggete qui: http://www.python-it.org/forum/index.php?topic=7051.0.

Topic: Calcolo del codice fiscale  (Letto 5750 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline gennaro

  • python sapiens
  • *
  • moderatore
  • Post: 595
  • Punti reputazione: 0
    • Mostra profilo
Calcolo del codice fiscale
« il: Luglio 25, 2007, 20:45 »
Scrivete un programma che, dato un Cognome, un Nome, una Data di nascita ed un Comune di nascita, calcoli il codice fiscale di una persona :D  L'algoritmo lo trovate su wikipedia http://it.wikipedia.org/wiki/Codice_fiscale. Per quanto riguarda le città considerate per semplicità solo i capoluoghi di provincia... i relativi codici catastali li trovate su http://www.comuni-italiani.it/

Buon divertimento! :)

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #1 il: Luglio 25, 2007, 22:34 »
#Moduli
from sys import argv
import string

#Strutture dati Globali
vocali = ('a','e','i','o','u')
mesi = ('a','b','c','d','e','h','l','m','p','r','s','t')

#CODICI DI CONTROLLO
regole_pari = {}
alfabeto = string.ascii_lowercase
for i in xrange (0,10):
    regole_pari[str(i)] = i
for i in xrange (0,26):
    regole_pari[alfabeto[i]] = i

regole_dispari = {}
temp_tuple = (1,0,5,7,9,13,15,17,19,21)
for i in xrange(0,10):
    regole_dispari[str(i)] = temp_tuple[i]
    regole_dispari[alfabeto[i]] = temp_tuple[i]
   
temp_tuple2 = (2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23)
index = 0
for i in xrange(10,26):
    regole_dispari[alfabeto[i]] = temp_tuple2[index]
    index += 1
   
regole_resto = [alfabeto[i] for i in xrange(0,26)]
   
#------------------------------

def estrai_nome_cognome(aString):
    temp_string = ''
    for aChar in aString:
        if not aChar in vocali:
            temp_string += aChar
       
        if len(temp_string) >= 3:
            break
           
    index = 0
    while len(temp_string) < 3:
        if not aString[index] in temp_string:
            temp_string += aString[index]
        index += 1
       
    return temp_string

def genera_mese(unMese):
    return mesi[int(unMese)-1]

def genera_giorno(unGiorno, unSesso):
    if int(unGiorno) in xrange(1,31):
        if unSesso == 'm':
            return unGiorno
        elif unSesso == 'f':
            return str(int(unGiorno)+40)
       
def genera_codice_controllo(aCodiceFiscale):
    parita = 1
    temp_dispari = 0
    temp_pari = 0
   
    for aChar in aCodiceFiscale:
        if parita:
            temp_dispari += int(regole_dispari.get(aChar))
            parita = 0
        else:
            temp_pari += int(regole_pari.get(aChar))
            parita = 1
   
    return regole_resto[(temp_dispari+temp_pari) % 26]

def main():
    nome    = raw_input("Inserisci il nome : ").lower()
    cognome = raw_input("Inserisci il cognome : ").lower()
    data_nascita = raw_input("Inserisci la data di nascita (gg/mm/aaaa) : ").lower()
    comune = raw_input("Inserisci il comune di nascita : ").lower()
    sesso =  raw_input("Inserisci il tuo sesso (m/f): ").lower()
    #cognome      = string.lower(argv[1])
    #nome         = string.lower(argv[2])
    #data_nascita = string.lower(argv[3])
    #comune       = string.lower(argv[4])
    #sesso        = string.lower(argv[5])
   
    nomeCF = estrai_nome_cognome(nome)
    cognomeCF = estrai_nome_cognome(cognome)
   
    data_nascitaCF = data_nascita.split("/")
    anno_nascitaCF = data_nascitaCF[2][2:]
   
    mese_nascitaCF = genera_mese(data_nascitaCF[1])
    giorno_nascitaCF = genera_giorno(data_nascitaCF[0], sesso)
   
    codice_fiscale = cognomeCF + nomeCF + anno_nascitaCF + mese_nascitaCF + giorno_nascitaCF + 'f839'
   
    codiceCF = genera_codice_controllo(codice_fiscale)
   
    codice_fiscale += codiceCF
   
    print codice_fiscale
   
main()

Manca la parte della gestione dei comuni, ma comunque la logica è implementata.
Per favore, se qualcuno di voi voglia testarlo sostituite a questa riga (la 100):

    codice_fiscale = cognomeCF + nomeCF + anno_nascitaCF + mese_nascitaCF + giorno_nascitaCF + 'f839'

l' 'f839' che è il codice del comune di Napoli con il codice del vostro comune e controllate se è esatto:)

Ho letto questa cosa qui:
"Due diverse persone potrebbero avere uguali tutte e 16 le lettere/cifre generate usando questo schema ('omocodia'). In questo caso, l'Agenzia delle Entrate provvede a sostituire alcune delle cifre (a partire dall'ultima). In particolare, le cifre 0123456789 diventano rispettivamente LMNPQRSTUV."

Per cui immagino che sia un'eccezione che gestiscano loro....

Ciao! :)

EDIT: Corretto su segnalazione di Markon, non so perchè ma contavo 10 giorni in un mese :party:
« Ultima modifica: Luglio 26, 2007, 12:23 da earth »

Offline Coil

  • python erectus
  • ***
  • Post: 145
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #2 il: Luglio 26, 2007, 00:36 »
Ecco la mia versione:
import string
Vocals = ['a', 'e', 'i', 'o', 'u']
Alfabeto = string.ascii_uppercase
Mesi = {'01':'A', '02':'B', '03':'C', '04':'D', '05':'E', '06':'H',
        '07':'L', '08':'M', '09':'P', '10':'R', '11':'S', '12':'T'}
   
Capoluoghi = {"L'Aquila":'A345', 'Potenza':'G942', 'Catanzaro':'C352',
          'Napoli':'F839', 'Bologna':'A944', 'Trieste':'L424',
          'Roma':'H501', 'Genova':'D969', 'Milano':'F205',
          'Ancona':'A271', 'Campobasso':'B519', 'Torino':'L219',
          'Bari':'A662', 'Cagliari':'B354', 'Palermo':'G273',
          'Firenze':'D612', 'Trento':'L378', 'Perugia':'G478',
          'Aosta':'A326', 'Venezia':'L736'}

Dispari = {'0':1, '1':0, '2':5, '3':7, '4':9, '5':13,
           '6':15, '7':17, '8':19, '9':21, 'A':1, 'B':0,
           'C':5, 'D':7, 'E':9, 'F':13, 'G':15, 'H':17,
           'I':19, 'J':21, 'K':2, 'L':4, 'M':18, 'N':20,
           'O':11, 'P':3, 'Q':6, 'R':8, 'S':12, 'T':14,
           'U':16, 'V':10, 'W':22, 'X':25, 'Y':24, 'Z':23}

Pari = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5,
           '6':6, '7':7, '8':8, '9':9, 'A':0, 'B':1,
           'C':2, 'D':3, 'E':4, 'F':5, 'G':6, 'H':7,
           'I':8, 'J':9, 'K':10, 'L':11, 'M':12, 'N':13,
           'O':14, 'P':15, 'Q':16, 'R':17, 'S':18, 'T':19,
           'U':20, 'V':21, 'W':22, 'X':23, 'Y':24, 'Z':25}

def Cognome(stringa):
    lista = list(stringa)
    Cognome = ''
    if len(lista) < 3:
        lista.append('x')
    else:
        for letters  in Vocals:
            if lista.count(letters) > 0:
                for c in range(0, lista.count(letters)):
                    lista.remove(letters)
    if len(lista) < 3:
        lista = list(stringa)
        for letters in Vocals:
            if len(lista) == 3:
                break
            else:
                if lista[-1] in Vocals:
                    lista = lista[:-1]
                else:
                    if lista[-2] in Vocals:
                        lista = lista[:-2]
    elif len(lista) > 3:
        lista = lista[0:3]
    Cognome = ''.join(lista)
    Cognome.strip()
    Cognome = string.upper(Cognome)
    return Cognome

def Nome(stringa):
    lista = list(stringa)
    Nome = ''
    if len(lista) < 3:
        lista.append('x')
    else:
        for letters  in Vocals:
            if lista.count(letters) > 0:
                for c in range(0, lista.count(letters)):
                    lista.remove(letters)
    if len(lista) > 3:
        lista = lista[0] + lista[2] + lista[3]
    elif len(lista) < 3:
        for letters in Vocals:
            if len(lista) == 3:
                break
            else:
                if lista[-1] in Vocals:
                    lista = lista[:-1]
                else:
                    if lista[-2] in Vocals:
                        lista = lista[:-2]
    Nome = ''.join(lista)
    Nome.strip()
    Nome = string.upper(Nome)
    return Nome

def AnnoDiNascita(stringa):
    AnnoDiNascita = stringa[-2:]
    return AnnoDiNascita

def MeseDiNascita(stringa):
    Key = stringa[3:5]
    MeseDiNascita = Mesi[Key]
    return MeseDiNascita

def GiornoDiNascita(stringa):
    if sex == 'M':
        GiornoDiNascita = stringa[:2]
    elif sex == 'F':
        GiornoDiNascita = str(int(stringa[:2] + 40))
    return GiornoDiNascita

def ComuneDiNascita(stringa):
    ComuneDiNascita = Capoluoghi[stringa]
    return ComuneDiNascita

def LetteraDiControllo(stringa):
    Totale = 0
    ListaDispari = list(stringa[::2])
    ListaPari = list(stringa[1::2])
    for chiavi in ListaDispari:
        Totale = Totale + Dispari[chiavi]
    for chiavi in ListaPari:
        Totale = Totale + Pari[chiavi]
    Resto = Totale/26
    Resto = Alfabeto[Resto]
    return Resto

a = Cognome(raw_input("Cognome: "))
b = Nome(raw_input("Nome: "))
sex = raw_input("Sesso (m,f): ")
sex = string.upper(sex)
Data = raw_input("Data di nascita (gg/mm/aa): ")
c = AnnoDiNascita(Data)
d = MeseDiNascita(Data)
e = GiornoDiNascita(Data)
f = ComuneDiNascita(raw_input("Luogo di nascita (ES: Bologna): "))
g = LetteraDiControllo(''.join([a, b, c, d, e, f]))
print ''.join([a, b, c, d, e, f, g])

per un totale di 126 righe... non il massimo della sintesi ma è quello che mi è venuto  :caffè:

Offline Guybrush.py

  • python unicellularis
  • *
  • Post: 34
  • Punti reputazione: 0
  • "Che razza di nome é Guybrush?"
    • Mostra profilo
    • La Combriccola del pinguino
Re: Calcolo del codice fiscale
« Risposta #3 il: Luglio 26, 2007, 09:06 »
@earth

Io ti consiglio di fare l'esempio anche quando chiedi il sesso, cioè (m, f).
Non so perché ma ho ricevuto questo errore:
Citazione
Traceback (most recent call last):
  File "Codice Fiscale.py", line 104, in <module>
    main()
  File "Codice Fiscale.py", line 98, in main
    codiceCF = genera_codice_controllo(codice_fiscale)
  File "Codice Fiscale.py", line 71, in genera_codice_controllo
    temp_pari += int(regole_pari.get(aChar))       
TypeError: int() argument must be a string or a number, not 'NoneType'


@ Coil
Te invece hai messo a disposizione solo i codici dei capoluoghi, quindi le ultime lettere per molti di noi saranno diverse.
Credo che l'unica cosa sia modificare manualmente il codice, ma ovviamente voi troverete un'altra soluzione :D

ciao

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #4 il: Luglio 26, 2007, 09:18 »
In che caso ti è uscito quell'errore!?

Considera che non c'è proprio alcun controllo sui dati!

Edit: Ho aggiunto la segnalazione di come scrivere il sesso ;)
« Ultima modifica: Luglio 26, 2007, 09:19 da earth »

Offline Guybrush.py

  • python unicellularis
  • *
  • Post: 34
  • Punti reputazione: 0
  • "Che razza di nome é Guybrush?"
    • Mostra profilo
    • La Combriccola del pinguino
Re: Calcolo del codice fiscale
« Risposta #5 il: Luglio 26, 2007, 09:38 »
Uhm.... devi aver cambiato qualcos'altro nel tuo script.... perché ora funziona  :O

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #6 il: Luglio 26, 2007, 10:31 »
In realtà no! Te l'ho detto...non ci sono controlli sui dati, quindi magari bastava un piccolo errore nell'input! ;)

Offline Guybrush.py

  • python unicellularis
  • *
  • Post: 34
  • Punti reputazione: 0
  • "Che razza di nome é Guybrush?"
    • Mostra profilo
    • La Combriccola del pinguino
Re: Calcolo del codice fiscale
« Risposta #7 il: Luglio 26, 2007, 10:37 »
Sai cosa??
Credo che in quella precedente c'era di default uno spazio dopo l'opzione "Di che sesso sei?"
Quindi probabilmente era quello, perché ti posso assicurare che in tutte e due gli script ho scritto le stesse cose  :birrame:

È possibile?

ciao

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #8 il: Luglio 26, 2007, 10:54 »
Forse ho formattato meglio la stringa, non saprei dirti perchè ho sovrascritto il vecchio file!

Vabbè l'importante è che funge :hug-left:

Ho controllato e ricontrollato le tabelle...ho fatto i calcoli a mano, ma mi da sempre come lettera di controllo 'g' mentre la mia è 'i'....grrr!
« Ultima modifica: Luglio 26, 2007, 11:49 da earth »

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #9 il: Luglio 26, 2007, 12:06 »
Ho trovato l'errore, va modificato anche il Wiki...

Alla fine si fa il modulo 26, non la divisione per 26!!

Mi è venuto in mente perchè ovviamente il valore finale deve stare tra 1 e 26...cioè tra i caratteri dell'alfabeto inglese!

Offline Coil

  • python erectus
  • ***
  • Post: 145
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #10 il: Luglio 26, 2007, 13:09 »
Alla fine si fa il modulo 26, non la divisione per 26!!

Mi pareva che infatti la divisione per 26 avesse poco senso:
sul wiki si parla di 'resto' dopo aver diviso per 26, quindi pensavo inizialmente di ottenere un float (tipo 9.875), e di dover isolare il resto (875), ma poi non rientravo nelle tabelle.
Dividendo semplicemente per 26 e ottenendo l'int di default non si coprono le ultime lettere come w e y perchè non si possono ottenere risultati così alti...

Cosa intendi quindi per 'modulo' ?


@GuyBrush:
come vedi il dizionario è già bello grosso così... si potrebbe usare un database mysql (mai usato) o un documento xml, o ancora uno script che si colleghi alla pagina html del governo ed estragga il codice catastale... ma la vedo un po' impegnativa e francamente inutile: l'esercizio era sulla manipolazione delle stringhe e delle liste in fondo.

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4085
  • Punti reputazione: 5
    • Mostra profilo
    • Markon blog
Re: Calcolo del codice fiscale
« Risposta #11 il: Luglio 26, 2007, 13:46 »
Ragazzi ho un problema:

Dove li trovo i codici catastali?

Alcuni li ho rubati a coil,  8) , però ci mancano altre province..
:(

Offline earth

  • python neanderthalensis
  • *
  • moderatore
  • Post: 256
  • Punti reputazione: 0
    • Mostra profilo
Re: Calcolo del codice fiscale
« Risposta #12 il: Luglio 26, 2007, 13:48 »
Qui!

Solo che devi guardare le città..una a una...perciò io mi scoccio di finire il mio script :party:

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4085
  • Punti reputazione: 5
    • Mostra profilo
    • Markon blog
Re: Calcolo del codice fiscale
« Risposta #13 il: Luglio 26, 2007, 13:53 »
auhauhuahuauhauhauhua
cavolooooooo

Sono troppi!! maròò :)

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4085
  • Punti reputazione: 5
    • Mostra profilo
    • Markon blog
Re: Calcolo del codice fiscale
« Risposta #14 il: Luglio 26, 2007, 16:00 »
Ragazzi ho trovato questo sito dove ci sono i codici catastali etc in formato .mdb:

sito

Purtroppo non so che driver usare, sto su linux e ho installato unixodbc. Ma non riesco a gestirli :(

Il programma è "completo", una volta fatta questa cosa :)
Perchè non vediamo di risolvere ? :)
Che mi consigliate?