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.
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.
- Calcular a distância em que frutas caem no chão em relação à árvore;
- Verificar se essas distâncias estão dentro do perímetro da casa do Sam;
- Contar a quantidade de frutas que estão dentro da casa;
- 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!

Até o próximo desafio!
Comments
Join the discussionNo comments yet. Be the first to comment.




