O objetivo desse projeto é fornecer métodos para facilitar o processo de prever e gerar a análise combinatória entre X elementos de Y listas (X podendo variar para cada lista).
(Se você já sabe o que é análise combinatória, combinação simples e fatorial, siga para o próximo tópico clicando aqui)
A analise combinatória consiste, entre outras funções,
em auxiliar no cálculo de possibilidades de combinação
entre 1 ou mais grupos de elementos.
Temos como exemplo a clássica situação de definir quais
as combinações possíveis entre um conjunto de X calças e Y camisas.
Exemplo: se tenho 3 calças (X = 3) e 5 camisas (Y = 5), quantas combinações de 1 calça e 1 camisa posso formar? A resposta seria 15, porque é o resultado da multiplicação entre 3 (número de calças) e 5 (número de camisas).
Equação: X * Y * Z...
Outro exemplo que podemos citar é o de formar conjuntos de P elementos dentro de um grupo de N elementos,
como definir quantas combinações possíveis de P alunos podem ser formadas em uma sala com N alunos.
Exemplo: Em uma sala com 20 alunos (N = 20), quantas combinações de 2 alunos (P = 2) podemos formar?
*Vale lembrar que nesse caso tanto faz a ordem dos elementos (João e Maria é o mesmo que Maria e João)
A resposta é 190 dado a equação abaixo de análise combinatória (combinação simples).
Equação: N! / ( P! * (N - P)! )
Por simplificação, iremos chamar essa equação de Combin(N, P).
Se você está se perguntando ou tentando se lembrar do que é esse sinal de exclamação, saiba que ele representa a operação
de fatorial (!) que basicamente representa a multiplicação daquele número por todos os números anteriores a ele, até chegar a 1.
Exemplo: 5! = 5 * 4 * 3 * 2 * 1
Para trabalhar com casos isolados em programação que contemplem situações simples como as mencionadas anteriormente, as fórmulas acima podem ser o suficiente para prever a quantidade de combinações (dado que as fórmulas retornam números de possibilidades de combinações entre os elementos) e até é possível encontrar essas fórmulas em forma de trechos de código no Stack Overflow para executar a combinação entre elementos (gerar as reais listas de combinações entre tais elementos).
Mas e se nós precisássemos de uma função que não só gerasse as combinações de P elementos dentro de um grupo com
N elementos, mas também permitisse montar conjuntos entre esse grupo e X outros grupos?
E melhor ainda, que cada um desses grupos pudesse ter um valor específico para P e N?
Ainda não entendeu a premissa desse projeto e como ele pode ser útil? Observe o tópico abaixo "Exemplo na prática" para entender melhor.
Para demonstrar de maneira simples e intuitiva a utilidade de uma fórmula um pouco mais avançada como a que iremos utilizar, vamos usar o exemplo de uma escola que precisa formar um Grêmio estudantil contando com a participação dos alunos.
Na nossa analogia, o diretor da escola quer saber quantas (prever) e quais (executar) seriam TODAS as possíveis chapas que poderiam ser criadas para formar o Grêmio estudantil, dadas as seguintes informações:
- A quantidade X de salas que desejam participar da formação do Grêmio.
- A quantidade Y de alunos que desejam participar de cada sala (Y podendo variar para cada sala individualmente)
- A cota Z de quantos alunos serão selecionados de cada sala (Z podendo variar para cada sala individualmente)
Para saber quantas (prever) as possibilidades de chapas que poderiam ser criadas, o diretor precisaria usar uma junção inteligente das fórmulas apresentadas no capítulo anterior para calcular todas as chapas possíveis, seguindo uma lógica como a seguinte:
- Para cada sala, seria necessário calcular separadamente a análise combinatória considerando o número de alunos interessados (Y) e a cota de alunos elegíveis (Z) para aquela sala, visando descobrir todas as possíveis combinações de Z alunos entre todos os alunos interessados daquela sala. A fórmula para obter esse resultado seria Combin(Y, Z). Consulte o capítulo anterior para ver a fórmula por extenso.
- Após obter o resultado de combinações de cada sala separadamente, teríamos que multiplicar cada um dos resultados para obter o número total de combinações de todas as salas.
Esse projeto segue as seguintes Commit Guidelines:
- build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
- ci: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
- docs: Documentation only changes
- feat: A new feature
- fix: A bug fix
- perf: A code change that improves performance
- refactor: A code change that neither fixes a bug nor adds a feature
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- test: Adding missing tests or correcting existing tests
- chore: Misc content
Entre em contato e preste apoio através das seguintes redes:
Esse projeto está licenciado sob a licença do MIT - veja o arquivo de LICENÇA para mais detalhes.
🧰 Sendo desenvolvido por Wesley Yago!
