# 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](https://www.hackerrank.com/challenges/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](https://cdn.hashnode.com/res/hashnode/image/upload/v1667925081658/T_iLWTHFk.png align="center")
> 
> 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. <br />
> 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.<br />
> 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()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), tanto para a *array* de laranjas quanto de maçãs.


```JS
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.<br />
Mas como podemos escrever uma função que calcule isso de maneira genérica?

Uma saída é usar o método [`reduce()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), para retornar o acumulador toda vez que um elemento da lista estiver dentro dos limites!


```JS
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](https://cdn.hashnode.com/res/hashnode/image/upload/v1667924046326/5CMuv7BSK.png align="center")

Até o próximo desafio!

