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 |
Nenhum comentário:
Postar um comentário