Desafio - Gincana no Acampamento - Ordenação e Filtros em JavaScript

 

Nas férias de Dezembro, várias escolas se organizam e levam seus alunos para um acampamento de férias por uma semana.
Nestes acampamentos os alunos são divididos em cabanas coletivos por gênero e idade, sempre com um adulto que, além de dormir com o grupo no cabana, também são responsáveis por criar e executar várias atividades, como por exemplo jogos, excursões, Gincanas Noturnas, etc.
No primeiro dia foi realizada uma gincana em que a atividade constituia em agrupar os alunos em um círculo (organizado no sentido anti-horário) do qual seriam retiradas uma a uma até que sobrasse apenas um aluno, que seria o vencedor.
No momento em que entra no círculo, cada aluno recebe uma pequena ficha que contém um valor de 1 a 500.
Depois que o círculo é formado, conta-se, iniciando no aluno que está ao lado da primeira que entrou no círculo, o número correspondente à ficha que o primeiro detém. O aluno onde o número contado cair, deve ser retirado do grupo, e a contagem inicia novamente segundo a ficha do aluno que acabou de ser eliminado.
Para ficar mais interessante, quando o valor que consta na ficha é par, a contagem é feita no sentido horário e quando o valor que consta na ficha é ímpar, a contagem é feita no sentido anti-horário.
Desenvolva um programa para que no próximo evento o responsável pela brincadeira saiba previamente qual criança irá ser a vencedora de cada grupo, com base nas informações fornecidas.

//### Entrada
A entrada contém vários casos de teste.
A primeira linha de cada caso de teste contém um inteiro N (1 ≤ N ≤ 100), indicando a quantidade de alunos que farão parte de cada círculo.
Em seguida, as N linhas de cada caso de teste conterão duas informações, o Nome e o Valor (1 ≤ Valor ≤ 500) que consta na ficha de cada aluno, separados por um espaço, na ordem de entrada na formação do círculo inicial.
OBS: O Nome de cada aluno não deverá ultrapassar 30 caracteres e contém apenas letras maiúsculas e minúsculas, sem acentos, e o caractere “_”. O final da entrada é indicado pelo número zero.

//### Saída
Para cada caso de teste, deve-se apresentar a mensagem Vencedor(a): xxxxxx, com um espaço após o sinal ":" indicando qual é o aluno do grupo que venceu a brincadeira.
|--------------------------------------------|
| Exemplo de Entrada | Exemplo de Saída |
|--------------------|-----------------------|
| 3 | Vencedor(a): Fernanda |
| Fernanda 7 | |
| Fernando 9 | |
| Gustavo 11 | |
|--------------------|-----------------------|
| 5 | Vencedor(a): Pedro |
| Maria 7 | |
| Pedro 9 | |
| Joao_Vitor 5 | |
| Isabel 12 | |
| Laura 8 | |
|--------------------|-----------------------|
| 3 | Vencedor(a): Pedro |
| Maria 4 | |
| Pedro 3 | |
| Joao 2 | |
| 0 | |
|--------------------------------------------|
*/

//Código do desafio:
const inputs = [//para uso local
'3',
'Fernanda 7',
'Fernando 9',
'Gustavo 11',
'5',
'Maria 7',
'Pedro 9',
'Joao_Vitor 5',
'Isabel 12',
'Laura 8',
'3',
'Maria 4',
'Pedro 3',
'Joao 2',
'0',
]

let n = 0; //para uso local

while (true) {
// let nStudents = parseInt(gets());//para uso na DIO
let nStudents = parseInt(inputs[n++]); //para uso local

if (nStudents === 0) break;

if (nStudents < 1 || nStudents > 100) {
n += nStudents //para uso local
continue;
}

let students = [];
let i = 0;

while (i < nStudents) {
// let input = gets();//para uso na DIO
let input = inputs[n++];//para uso local

let [name, value] = input.split(' ');
i++;

if (!(name.match(/^[A-Za-z_]{1,30}$/)) || !(1 <= value && value <= 500)) {
// console.log(`Entrada do Aluno ${name} com valor ${value} é inválida.`)
continue;
}
students = [...students, { name, value }]
}

let winner = whoIsChampion(students);
console.log(`Vencedor(a): ${winner}`);

}

function whoIsChampion(group, index = 0, removed = {}) {
if (group.length === 1) return group[0].name;

let nextIndex = undefined;
let studentNumber = parseInt(removed.value) || parseInt(group[index].value);

(studentNumber % 2 === 0) ? studentNumber *= -1 : studentNumber *= 1;

const indexToRemove = crawlArray(group, index, studentNumber);

[removed] = group.splice(indexToRemove, 1);

if (removed.value % 2 === 0) {
nextIndex = (indexToRemove > group.length - 1)
? 0
: indexToRemove;
}
else {
nextIndex = (indexToRemove > group.length - 1)
? group.length - 1
: indexToRemove - 1;
}

return whoIsChampion(group, nextIndex, removed);
}

function crawlArray(array, index, n) {
return ((index + n) % array.length + array.length) % array.length;
}
//### Desafio - Gincana no Acampamento

faço trabalhos avulsos de programação em php , javascript , html , VBA-EXCEL e EXCEL formulas avançadas . pode entrar em contato no whatsapp 83988596239. nós combinaremos os valores de acordo com a demanda.

Nenhum comentário:

Postar um comentário

Programando com JS 2 / 5 - Resto 2

  Desafio Leia um valor inteiro N . Apresente todos os números entre 1 e 10000 que divididos por N dão resto igual a 2. Entrada A ...