Skip to content

Instantly share code, notes, and snippets.

@uqmessias
Last active April 4, 2018 04:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uqmessias/843c5abb864b95c8f2f053883cd4afa9 to your computer and use it in GitHub Desktop.
Save uqmessias/843c5abb864b95c8f2f053883cd4afa9 to your computer and use it in GitHub Desktop.
Exercício de turnos

Problema

Janio trabalha em uma empresa em três turnos sequenciais (manhã, tarde e a noite). Ele trabalha dois dias em cada turno e quando trabalha no último turno (noite), tem dois dias de folga (folga).

Nos dias 02 e 03 de Abril ele trabalha no turno da manhã. Dado um primeiro dia do primeiro turno (02/04/2018 para o turno da manhã) e a quantidade de terças-feira seguintes (5 por exemplo), devolva as próximas terças-feira e em quais ele poderá participar da sessão de programação.

As sessões acontecem à noite e por isso nos dias de terça-feira em que ele trabalha à noite, não poderá participar da sessão.

/*
02/04/2018 -> manhã
03/04/2018 -> manhã -> terça
04/04/2018 -> tarde
05/04/2018 -> tarde
06/04/2018 -> noite
07/04/2018 -> noite
08/04/2018 -> folga
09/04/2018 -> folga
10/04/2018 -> manhã -> terça
11/04/2018 -> manhã
12/04/2018 -> tarde
13/04/2018 -> tarde
14/04/2018 -> noite
15/04/2018 -> noite
16/04/2018 -> folga
17/04/2018 -> folga -> terça
18/04/2018 -> manhã
19/04/2018 -> manhã
20/04/2018 -> tarde
21/04/2018 -> tarde
22/04/2018 -> noite
23/04/2018 -> noite
24/04/2018 -> folga -> terça
25/04/2018 -> folga
26/04/2018 -> manhã
27/04/2018 -> manhã
28/04/2018 -> tarde
29/04/2018 -> tarde
30/04/2018 -> noite
01/05/2018 -> noite -> terça
02/05/2018 -> folga
03/05/2018 -> folga
*/
const turnos = {
manha: 0,
tarde: 1,
noite: 2,
folga: 3,
};
const diaTrabalho = [
turnos.manha,
turnos.tarde,
turnos.noite,
turnos.folga,
];
const ehTerca = function (data) {
return data.getDay() === 2;
};
const proximoDia = function (date) {
var dat = new Date(date.valueOf());
dat.setDate(dat.getDate() + 1);
return dat;
};
const encontrarTercasFeira = function (primeiroDia, quantidadeDeTercas) {
const dataDoPrimeiroDia = primeiroDia.data;
const turnoDoPrimeiroDia = primeiroDia.turno;
const indiceDoPrimeiroDia = diaTrabalho.indexOf(turnoDoPrimeiroDia);
const tercasEncontradas = [];
let diaAuxiliar = dataDoPrimeiroDia;
let indiceDoDiaAuxiliar = indiceDoPrimeiroDia;
while (tercasEncontradas.length < quantidadeDeTercas) {
for (let diaIndice = 0; diaIndice < 2; diaIndice = diaIndice + 1) {
if (ehTerca(diaAuxiliar)) {
const naoParticipa = (diaTrabalho[indiceDoDiaAuxiliar] === turnos.noite)
tercasEncontradas.push({
participaDaSessao: !naoParticipa,
tercaFeira: diaAuxiliar,
});
}
diaAuxiliar = proximoDia(diaAuxiliar);
}
indiceDoDiaAuxiliar = indiceDoDiaAuxiliar + 1;
if (indiceDoDiaAuxiliar >= diaTrabalho.length) {
indiceDoDiaAuxiliar = 0;
}
}
return tercasEncontradas;
};
const tercas = encontrarTercasFeira({
data: new Date(2018, 3, 2),
turno: turnos.manha,
}, 15);
const meses = [
'Janeiro',
'Fevereiro',
'Março',
'Abril',
'Maio',
'Junho',
'Julho',
'Agosto',
'Setembro',
'Outrubro',
'Novembro',
'Dezembro',
];
const agrupaPorMes = function (tercas) {
/*
3, 10 e 17 de abril, 1, 8 e 15 de maio ele participará
const obj = {
'Abril': [3, 10, 17],
'Maio': [1, 8, 15],
};
obj['sdfasdfasdf'] -> undefined
obj['Abril'] -> [3, 10, 17]
*/
const grupo = {};
tercas.forEach(function (terca) {
const mes = meses[terca.tercaFeira.getMonth()]
if (grupo[mes]) {
grupo[mes].push(terca.tercaFeira.getDate());
} else {
grupo[mes] = [terca.tercaFeira.getDate()];
}
});
return grupo;
};
const tercasQueParticipara = tercas.filter(function (terca) {
return terca.participaDaSessao;
});
const participaraAgrupado = agrupaPorMes(tercasQueParticipara);
// [['Abril', [3, 10, 17]], ['Maio', [1, 8, 15]]
// Janio participará nos dias 3, 10, 17 de Abril, 1, 8, 15 de Maio
const diasEMessesParticipara = Object.entries(participaraAgrupado).map(function(itemDoGrupo){
// ['Abril', [3, 10, 17]]
const dias = itemDoGrupo[1];
const mes = itemDoGrupo[0];
return `${dias.join(', ')} de ${mes}`;
}).join(', '); // 3, 10, 17 de Abril, 1, 8, 15 de Maio
console.log(`Janio participará nos dias ${diasEMessesParticipara}`);
const tercasQueNaoParticipara = tercas.filter(function (terca) {
return !terca.participaDaSessao;
});
const naoParticiparaAgrupado = agrupaPorMes(tercasQueNaoParticipara);
// [['Abril', [3, 10, 17]], ['Maio', [1, 8, 15]]
// Janio não participará nos dias 3, 10, 17 de Abril, 1, 8, 15 de Maio
const diasEMessesNaoParticipara = Object.entries(naoParticiparaAgrupado).map(function(itemDoGrupo){
// ['Abril', [3, 10, 17]]
const dias = itemDoGrupo[1];
const mes = itemDoGrupo[0];
return `${dias.join(', ')} de ${mes}`;
}).join(', '); // 3, 10, 17 de Abril, 1, 8, 15 de Maio
console.log(`Janio não participará nos dias ${diasEMessesNaoParticipara}`);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment