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:

  1. Definir a quantidade de dígitos pelo primeiro loop
  2. No segundo loop ele aplica a fórmula para achar o total

O segundo método, ppdif_cycle, que se faz muito importante.

  1. 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.
  2. 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.

Writing to make ourselves better programmers.

Writing to make ourselves better programmers.