Exercism — Rust — Número Narcisista
Tudo bem, pessoal?
Estou aprendendo a linguagem Rust e estou utilizando a plataforma Exercism para resolver problemas dentro desta linguagem e gostaria de trazer para vocês minha experiência com o problema Armstrong Numbers, do Exercism.
Sobre o Rust
Está sendo muito legal essa experiência com Rust e ao mesmo tempo desafiador devido a forma como a linguagem foi idealizada, mas ela promete grandes desempenhos e tem um benchmark muito interessante.
Aqui você pode ver como ele desempenha em relação a linguagem C, Clang, C++ e Go.
Só de bater de frente com o próprio C já demonstra o poder de processamento dessa linguagem. Apesar da verbosidade, possui muitas vantagens.
Problema
Este é um problema de Números Narcísicos, sucintamente, seriam números onde a soma de cada digito elevado a potência equivalente a sua posição teria como resultado o próprio número. Conforme a página do Exercism indica 153 seria um número desses: 1³ + 5³ + 3³ = 1 + 125 + 27 = 153.
Então, o desafio é saber separar cada digito de um número, neste caso inteiro, identificar sua posição e aplicar a fórmula. Mais fácil dizer do que fazer ¬¬.
Solução
A maior parte das soluções que vi até hoje no mercado quando o assunto é saber quantos dígitos há em um número, ou problemas que envolvam esse cenário, se baseiam em transformar o número em um texto. Isso é muito custoso na maioria das linguagens de programação e uma solução que envolva apenas números é muito mais eficiente.
Por isso, passei para essa abordagem. Aqui segue o código feito em Rust baseado na solução encontrada na página de números narcísicos acima.
Minha solução se encontra aqui, também pode encontrar esse e outros exercícios no meu repositório.
Como você pode perceber ela envolve duas fases, cada uma com dois loops. O primeiro método, ppdif, é responsável por:
- Definir a quantidade de dígitos pelo primeiro loop
- No segundo loop ele aplica a fórmula para achar o total
O segundo método, ppdif_cycle, que se faz muito importante.
- O primeiro loop aplica o primeiro método até que ele encontre um número que se repita, nesse caso ele repete até achar um número que não esteja no vetor seen.
- O segundo loop pega esse número que se repetiu e aplica mais um ciclo tentando encontrar um número narcísico até que se repita.
Essa abordagem utiliza do método Cycle Detection que tenta otimizar a busca por números dentro de um conjunto finito de dados, vale muito a pena estudar o conteúdo.
Conclusão
O resultado é que no caso dos números narcísicos eles irão ser os únicos dentro dos dois vetores, portanto o terceiro método, is_armstrong_number, apenas compara o valor passado com o primeiro encontrado para saber se o número em questão é narcísico ou não.
Assim, consegui terminar mais um desafio do exercism, gostei muito dessa solução, minha implementação está longe de ser perfeita, porém acho que possui alguns pontos fortes, como a não utilização de textos.
Acredito que mesmo que não consigamos a solução perfeita é muito bom experimentar coisas novas, abrir os horizontes e compartilhar isso nos ajuda a fortalecer nossos conhecimentos e recolher feedbacks interessantes.
Gostou? Dá um like e comenta. E você, como resolveria esse problema? Vamos dividir a experiência!
Originally published at https://www.linkedin.com.