Created
April 7, 2020 05:44
-
-
Save aaferrari/4d9d94b2c3c45d3d29e7bfae7b0e2317 to your computer and use it in GitHub Desktop.
Generador de códigos validos para http://testingchallenges.thetestingmap.org/challenge4.php Al ejecutarlo genera 5 códigos
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from random import choice | |
from datetime import datetime | |
# Se asume que los extranjeros nacieron en el sigo XX | |
centuries = {"1": "19", "2": "19", "3": "18", "4": "18", "5": "20", "6": "20", "7": "20", "8": "20", "9": "20"} | |
def gencnp(): | |
cnp = [] | |
cnp.append(str(choice(range(1,10)))) # Primer dígito | |
cnp.append('{:02d}'.format(choice(range(0,100)))) # Segundo y tercer dígito (año) | |
cnp.append('{:02d}'.format(choice(range(1,13)))) # Cuarto y quinto dígito (mes) | |
valid_day = False | |
# Verificamos que la fecha sea valida antes de seguir | |
while valid_day == False: | |
try: | |
day = choice(range(1,13)) | |
datetime(int(centuries[cnp[0]] + cnp[1]), int(cnp[2]), day) | |
cnp.append('{:02d}'.format(day)) # Sexto y séptimo dígito (día) | |
valid_day = True | |
except ValueError: pass | |
cnp.append('{:02d}'.format(choice(range(1,53)))) # Octavo y noveno dígito (código de área) | |
cnp.append('{:03d}'.format(choice(range(0,1000)))) # Décimo al décimo segundo (numero de orden) | |
# Generamos el ultimo dígito | |
multiplier =[int(digit) for digit in "279146358279"] | |
result = 0 | |
for x, y in zip(list("".join(cnp)), multiplier): | |
result = result + (int(x)*y) | |
resto = result % 11 | |
cnp.append(str(1 if resto == 10 else resto)) | |
return "".join(cnp) | |
# Generamos algunos números para probar en http://testingchallenges.thetestingmap.org/challenge4.php | |
for x in range(5): print(gencnp()) | |
""" | |
Casos positivos | |
=============== | |
4611210253033 | |
2720212010211 | |
8470709092939 | |
8090409134871 | |
3240605148291 | |
Casos negativos | |
=============== | |
0590108464250: El primer dígito (siglo) es invalido, aunque se muestra el error de "Invalid length or content". Con otros números (excepto el 9) muestra "Invalid Control Number" y con el 5 aparece "Born year bigger than current year" seguido de "Invalid date" | |
7799912152753: Mes no valido (cuarto y quinto dígito). | |
1990255072867: Día del mes no valido (sexto y séptimo dígito). | |
2020403778166: Código de área no valido (octavo y noveno dígito). | |
2071001441030: Ultimo dígito (de control) no es valido. | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment