Era um sábado de manhã, 16 de abril de 2022, eu estava conversando com um amigo que mora em Tucuruí-PA e cursa engenharia elétrica (Salve Fred!) quando ele me disse que o grupo de pesquisa do qual ele faz parte, iria promover uma seleção de pessoas programadoras no meio acadêmico para ingressarem. Como ele sabe que eu estudo programação, decidiu me enviar um desafio que seria uma das formas de avaliar os candidatos:
Fred juntamente com os colegas procuraram na internet e encontraram o desafio da imagem acima, que consiste em desenvolver um algorítimo, em qualquer linguagem de programação, que informe ao usuário quantas cédulas e moedas de cada valor seriam necessárias, para passar o troco de determinado valor para alguém.
Esse é aquele tipo de desafio que quando você bate o olho pensa logo “coisa fácil!”, principalmente quando você já está estudando programação faz algum tempo.
A cada palavra que lia do comando do desafio, vinha em minha mente cada um dos módulos de cada um dos cursos de programação JavaScript que eu fiz desde 2019. Foi quando me dei conta que apesar de tudo o que eu já tinha absorvido, eu não conseguia pensar em uma solução para o desafio, fiquei muito reflexivo, mas não frustrado, e imediatamente lembrei desse vídeo do Fábio Akita:
Lá pelos 17 minutos ele comenta sobre a diferença entre os cursos de programação e quem faz uma faculdade e um estágio.
Eu já tinha visto esse vídeo e outros do Akita, e o que ele diz é bem sério. Eu sempre tive a sobriedade de nunca deixar meu ego ser auto inflado através dos discursos que os coachs de curso online falam, mesmo estudando a uns dois ou três anos nunca achei que sabia de tudo, analiso meus desafios e meus esforços sem exceção. Nesse quesito Sócrates foi muito sensato quando disse “só sei que nada sei”, levo essa filosofia comigo, após descobrir um mundo, sempre haverão outros.
Estou na área de tecnologia por que eu gosto, não foi por conta do hype do mercado, azar o meu ter chegado no meio dessa bolha. Tanto que eu descobri que existia um hype só depois que eu entrei.
Mas em fim, me comprometi comigo mesmo de que resolveria o desafio. E resolvi!
Vamos à solução!
Sendo um pouco mais técnico agora. Passei horas no MDN lendo a documentação de operações matemáticas com JavaScript e desenvolvi esse primeiro código com o passo a passo da distribuição do valor para cada cédula e moeda:
var valor = 735.83;
console.log(valor);
n100 = valor/100;
valor = valor%100;
n100 = Math.trunc(n100)
n50 = valor/50;
valor = valor%50;
n50 = Math.trunc(n50)
n20 = valor/20;
valor = valor%20;
n20 = Math.trunc(n20)
n10 = valor/10;
valor = valor%10;
n10 = Math.trunc(n10)
n5 = valor/5;
valor = valor%5
n5 = Math.trunc(n5)
m1 = valor/1;
valor = valor%1;
m1 = Math.floor(m1)
m50 = valor/0.50;
valor = valor%0.50;
m50 = Math.floor(m50)
m25 = valor/0.25;
valor = valor%0.25;
m25 = Math.floor(m25)
m10 = valor/0.10;
valor = valor%0.10
m10 = Math.floor(m10)
m05 = valor/0.05;
valor = valor%0.05;
m05 = Math.floor(m05)
m01 = valor/0.01;
valor = valor%0.01;
m01 = Math.floor(m01)
console.log({
'Notas': [`${n100} notas de R$ 100,00`, `${n50} notas de R$ 50,00`, `${n20} notas de R$ 20,00`, `${n10} notas de R$ 10,00`, `${n5} notas de R$ 5,00`],
'Moedas': [`${m1} moedas de R$ 1,00`, `${m50} moedas de R$ 0,50`, `${m25} moedas de R$ 0,25`, `${m10} moedas de R$ 0,10`, `${m05} moedas de R$ 0,05`, `${m01} moedas de R$ 0,01`]
});
O que foi impresso no console:
// ❯ node desafio.js
// 735.83
// {
// Notas: [
// '7 notas de R$ 100,00',
// '0 notas de R$ 50,00',
// '1 notas de R$ 20,00',
// '1 notas de R$ 10,00',
// '1 notas de R$ 5,00'
// ],
// Moedas: [
// '0 moedas de R$ 1,00',
// '1 moedas de R$ 0,50',
// '1 moedas de R$ 0,25',
// '0 moedas de R$ 0,10',
// '1 moedas de R$ 0,05',
// '3 moedas de R$ 0,01'
// ]
// }
Para quem está escrevendo seu primeiro algorítimo isso está bom, mas eu já estudo faz algum tempo e sei que toda linguagem de programação que se preze tem alguma estrutura de repetição para deixar esse código mais simples.
Desde o começo, eu sabia que seria possível colocar isso em uma estrutura de repetição, mas preferi começar do jeito mais simples pois eu precisava visualizar cada passo do algorítimo. Uma das coisas que os cursos de hoje não ensinam pra ninguém, e pior, indiretamente falam que não faz sentido você aprender pois é muito básico e você “não vai usar no dia a dia” é a famosa e fundamental lógica de programação. A lógica em um desafio desses é o que predomina.
Confesso que tive um pouco de dificuldade pra pensar em como encaixaria isso em um ‘for’, e como um bom programador curioso fiz uso do Google, dos fóruns e etc… Depois de pesquisar um pouco, cheguei nesse resultado (e sem ctrl + c, ctrl + v):
var valor = 497.35;
console.log(valor);
var valorDeNota = [100, 50, 20, 10, 5, 2]
var notas = {'100': 0, '50': 0, '20': 0, '10': 0, '5': 0, '2': 0}
var valorDeMoedas = [1, 0.5, 0.25, 0.1, 0.05, 0.01]
var moedas = {'1': 0, '0.5': 0, '0.25': 0, '0.1': 0, '0.05': 0, '0.01': 0}
for (var cedula of valorDeNota) {
while (valor > cedula) {
notas[cedula] = Math.trunc(valor/cedula);
valor = valor%cedula;
}
}
for (var moeda of valorDeMoedas) {
while (valor > moeda) {
moedas[moeda] = Math.floor(valor/moeda);
valor = valor%moeda;
}
}
console.log({
'Notas': [`${notas[100]} notas de R$ 100,00`, `${notas[50]} notas de R$ 50,00`, `${notas[20]} notas de R$ 20,00`, `${notas[10]} notas de R$ 10,00`, `${notas[5]} notas de R$ 5,00`, `${notas[2]} notas de R$ 2,00`],
'Moedas': [`${moedas[1]} moedas de R$ 1,00`, `${moedas["0.5"]} moedas de R$ 0,50`, `${moedas["0.25"]} moedas de R$ 0,25`, `${moedas["0.1"]} moedas de R$ 0,10`, `${moedas["0.05"]} moedas de R$ 0,05`, `${moedas["0.01"]} moedas de R$ 0,01`]
});
O que foi impresso no console:
// ❯ node desafio.js
// 497.35
// {
// Notas: [
// '4 notas de R$ 100,00',
// '1 notas de R$ 50,00',
// '2 notas de R$ 20,00',
// '0 notas de R$ 10,00',
// '1 notas de R$ 5,00',
// '1 notas de R$ 2,00'
// ],
// Moedas: [
// '0 moedas de R$ 1,00',
// '0 moedas de R$ 0,50',
// '1 moedas de R$ 0,25',
// '1 moedas de R$ 0,10',
// '0 moedas de R$ 0,05',
// '0 moedas de R$ 0,01'
// ]
// }
É claro que durante as pesquisas encontrei a solução para esse desafio em outras linguagens, mas nem todas estavam completas, a maioria não estavam considerando as moedas.
Bom melhorou bastante, já escrevi duas possibilidades de solução para o desafio e já cumpri o que prometi para mim mesmo.
O que me motivou
Eu tenho muito a agradecer ao meu amigo, que sem querer acabou me apresentando um confronto, uma trivialidade dessas na programação que eu não fazia ideia de como resolver.
O que adianta eu desenhar telas com HTML, CSS e ReactJS e não conseguir fazer a distribuição de um valor em cédulas e moedas?
O que adianta eu construir APIs REST com ExpressJS, consumir APIs de terceiros com Axios e não saber fazer a distribuição de um valor em cédulas em moedas?
Os cursos me ensinaram a fazer muitas coisas práticas que vou usar no dia a dia caso seja contratado, sei construir uma API, sei contruir uma tela com ReactJS, mas a fundamentação necessária para resolver alguns problemas que com certeza vão surgir no meio do caminho, eu não encontrei em nenhum desses cursos.
E que venham os próximos desafios!
Imagem da capa: Photo by Gabriel Heinzer on Unsplash
GitHub Gist: https://gist.github.com/mrfelipelima/84fd07b14be0ff05b9dbf0f6256f4140