code fights - Metro Card

Escrito por

Hoje vamos resolver mais um problema que está disponível no Code Fights. Esse problema é chamado de metro card. Pode parecer simples, mas tem algumas coisas bastante interessantes de ter na cabeça.

O que é o problema do metro card?

Nós temos uma função que você vai informar qual o último número de dias. Vamos supor que eu tenho um cartão de metro com 30 dias, eu utilizei os 30 dias, o vetor vai me retornar as possibilidades de próxima recarga baseado em como os meses são organizados.

1function metroCard(lastNumberOfDays) {}

Por exemplo, se colocarmos 28 no lastNumberOfDays, teríamos que retornar 31, que é o próximo mês que podemos recarregar. Minha ideia inicial foi montar um vetor com os meses do ano:

1function metroCard(lastNumberOfDays) {
2 const months = [
3 31, //jan
4 28, // fev
5 31, //mar
6 30, //apr
7 31, //may
8 30, //jun
9 31, //jul
10 31, //aug
11 30, //set
12 31, //oct
13 30, //nov
14 31, //dec
15 ]
16}

Outra coisa bastante importante é ficar ligado no que o problema pede como saída, especificamente nesse problema, temos que retornar um vetor ordenado crescente.

Agora podemos fazer o seguinte: vamos guardar todos os dias que a gente tem posterior a esse valor informado. Por exemplo, se eu informei 28, a única possibilidade que tenho é 31:

1const days = {
2 months.forEach((elem, index) => {
3 if(elem === lastNumberOfDays){
4 console.log(months[index+1])
5 }
6 })
7}
8
9metroCard(28)
10
11metroCard(30)

Percebam que o mês vai ser retornado como undefined. Nós precisamos de mais um ajuste, precisamos somar que o índice precisa fazer o resto por %12. Sempre que usamos o %, ele volta para zero e pega o restante, por exemplo 4 %12 retorna 4.

1const days = {
2 months.forEach((elem, index) => {
3 if(elem === lastNumberOfDays){
4 console.log(months[(index+1)%12])
5 }
6 })
7}

Agora podemos criar um key utilizando o número do dia e retornar o nosso object com as keys. Além disso, essa chave trás strings, precisamos retornar inteiros para garantir que o sort vai ordenar ele como queríamos:

1const days = {
2 months.forEach((elem, index) => {
3 if(elem === lastNumberOfDays) {
4 days[months[(index+1)%12] = 1]
5 }
6 })
7
8 return Object
9 .keys(days)
10 .map( item => parseInt(item))
11 .sort()
12}

Ele é uma estrutura de dados muito comum. Além disso, vimos a estratégia de como resolver a parte cíclica. Quanto mais olharmos abordagens diferentes, mais preparados vamos estar para resolver esses problemas.

Confira o video:

Deixe suas dúvidas e sugestões nos comentários. Curta o DevPleno no Facebookinscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades.  Abraço!

Evolua mais rápido

Junte-se a milhares de desenvolvedores no nosso time de alunos premium e alcance mais rápido o próximo nível da sua carreira.

Ver cursos Premium