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.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Floriano Victor Peixoto

Floriano Victor Peixoto

Writing to make ourselves better programmers.