[Python] Averiguador de DNI´s españoles válidos

Iniciado por khyv123, Julio 21, 2011, 02:38:36 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 21, 2011, 02:38:36 PM Ultima modificación: Julio 23, 2011, 01:43:04 PM por khyv123
Código que muestra los posibles DNI´s (algoritmo de DNI español) que cumplan unas características especificadas:

Código: php
 Sintaxis : DNI_show.py <DNI>

- <DNI> debe tener un formato del tipo NNNNNNNNL ('N':numeros y 'L':letra).
- Los '?' equivalen a los caracteres que se quieren obtener.
- La letra no puede ser 'I','O' o 'U'.

Ejemplos:
        DNI_show.py 32734743? (Averigua la letra de un DNI)
        DNI_show.py 32?34?43K (Averigua las combinaciones validas de DNI)
        DNI_show.py 32?34?43? (Averigua las combinaciones validas de DNI)


Código: python

# ******************************************
#     Autor : khyv123 
#     Fecha de creacion : 21/07/11
#     Creado para : www.underc0de.org
# ******************************************

import sys

def letra_dni(num):
nif='TRWAGMYFPDXBNJZSQVHLCKE'
return nif[num%23]

def sintaxis():
print '\n Sintaxis : DNI_show.py <DNI>'
print '\n - <DNI> debe tener un formato del tipo NNNNNNNNL (\'N\':numeros y \'L\':letra).'
print ' - Los \'?\' equivalen a los caracteres que se quieren obtener.'
print ' - La letra no puede ser \'I\',\'O\' o \'U\'.'
print '\n Ejemplos:'
print '\tDNI_show.py 32734743? (Averigua la letra de un DNI)'
print '\tDNI_show.py 32?34?43K (Averigua las combinaciones validas de DNI)'
print '\tDNI_show.py 32?34?43? (Averigua las combinaciones validas de DNI)'

def validar(dni):
if filter(lambda x:(ord(x)<48 or ord(x)>57)and(ord(x)!=63),dni[0:8])=='' and (ord(dni[8].upper())>=65 or ord(dni[8].upper())<=90) and dni[8].upper()!=('I' or 'O' or 'U'): return True
return False

if len(sys.argv)==2:
if len(sys.argv[1])==9 and sys.argv[1][0:8]!='?'*8 and '?' in list(sys.argv[1]) and validar(sys.argv[1])==True:
num=list(sys.argv[1][0:8])
let=sys.argv[1][8]
ps=[]
for elem in range(8):
if num[elem]=='?': ps.append(elem)
if ps==[] and let=='?':
print ''.join(num)+letra_dni(int(''.join(num)))
elif ps!=[]:
for i in range(int('1'+'0'*len(ps))):
i=str(i)
while not len(i)==len(ps): i='0'+i
for j in range(len(ps)): num[ps[j]]=i[j]
if let=='?':
print ''.join(num)+letra_dni(int(''.join(num)))
elif letra_dni(int(''.join(num)))==let.upper():
print ''.join(num)+letra_dni(int(''.join(num)))
else:
sintaxis()
else:
sintaxis()



Ejemplos de uso:
Código: php
D:\>DNIshow.py 28986427?
28986427X

D:\>DNIshow.py 2?986?27A
23986427A
24986927A
27986127A
28986627A

D:\>DNIshow.py 3298?627?
32980627F
32981627H
32982627Y
32983627V
32984627M
32985627Q
32986627G
32987627S
32988627A
32989627Z

Lindo uso de filter() y lambda() man ;)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta