# 11/30 - 30 Dias de HackerRank

Hoje a gente vai calcular a divisão de uma barra de chocolates entre duas crianças. Ao invés de quebrar no meio e dividir 50/50 como crianças comuns, uma delas optou por fazer uma conta desnecessariamente complexa, só porque sim.

> ## [Subarray Division](https://www.hackerrank.com/challenges/the-birthday-bar/)
> 
> Duas crianças, Lily e Ron, querem dividir uma barra de chocolate. Cada um dos quadrados da barra tem um número inteiro nela.
> Lily decide dividir um segmento contíguo da barra selecionado conforme abaixo:
> 
> - O comprimento do segmento deve corresponder ao mês de nascimento do Ron e,
> - A soma dos números nos quadrados da barra deve ser iguais ao dia do nascimento dele.
> 
> Determine de quantas formas ela pode dividir o chocolate.
> 
> **Exemplo:** <br>
> \\(s = [2, 2, 1, 3,2 ]\\)<br>
> \\(d = 4\\)<br>
> \\(m = 2\\)
> 
> Lily quer encontrar os segmentos que são iguais ao dia que o Ron nasceu, \\(d = 4\\) com o comprimento igual ao mês de nascimento dele, \\(m = 2\\). Nesse caso, há dois segmentos que atendem aos critérios da Lily: \\([2, 2]\\) e \\([1, 3]\\).

Para conseguir determinar em quantos pedaços o chocolate pode ser dividido, podemos seguir os seguintes passos:

1. Inicializar uma variável contadora com `0`;
2. Iterar pela *array* para iniciar os cálculos;
3. Separar uma *subarray* com início no índice do elemento atual e com fim índice do elemento atual + `m`;
4. Somar o valor dessa subarray;
5. Se a soma for igual a `d`, adicionar `1` ao contador;
6. Ao final do *loop*, retornar o contador.

```JS
const s = [1, 2, 1, 3, 2];
const d = 3;
const m = 2;

function birthday(s, d, m) {
  let counter = 0;
}
``` 
Iniciamos a variável `counter` com 0, porque quando a soma dos números do chocolate for igual ao valor do dia `d`, esse valor vai ser incrementado.<br>
Agora, para fazer a conta em si, precisamos fazer um *loop* que itere por todo *array*. Em seguida separamos os elementos do vetor a partir do elemento ativo até o elemento com o índice \\(m\\) elementos para frente em relação ao elemento ativo.

Complicou né? Mas imagine o seguinte: <br>
A barra de chocolate do exemplo tem 5 quadrados. Então vamos separar de dois em dois (porque o \\(m\\) é igual a `2`) quadrados *a cada quadrado* para verificarmos se a soma dos números é igual a `d`.
![Untitled.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1670182323223/hoEKNMXFS.png align="center")

O último elemento, o `2`, pode ser desprezado porque não temos como juntar com outro elemento para fazer a soma dos números -- temos que lembrar que a Lily quer que os pedaços sejam [contíguos](https://www.google.com/search?channel=fs&q=cont%C3%ADguo).

Transportando esse conceito para o código, podemos usar o método [Array.slice()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) para capturar esses elementos, armazenando os valores em uma *subarray* a partir do índice `i` até o índice `i + m`.

```JS
const s = [1, 2, 1, 3, 2];
const d = 3;
const m = 2;

function birthday(s, d, m) {
  let counter = 0;
  for (let i = 0; i < s.length; i++) {
    let subArr = s.slice(i, i + m)
  }
}
```
Precisamos, agora, somar os elementos dessa *subarray*. Para isso, vamos usar o método [Array.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) e comparar o resultado da soma com `d`. Caso sejam correspondentes, a variável `counter` terá seu valor incrementado em 1.

```JS
const s = [1, 2, 1, 3, 2];
const d = 3;
const m = 2;

function birthday(s, d, m) {
  let counter = 0;
  for (let i = 0; i < s.length; i++) {
    let sum = s.slice(i, i + m).reduce((acc, curr) => acc + curr);
    if (sum === d) counter++;
  }
  return counter;
}
```
Agora é só testar nossa lógica para ver se funciona!

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1670173286931/w_ax9S6Ql.png align="center")

Maravilha! 🤩<br>
Até o próximo desafio!

