Blog / Algoritmos

code fights - Metro Card

TTulio Faria 16 de nov. de 2017 2 min de leitura
code fights - Metro Card

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.

function 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:

function metroCard(lastNumberOfDays) {
  const months = [
    31, //jan
    28, // fev
    31, //mar
    30, //apr
    31, //may
    30, //jun
    31, //jul
    31, //aug
    30, //set
    31, //oct
    30, //nov
    31 //dec
  ]
}

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:

const days = {
  months.forEach((elem, index) => {
    if(elem === lastNumberOfDays){
      console.log(months[index+1])
    }
  })
}

metroCard(28)

metroCard(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.

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

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:

const days = {
  months.forEach((elem, index) => {
    if(elem === lastNumberOfDays) {
      days[months[(index+1)%12] = 1]
    }
  })

  return Object
    .keys(days)
    .map( item => parseInt(item))
    .sort()
}

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 Facebook, inscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades. Abraço!

T
Escrito por
Tulio Faria

Mestre em Sistemas de Informação pela USP e criador do DevPleno. Iniciou sua carreira como professor com apenas 18 anos em um curso técnico, foram 11 anos em sala de aula formando desenvolvedores fullstack no sul de Minas Gerais.

Algoritmos
Compartilhar X LinkedIn
Continue lendo

Insights relacionados