Officially, I also searched and did not find anything about it, I believe that if there were, I would be at IBGE.
The solution could be a proper algorithm, and of course, keep these records stored in case there is a new city in the state, the result is the same.
C A little time and a lot of for
s, I did this algorithm to generate the acronyms, I did not take into account the UF, and the city ordering is alphabetical.
B so the first letter is the first letter of the first word. The second letter, the beginning of the second word. The third letter, the initial of the last word.
If this is not possible, try to get the next letters, the next or previous words (in the case of the last letter).
If it is not possible, try to get the next 2 letters of the first word, and if it is not possible, go through the first word in a reverse way trying to assemble the acronym.
If, after all attempts, it is not possible, the success flag will remain false and the system warns that it did not generate an acronym for that word.
Follow the commented code:
static void Main(string[] args)
{
List<string> cidades = new List<string>(645);
#region addCidades
cidades.Add("BIRITIBA-MIRIM");
cidades.Add("BOA ESPERANCA DO SUL");
cidades.Add("CONCHAL");
cidades.Add("DOBRADA");
cidades.Add("DOIS CORREGOS");
cidades.Add("MERIDIANO");
cidades.Add("MESOPOLIS");
cidades.Add("MIGUELOPOLIS");
cidades.Add("MINEIROS DO TIETE");
cidades.Add("MIRA ESTRELA");
cidades.Add("MIRACATU");
cidades.Add("MIRANDOPOLIS");
cidades.Add("NOVA CAMPINA");
cidades.Add("PANORAMA");
cidades.Add("VIRADOURO");
cidades.Add("VISTA ALEGRE DO ALTO");
cidades.Add("VITORIA BRASIL");
cidades.Add("VOTORANTIM");
cidades.Add("VOTUPORANGA");
cidades.Add("ZACARIAS");
#endregion
//Primeiro a lista é ordenada por ordem alfabética, fazendo com que a sigla SAL seja gerada para a cidade SALES e não para a cidade SALTO.
Dictionary<string, string> siglas = new Dictionary<string, string>();
foreach (string c in cidades)
{
string[] cs = c.Replace("'", " ").Replace("-"," ").Split(' '); //Depois, vamos separar cada nome em palavras com o 'Split(' ')', observando que as cidades com hifén ou apóstrofo também são separadas em palavras.
bool sucesso = false;
string sigla = null;
for (int i = 0; i < cs.Length && !sucesso; i++) //Percorrer cada palavra
{
for (int j = 0; j < cs[i].Length && !sucesso; j++) //Percorrer cada letra da palavra atual (i)
{
sigla = cs[i][j].ToString(); //Primeira letra da sigla
for (int k = i+1; k < cs.Length && !sucesso; k++) //Se há mais palavras depois da palavra atual (i), entra no for
{
for (int l = 0; l < cs[k].Length && !sucesso; l++) //Percorre cada letra da palavra (k)
{
sigla = cs[i][j].ToString() + cs[k][l].ToString(); //Segunda letra da sigla
for (int m = cs.Length-1; m > k && !sucesso; m--) //Se há mais palavras além da palavra (k), entra no for
{
for (int n = 0; n < cs[m].Length && !sucesso; n++) //Percorre cada letra da palavra (m)
{
sigla = cs[i][j].ToString() + cs[k][l].ToString() + cs[m][n].ToString(); //Terceira letra da sigla
if (!siglas.ContainsKey(sigla)) //Se a sigla ainda não foi utilizada
{
siglas.Add(sigla, c); //Adiciona no dicionário
sucesso = true; //Marca a flag como sucesso pra sair de todos os outros for
}
}
}
for (int m = l+1; m < cs[k].Length && !sucesso; m++) //Se não gerou a terceira letra com a palavra m, percorre as letras seguintes à (l) da palavra (k)
{
sigla = cs[i][j].ToString() + cs[k][l].ToString() + cs[k][m].ToString(); //Terceira letra da sigla
if (!siglas.ContainsKey(sigla)) //Se a sigla ainda não foi utilizada
{
siglas.Add(sigla, c); //Adiciona no dicionário
sucesso = true; //Marca a flag como sucesso pra sair de todos os outros for
}
}
}
}
for (int m = j + 1; m < cs[i].Length && !sucesso; m++) //Se não gerou a segunda letra com a palavra (k) percorre a palavra [i]
{
if (m + 1 < cs[i].Length) //Dá preferência a letra seguinte se existir
{
sigla = cs[i][j].ToString() + cs[i][m].ToString() + cs[i][m + 1].ToString(); //Compoe a sigla com a segunda (m) e terceira letra (m+1)
if (!siglas.ContainsKey(sigla)) //Se a sigla ainda não foi utilizada
{
siglas.Add(sigla, c); //Adiciona no dicionário
sucesso = true; //Marca a flag como sucesso pra sair de todos os outros for
}
}
for (int n = cs[i].Length - 1; n >= 0 && !sucesso; n--) //Percorre a palavra (i) no sentido inverso para gerar a terceira letra
{
sigla = cs[i][j].ToString() + cs[i][m].ToString() + cs[i][n].ToString(); //Compoe a sigla com a segunda (m) e terceira letra (n)
if (!siglas.ContainsKey(sigla)) //Se a sigla ainda não foi utilizada
{
siglas.Add(sigla, c); //Adiciona no dicionário
sucesso = true; //Marca a flag como sucesso pra sair de todos os outros for
}
}
}
}
}
if (sucesso) //Se foi possível gerar a sigla
{
Console.WriteLine("Sigla " + sigla + " gerada para a cidade " + c);
}
else //Se nenhuma combinação foi possível
{
Console.WriteLine("Não foi gerada sigla para a cidade " + c);
}
}
Console.WriteLine("Siglas geradas: " + siglas.Count + " de um total de " + cidades.Count+" cidades");
Console.ReadKey();
}
Result:
Sigla BMI gerada para a cidade BIRITIBA-MIRIM
Sigla BES gerada para a cidade BOA ESPERANCA DO SUL
Sigla CON gerada para a cidade CONCHAL
Sigla DOB gerada para a cidade DOBRADA
Sigla DCO gerada para a cidade DOIS CORREGOS
Sigla MER gerada para a cidade MERIDIANO
Sigla MES gerada para a cidade MESOPOLIS
Sigla MIG gerada para a cidade MIGUELOPOLIS
Sigla MDT gerada para a cidade MINEIROS DO TIETE
Sigla MET gerada para a cidade MIRA ESTRELA
Sigla MIR gerada para a cidade MIRACATU
Sigla MIS gerada para a cidade MIRANDOPOLIS
Sigla NCA gerada para a cidade NOVA CAMPINA
Sigla PAN gerada para a cidade PANORAMA
Sigla VIR gerada para a cidade VIRADOURO
Sigla VAA gerada para a cidade VISTA ALEGRE DO ALTO
Sigla VBR gerada para a cidade VITORIA BRASIL
Sigla VOT gerada para a cidade VOTORANTIM
Sigla VOA gerada para a cidade VOTUPORANGA
Sigla ZAC gerada para a cidade ZACARIAS
Siglas geradas: 20 de um total de 20 cidades
I put it in .NETFiddle
Obs. For the length of the code, I put only 20 cities. In Fiddle it has all the 645 of SP that I had here in the base.
Extra:
I generated the acronym for 2977 cities I have here at the base and there were no problems: