-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
135 lines (107 loc) · 3.65 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"use strict";
/*
Função para gerar inteiros aleatórios dado um range Min e Max;
*/
function gerarRandomInt(min, max){
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random()*(max-min)) + min;
}
/*
Gera uma string aleatória, dado tamanho;
*/
function stringAleatoria(tamanho) {
let conjuntoCaracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let stringAleatoria = '';
for (let i = 0; i < tamanho; i++) {
let randomPoz = Math.floor(Math.random() * conjuntoCaracteres.length);
stringAleatoria += conjuntoCaracteres.substring(randomPoz,randomPoz+1);
}
return stringAleatoria;
}
/*
Gera uma lista de itens, dado tamanho
*/
function gerarItens(tamanhoLista){
let conjuntoItens = new Set();
for(let i=0; i<tamanhoLista;i++){
let item = {
nome: stringAleatoria(5),
quantidade: gerarRandomInt(0,9999),
precoUnitario: gerarRandomInt(0,999999)
};
conjuntoItens.add(item)
}
return Array.from(conjuntoItens);
}
/*
Conforme regra de negócio, o email é UNIQUE.
Decidi por utilizar o SET, pois o Set permite apenas uma ocorrência para o mesmo valor informado;
A função retorna um Array a partir do Set de emails.
------
A função retorna emails com tamanho padrão da RFC5321, ou seja, email de tamanho máximo 255 caracteres,
sendo 64 caracteres máximos no nome e 191 caracteres máximos no domínio.
A função retorna pelo menos um caractere no nome e pelo menos 1 caractere na parte do domínio.
*/
function gerarEmails(tamanhoLista){
let qntCharNome;
let qntCharDominio;
let conjuntoEmails = new Set();
for(let i=0; i<tamanhoLista;i++){
qntCharNome = gerarRandomInt(1,64);
qntCharDominio = gerarRandomInt(1,191);
conjuntoEmails.add(stringAleatoria(qntCharNome)+"@"+stringAleatoria(qntCharDominio));
}
return Array.from(conjuntoEmails);
};
/*
Recebe um array de Itens e retorna o valor total da lista (preçoUnitário do Item * quantidade)
*/
function valorTotalItens(itens){
let total = 0;
itens.forEach(item => {
total = item.quantidade * item.precoUnitario;
});
return total;
}
/* Função para distribuir na lista o resto inteiro da divisão */
function distribuiValorRestante(lista, valorParaDistribuir){
let contador = 0;
for(let i=0; i<lista.length; i++){
if(valorParaDistribuir<=0){break;}
lista[i].valor = lista[i].valor + 1;
valorParaDistribuir--;
}
return lista;
};
function calcula(itens, emails){
let resultado = new Array();
let valorItens = valorTotalItens(itens);
let quantidadeEmails = emails.length;
let valorMinimo = 0;
let restante = 0;
if(quantidadeEmails<1){
console.log("A lista de Emails não possui pessoas cadastradas.")
}else{
valorMinimo = Math.floor(valorItens/quantidadeEmails);
restante = valorItens-(valorMinimo*quantidadeEmails);
emails.forEach(email=>{
resultado.push({pessoa : email, valor: valorMinimo});
});
if(restante>0){
resultado = distribuiValorRestante(resultado, restante);
}
}
// console.log(`Valor total dos Itens (em centavos de R$): ${valorItens}`);
// console.log(`Quantidade de Pessoas: ${emails.length}`);
// console.log(`Valor para Mínimo para cada usuário ${valorMinimo}`);
// console.log(`Valor restante, após divisão mínima, é ${restante}`);
return resultado;
}
/*==================== MAIN ========================*/
const QUANTIDADE_EMAILS = gerarRandomInt(0,9999);
const QUANTIDADE_ITENS = gerarRandomInt(0,99999);
let itens = gerarItens(QUANTIDADE_ITENS);
let emails = gerarEmails(QUANTIDADE_EMAILS);
let mapaFinal = calcula(itens, emails);
console.table(mapaFinal);