ordinare una lista

Password Random #1

Con l’esercizio che voglio proporvi oggi come caso studio, voglio focalizzare l’attenzione sull’ottimizzazione e la potenza degli algoritmi che creiamo. Il testo del problema ci chiede di generare password random di tre tipi :

  1. solo maiuscole e minuscole
  2. maiuscole, minuscole e numeri
  3. maiuscole, minuscole, numeri e simboli $£%&()*@-
In input dovremmo leggere la lunghezza della password [10 – 20] e il numero di password da generare [1 -50].

 

L’analisi diventa fondamentale in questi esercizi più che in qualunque altro problema. Il testo infatti ci fornisce tutte le informazioni necessarie per realizzare l’algoritmo in maniera corretta. Ma, come sempre, il programmatore non ha vita facile, infatti durante il corso della creazione delle righe di codice e dopo aver eseguito il tutto, si presenta la possibilità di generare errori che devono essere risolti.

Ho deciso di dividere in due articoli diversi l’esercizio, o meglio, in questa parte vediamo la realizzazione dell’esercizio in maniera non ottimizzata, la versione base se vogliamo chiamarla così. Mentre la versione ottimizzata l’analizzeremo nel secondo capitolo del programma.

Passiamo alla pratica. Dobbiamo generare n password di l lunghezza. Questo comporta una lettura da tastiera delle due variabili e una successiva scelta da parte dell’utente nel decidere quale tipo di password generare. Infatti dobbiamo far decidere all’utilizzatore tre tipi di password differenti.

				
					print("\n1-Solo maiuscole e minuscole")
print("2-Maiuscole, minuscole e numeri")
print("3-Maiuscole, minuscole, numeri e i simboli $£%&()*@-")
    
scelta = (int)(input("Scelta del tipo di password (1-2-3)"))

 
				
			

Risoluzione

Ora che abbiamo inquadrato il problema, passiamo ad analizzare il codice che ho realizzato. Ricordo che questa versione non è ottimizzata nonostante le password random vengano generate correttamente.

Leggi articolo   Ordinare una lista di numeri
				
					n = input('Quante password vuoi generare?')
l = input('Che lunghezza deve avere la password?')

s = scelta_password()
generare_password(n, l, s)
				
			

La mancanza di controlli e di gestione degli errori porta l’algoritmo ad essere non sicuro e facilmente alterabile. Come possiamo vedere dal codice qui sopra, ho correttamente letto le due variabili n e l ma prima di richiamare le funzioni successive dobbiamo assolutamente creare dei controlli sull’input. Infatti il numero di password random deve essere compreso tra 1 e 50 e la lunghezza delle stesse tra 10 e 20 caratteri.

Troppe righe di codice ...

				
					if s ==1:
        gen1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz"
        ns = len(gen1)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen1[num:num+1]
            print(str(i+1)+"\t"+password)
    
    elif s ==2:
        gen2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789"
        ns = len(gen2)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen3[num:num+1]
            print(str(i+1)+"\t"+password)

    elif s == 3:
        gen3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789$£%&()*@-"
        ns = len(gen3)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen3[num:num+1]
            print(str(i+1)+"\t"+password)

				
			

Come possiamo vedere le righe di codice sono troppe ! Questa parte dell’algoritmo è il corpo del programma e deve essere ottimizzato nel migliori dei modi. Come vediamo, ho creato tre parti di codice identiche per le tre scelte delle password. ioè, sia se s == 1 che s == 2 e s == 3, tutto resta invariato e questo non va bene, o meglio, rende il nostro programma lento e non ottimizzato.

Queste tre procedure dovremmo racchiunderle in un’unica soluzione per potenziare l’algoritmo.

password random

L’output è corretto, il programma è corretto perchè funziona. Ma non può essere un algoritmo di cui andare fieri perchè pieno di errori da gestire.

Implementiamo l'algoritmo - password random

				
					import random

def scelta_password():
    print("\n1-Solo maiuscole e minuscole")
    print("2-Maiuscole, minuscole e numeri")
    print("3-Maiuscole, minuscole, numeri e i simboli $£%&()*@-")
    scelta = (int)(input("Scelta del tipo di password (1-2-3)"))

    return scelta

#Possibilità di ottimizzare il programma per renderlo più potente      
def generare_password(n, l, s):
    if s ==1:
        gen1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz"
        ns = len(gen1)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen1[num:num+1]
            print(str(i+1)+"\t"+password)
    
    elif s ==2:
        gen2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789"
        ns = len(gen2)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen3[num:num+1]
            print(str(i+1)+"\t"+password)

    elif s == 3:
        gen3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789$£%&()*@-"
        ns = len(gen3)
        for i in range(int(n)):
            password =""
            for j in range(int(l)):
                num=random.randint(0,ns)
                password=password+gen3[num:num+1]
            print(str(i+1)+"\t"+password)

 #migliorare il programma con i controlli di errore !
n = input('Quante password vuoi generare?')
l = input('Che lunghezza deve avere la password?')

s = scelta_password()
generare_password(n, l, s)
				
			

L’algoritmo ottimizzato per generare password random andremo ad analizzarlo nel prossimo articolo. Capiamo quanto sia importante realizzare delle righe di codice potenti per permettere ai nostri programmi di essere utilizzabili e sicuri. Per testare il funzionamento dell’algoritmo consiglio di scaricare un editor di testo come Visual Studio Code o
usufruire degli editor online gratis che permettono, senza scaricare alcun tipo di file, di realizzare algoritmi e testarli. Dopo averne valutati alcuni, ho deciso di affidarmi a Repl.it, semplice, affidabile e potente.

Leggi articolo   La serra intelligente - Raspberry Pi

Buon Coding : )

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp