Skip to main content

08/30 - 30 dias de HackerRank

Published 3 min readMarkdown
08/30 - 30 dias de HackerRank

Mais um dia, mais um desafio! É incrível pensar que já se foram 7 dias desde que comecei a resolver esses problemas diariamente. 🚀

Apple and Orange

Sam tem uma macieira e uma laranjeira em sua propriedade que dão muitos frutos. Usando as informações abaixo, determine o número de maçãs e laranjas que caem na casa de Sam.

image.png

A casa dele fica no intervalo vermelho (entre $s$ e $t$). A macieira fica em um ponto $a$, à direita da casa e a laranjeira fica em um ponto $b$, à esquerda da casa.
Quando uma fruta cai, ela cai a distância $d$ da árvore -- Se a distância for positiva, ela cairá à direita da árvore e se for negativa, cairá à esquerda da árvore.
Dada uma distância $d$ para $m$ maçãs e $n$ laranjas, a posição $a$ e $b$ das árvores e a posição inicial $s$ e final $t$ do lote, calcule quantas frutas caíram na casa do Sam.

Bom, o primeiro passo para resolver a situação é pensar nas etapas para a resolução do problema.

  1. Calcular a distância em que frutas caem no chão em relação à árvore;
  2. Verificar se essas distâncias estão dentro do perímetro da casa do Sam;
  3. Contar a quantidade de frutas que estão dentro da casa;
  4. Retornar o valor da contagem em duas linhas separadas.

O primeiro passo é mais simples. Como a gente vai precisar usar a distância em que as frutas caíram da árvore no próximo passo, a solução mais simples é iterar por todos os elementos da array, fazer a conta e mapear os resultados em uma nova array. Podemos fazer isso usando o método map(), tanto para a array de laranjas quanto de maçãs.

const [ s, t, a, b ] = 7, 11, 5, 15;
const apples = [-2, 2, 1];
const oranges = [5, -6];

function countApplesAndOranges(s, t, a, b, apples, oranges) {
  const fallenApples = apples.map(apple => a + apple); //[ 3, 7, 6 ]
  const fallenOranges = oranges.map(orange => b + orange); //[ 20, 9 ]
}

Pronto. Com isso, conseguimos descobrir qual é a posição em que as frutas caíram no eixo $x$. Agora, precisamos verificar se esses valores estão dentro do perímetro da casa do Sam. No nosso exemplo, esse espaço compreende desde a posição $7$ até a posição $11$. Apenas observando o retorno da contagem podemos ver que temos uma maçã e uma laranja dentro da cerca do nosso amigo.
Mas como podemos escrever uma função que calcule isso de maneira genérica?

Uma saída é usar o método reduce(), para retornar o acumulador toda vez que um elemento da lista estiver dentro dos limites!

const [ s, t, a, b ] = 7, 11, 5, 15;
const apples = [-2, 2, 1];
const oranges = [5, -6];

function countApplesAndOranges(s, t, a, b, apples, oranges) {
  const fallenApples = apples.map(apple => a + apple); //[ 3, 7, 6 ]
  const fallenOranges = oranges.map(orange => b + orange); //[ 20, 9 ]

  const applesInsideSamsHouse = fallenApples.reduce((acc, cur) => {
    s <= cur && cur <= t && acc++;
    return acc; //1
  }, 0);
  const orangesInsideSamsHouse = fallenOranges.reduce((acc, cur) => {
    s <= cur && cur <= t && acc++;
    return acc; //1
  }, 0);

  return `${applesInsideSamsHouse}\n${orangesInsideSamsHouse}`;
}

Usamos o método reduce() para iterar pelas arrays fallenApples e fallenOranges e, a cada elemento (cur), verificamos se ele é maior ou igual a $s$, que é o início do terreno do Sam e se é menor ou igual a $t$, que é o final do lote. Caso as duas condições sejam verdadeiras, adicionamos $1$ ao contador (acc), que é retornado ao final do laço. Esses valores são armazenados em variáveis (applesInsideSamsHouse e orangesInsideSamsHouse), que são retornadas ao final da função.

Agora precisamos verificar se a nossa lógica está correta!

image.png

Até o próximo desafio!

No comments yet. Be the first to comment.

More from this blog