diff --git a/.gitignore b/.gitignore index 0a9ca7b..3e3c159 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,22 @@ duplicados/obj/Debug/netcoreapp3.1/duplicados.csproj.FileListAbsolute.txt duplicados/obj/Debug/netcoreapp3.1/duplicados.csprojAssemblyReference.cache duplicados/obj/Debug/netcoreapp3.1/duplicados.dll duplicados/obj/Debug/netcoreapp3.1/duplicados.pdb +palindromos/bin/Debug/netcoreapp3.1/palindromos +palindromos/bin/Debug/netcoreapp3.1/palindromos.deps.json +palindromos/bin/Debug/netcoreapp3.1/palindromos.dll +palindromos/bin/Debug/netcoreapp3.1/palindromos.pdb +palindromos/bin/Debug/netcoreapp3.1/palindromos.runtimeconfig.dev.json +palindromos/bin/Debug/netcoreapp3.1/palindromos.runtimeconfig.json +palindromos/obj/palindromos.csproj.nuget.cache +palindromos/obj/palindromos.csproj.nuget.dgspec.json +palindromos/obj/palindromos.csproj.nuget.g.props +palindromos/obj/palindromos.csproj.nuget.g.targets +palindromos/obj/project.assets.json +palindromos/obj/Debug/netcoreapp3.1/palindromos +palindromos/obj/Debug/netcoreapp3.1/palindromos.AssemblyInfo.cs +palindromos/obj/Debug/netcoreapp3.1/palindromos.AssemblyInfoInputs.cache +palindromos/obj/Debug/netcoreapp3.1/palindromos.assets.cache +palindromos/obj/Debug/netcoreapp3.1/palindromos.csproj.FileListAbsolute.txt +palindromos/obj/Debug/netcoreapp3.1/palindromos.csprojAssemblyReference.cache +palindromos/obj/Debug/netcoreapp3.1/palindromos.dll +palindromos/obj/Debug/netcoreapp3.1/palindromos.pdb diff --git a/.vscode/launch.json b/.vscode/launch.json index 6641488..79bd94c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,9 +3,9 @@ // Use hover for the description of the existing attributes // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md "version": "0.2.0", - "configurations": [ + "configurations": [ { - "name": ".NET Core Launch (console)", + "name": "Duplicados", "type": "coreclr", "request": "launch", "preLaunchTask": "build", @@ -17,11 +17,25 @@ "console": "internalConsole", "stopAtEntry": false }, + { + "name": "Palindromos", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/palindromos/bin/Debug/netcoreapp3.1/palindromos.dll", + "args": ["A Rita, sobre vovô, verbos atira"], + "cwd": "${workspaceFolder}/palindromos", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false + }, { "name": ".NET Core Attach", "type": "coreclr", "request": "attach", "processId": "${command:pickProcess}" } + ] } \ No newline at end of file diff --git a/palindromos/Program.cs b/palindromos/Program.cs new file mode 100644 index 0000000..f7e4a34 --- /dev/null +++ b/palindromos/Program.cs @@ -0,0 +1,82 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace palindromos +{ + class Program + { + static void Main(string[] args) + { + if(args.Length <= 0) + { + Console.WriteLine("USO DO PROGRAMA: palindromos !"); + return; + } + string input = args[0]; + + Console.WriteLine("CONSIDERANDO espaços, especiais e diacríticos: "); + string result = IsPalindrome(input) + ? $"'{input}' É palíndromo!" + : $"'{input}' NÃO É palíndromo."; + Console.WriteLine(result); + + Console.WriteLine("IGNORANDO espaços, especiais e diacríticos: "); + result = IsPalindrome(input, false) + ? $"'{input}' É palíndromo!" + : $"'{input}' NÃO É palíndromo."; + Console.WriteLine(result); + } + + // Valida se a string de entrada é palíndroma + private static bool IsPalindrome(string input, bool isSimpleWord = true) + { + bool isPalindrome = true; + // parâmetro isSimpleWord indica se validará apenas + // uma palavra ex.: "arara" ou se é frase e portanto + // deve usar regras de espaços e diacríticos + if(!isSimpleWord) + { + // remove os espaços e especiais + // e os diacríticos + input = Regex.Replace(input, @"\W+", string.Empty); + input = RemoveDiacritics(input); + } + // garantindo o ignoreCase + input = input.ToUpper(); + int halfLengthIndex = input.Length / 2 - 1; + int lastIndex = input.Length - 1; + // vai até a metade da string + for(int index=0; index< halfLengthIndex; index++) + { + // compara o caractrer no primeiro indice com o ultimo + // o segundo com o penultimo, etc + // se encontrar alguma coisa diferente, já pode retornar falso + if(input[index] != input[lastIndex-index]) + { + isPalindrome = false; + break; + } + + } + return isPalindrome; + } + + // método para "limpar" a string de diacríticos + // ps.: já havia utilizado anteriormente em produção + // -- fonte: https://stackoverflow.com/a/13155469 + private static string RemoveDiacritics(string str) + { + if (null == str) return null; + var chars = str + .Normalize(NormalizationForm.FormD) + .ToCharArray() + .Where(c=> CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) + .ToArray(); + + return new string(chars).Normalize(NormalizationForm.FormC); + } + } +} diff --git a/palindromos/palindromos.csproj b/palindromos/palindromos.csproj new file mode 100644 index 0000000..d453e9a --- /dev/null +++ b/palindromos/palindromos.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + +