using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
static HashSet<string> curpsGeneradas = new HashSet<string>();
static Dictionary<string, string> entidades = new Dictionary<string, string>
{
{"AS", "Aguascalientes"},
{"BC", "Baja California"},
{"BS", "Baja California Sur"},
{"CC", "Campeche"},
{"CL", "Coahuila de Zaragoza"},
{"CM", "Colima"},
{"CS", "Chiapas"},
{"CH", "Chihuahua"},
{"DF", "Ciudad de México"},
{"DG", "Durango"},
{"GT", "Guanajuato"},
{"GR", "Guerrero"},
{"HG", "Hidalgo"},
{"JC", "Jalisco"},
{"MC", "México"},
{"MN", "Michoacán de Ocampo"},
{"MS", "Morelos"},
{"NT", "Nayarit"},
{"NL", "Nuevo León"},
{"OC", "Oaxaca"},
{"PL", "Puebla"},
{"QT", "Querétaro"},
{"QR", "Quintana Roo"},
{"SP", "San Luis Potosí"},
{"SL", "Sinaloa"},
{"SR", "Sonora"},
{"TC", "Tabasco"},
{"TS", "Tamaulipas"},
{"TL", "Tlaxcala"},
{"VZ", "Veracruz"},
{"YN", "Yucatán"},
{"ZS", "Zacatecas"},
{"NE", "Nacido en el Extranjero"}
};
static void Main()
{
Console.WriteLine("Generador de CURP");
string primerApellido = "";
string segundoApellido = "";
string nombre = "";
string fechaNacimiento = "";
string sexo = "";
string claveEntidad = "";
bool datosCorrectos = false;
while (!datosCorrectos)
{
Console.Write("Ingresa tu primer apellido: ");
primerApellido = ValidarTexto(Console.ReadLine().ToUpper());
Console.Write("Ingresa tu segundo apellido (si no tienes, deja en
blanco): ");
segundoApellido = Console.ReadLine().ToUpper();
if (string.IsNullOrEmpty(segundoApellido))
{
segundoApellido = "X";
}
else
{
segundoApellido = ValidarTexto(segundoApellido);
}
Console.Write("Ingresa tu nombre: ");
nombre = ValidarNombre(Console.ReadLine().ToUpper());
Console.WriteLine($"Verifica los datos ingresados: Nombre: {nombre},
Apellido Paterno: {primerApellido}, Apellido Materno: {segundoApellido}");
Console.Write("¿Son correctos estos datos? (si/no): ");
string confirmacion = Console.ReadLine().ToLower();
if (confirmacion == "si")
{
datosCorrectos = true;
}
else if (confirmacion == "no")
{
Console.WriteLine("Por favor, ingresa los datos de nuevo.");
}
else
{
Console.WriteLine("Opción no válida. Por favor responde con 'si' o
'no'.");
}
}
string[] fechaParts;
while (true)
{
Console.Write("Ingresa tu fecha de nacimiento (DD/MM/AAAA): ");
fechaNacimiento = Console.ReadLine();
fechaParts = fechaNacimiento.Split('/');
if (fechaParts.Length == 3 && fechaParts[0].Length == 2 &&
fechaParts[1].Length == 2 && fechaParts[2].Length == 4)
{
break;
}
else
{
Console.WriteLine("Formato de fecha incorrecto. Por favor, usa el
formato DD/MM/AAAA.");
}
}
string anio = fechaParts[2].Substring(2, 2);
string mes = fechaParts[1];
string dia = fechaParts[0];
Console.Write("Ingresa tu sexo (H/M): ");
sexo = Console.ReadLine().ToUpper();
while (sexo != "H" && sexo != "M")
{
Console.WriteLine("Entrada no válida. Por favor, ingresa 'H' para hombre o 'M'
para mujer.");
Console.Write("Ingresa tu sexo (H/M): ");
sexo = Console.ReadLine().ToUpper();
}
Console.WriteLine("Selecciona tu entidad federativa de nacimiento:");
foreach (var entidad in entidades)
{
Console.WriteLine($"{entidad.Key} - {entidad.Value}");
}
while (true)
{
Console.Write("Ingresa la clave de tu entidad federativa: ");
claveEntidad = Console.ReadLine().ToUpper();
if (entidades.ContainsKey(claveEntidad))
{
break;
}
else
{
Console.WriteLine("Clave de entidad no válida. Inténtalo de
nuevo.");
}
}
string curp = GenerarCURP(primerApellido, segundoApellido, nombre, anio,
mes, dia, sexo, claveEntidad);
while (curpsGeneradas.Contains(curp))
{
curp = GenerarCURP(primerApellido, segundoApellido, nombre, anio, mes,
dia, sexo, claveEntidad, true);
}
curpsGeneradas.Add(curp);
Console.WriteLine("Tu CURP es: " + curp)
;
}
static string GenerarCURP(string primerApellido, string segundoApellido, string
nombre, string anio, string mes, string dia, string sexo, string entidad, bool
homoclave = false)
{
string curp = "";
curp += ValidarInicial(primerApellido[0]);
curp += PrimeraVocal(primerApellido);
curp += ValidarInicial(segundoApellido[0]);
curp += ValidarInicial(nombre[0]);
curp += anio + mes + dia;
curp += sexo;
curp += entidad;
curp += PrimeraConsonante(primerApellido);
curp += PrimeraConsonante(segundoApellido);
curp += PrimeraConsonante(nombre);
curp += homoclave ? "1" : "0";
curp += "1";
return curp;
}
static char PrimeraVocal(string palabra)
{
foreach (char c in palabra.Substring(1))
{
if ("AEIOU".Contains(c))
return c;
}
return 'X';
}
static char PrimeraConsonante(string palabra)
{
foreach (char c in palabra.Substring(1))
{
if (!"AEIOU".Contains(c) && char.IsLetter(c))
return c == 'Ñ' ? 'X' : c;
}
return 'X';
}
static string ValidarInicial(char inicial)
{
if (inicial == 'Ñ' || !char.IsLetter(inicial))
{
return "X";
}
return inicial.ToString();
}
static string ValidarTexto(string texto)
{
string textoLimpio = Regex.Replace(texto, @"[^A-Z]", "X");
textoLimpio = textoLimpio.Replace("Ñ", "X");
return textoLimpio;
}
static string ValidarNombre(string nombre)
{
string[] nombresCompuestos = nombre.Split(' ');
if (nombresCompuestos.Length > 1 && (nombresCompuestos[0] == "MARIA" ||
nombresCompuestos[0] == "JOSE"))
{
return nombresCompuestos[1];
}
return nombresCompuestos[0];
}
}