Lista 2

Recomendações Importantes

  • A lista deve ser entregue até às 23:59:59 do dia 12/10/2015.
  • Deixe seus programas entendíveis. Imprima mensagens para auxiliar o usuário a utilizar o seu programa.
  • Seja criativo. As mensagens do seu programa não necessitam estar iguais aos exemplos, a menos que seja especificado.
  • A lista é individual, portanto não compartilhe seus códigos com outros alunos ou os coloque em locais públicos (Pastebin, Github).
  • Não copie. Se for detectado cópia da internet ou de um colega, as LISTAS envolvidas serão completamente zeradas.
  • Alguns exemplos aqui definidos podem apresentar comentários. Note que são apenas ilustrativos.
  • A correção da Questão Desafio é booleana. Ou seja: você receberá o ponto extra do desafio caso a resposta esteja 100% correta. Qualquer erro, mesmo que seja em apenas um caso, invalidará a questão.
  • Não é permitido o uso da API de Java ou bibliotecas externas, exceto quando permitido explicitamente na questão, na lista, ou autorizado por um monitor através da lista de email (Google Groups) da disciplina. Questões submetidas que violarem essa regra serão consideradas como não entregues.
  • São permitidas nessa lista, para todas as questões:
    • String
    • Scanner
    • Math

Questão 1 – Aperture program

Parabéns! Você foi selecionado para trabalhar com engenheiro de segurança da ENCOM, maior império tecnológico atual. Entretanto a única vaga disponível é dentro do Grid, onde apenas os melhores programadores são convidadosa a entrar. Para alcançar essa honra, foi dado a você um desafio: criar um algoritmo de criptografia (T) que gere um código de acesso a partir de uma entrada N (0<N<128), e segue a seguinte formula, que mistura números primos com recursividade:

T(0) = 1;

T(N) = (N + (N-Ésimo Primo))*T(N-1);

“-s” encerra o programa.

Exemplo de entrada e saída:

1 // Entrada do usuário
CÓDIGO: 3.0 // Saída
2 // Entrada do usuário
CÓDIGO: 15.0 // Saída
5 // Entrada do usuário
CÓDIGO: 21120.0 // Saída
10 // Entrada do usuário
CÓDIGO: 3.2451674112E11 // Saída
50 // Entrada do usuário
CÓDIGO: 9.76519608045486E96 // Saída
127 // Entrada do usuário
CÓDIGO: 6.058242152838519E306 // Saída
-s// Entrada do usuário
// Fim do programa

Questão 2 – Welcome to the grid

Depois de finalmente conseguir entrar no Grid, você foi confundido como um mero programa e intimado a participar das batalhas de Light Bikes. Porém, como você não pretende chegar despreparado, resolveu implementar um simulador para treinar e conseguir sair não corrompido da competição!

Para codificar o simulador, as seguintes regras foram utilizadas:

1 - A batalha ocorre num grid quadrado com no mínimo 5 de lado

2 – Os jogadores começam a batalha em quinas opostas do grid

3 – Após cada movimento, Light Bikes devem deixar um rastro de luz que deve ser usado para restringir o movimento do adversário

4 – O jogador que atingir algum rastro de luz ou sair do grid perde a batalha

5 – Caso um dos jogadores atinja a Light Bike do adversário, ambos perdem a batalha

Antes de iniciar a simulação de batalha, cada jogador deve inserir o seu nome para ser devidamente anunciado como vencedor ao fim da simulação.

Exemplo de entrada e saída:

Player One name:
Flynn
Player Two name:
Clu
Grid size:
6
B.....
......
......
......
......
.....O
Player One turn (w,a,s,d): s
B.....
B.....
......
......
......
.....O
Player Two turn (w,a,s,d): w
B.....
B.....
......
......
.....O
.....O
Player One turn (w,a,s,d): d
B.....
BB....
......
......
.....O
.....O
Player Two turn (w,a,s,d): w
B.....
BB....
......
.....O
.....O
.....O
Player One turn (w,a,s,d):

Questão 3 - Users and programs

Após sua incrível vitória na batalha de Light Bikes, você finalmente foi reconhecido como um usuário e selecionado para criar um sistema de gerenciamento para o GRID.

Dentro do grid, todos são entidades, com identidade digital única, que por sua vez são classificados em: usuários e programas. Os usuários são humanos materializados dentro do Grid e possuem nome, login e senha. Programas possuem funções e são divididos dentre neutros, ISOs e bugs. Estes dois ultimos possuem Nivel de impacto N (0>N<=1).

O seu programa deve ser capaz de:

    • Fazer o cadastro, pesquisa e exclusão de cada entidade.
    • Mostrar o nível de harmonia do Grid, inicialmente 50 e pode variar entre 0 e 100
        • ISOs contribuem para o incremento da harmonia do Grid
        • Neutros não afetam o nível de harmonia
        • Bugs contribuem para o decremento da harmonia do Grid
    • Mostrar se um usuario está ativo ou não.
    • Ao excluir um bug ou ISO o seu nivel de impacto é desconsiderado do calculo da harmonia da Grid.
    • Gerar um relatorio com todos os dados do Grid.
BEM VINDO AO GRID!
1. GERENCIAMENTO DE ENTIDADES
2. GERAR RELATORIO GRID
0. SAIR
1 // Entrada do usuário
GERENCIAMENTO DE ENTIDADES! // Saída
1. ADICONAR
2. BUSCAR
3. EXCLUIR
0. VOLTAR
1// Entrada do usuário
DIGITE A IDENTIDADE DIGITAL: // Saída
123 // Entrada do usuário
DEFINA O TIPO DA ENTIDADE: // Saída
1. USUARIO
2. PROGRAMA
1 // Entrada do usuário
NOME: // Saída
Leonardo // Entrada do usuário
LOGIN: // Saída
las3 // Entrada do usuário
SENHA: // Saída
Psswrd // Entrada do usuário
CADASTRO EFEITUADO COM SUCESSO! // Saída
GERENCIAMENTO DE ENTIDADES!
1. ADICONAR
2. BUSCAR
3. EXCLUIR
0. VOLTAR
1 // Entrada do usuário
DIGITE A IDENTIDADE DIGITAL: // Saída
1234 // Entrada do usuário
DEFINA O TIPO DA ENTIDADE: // Saída
1. USUARIO
2. PROGRAMA
2 // Entrada do usuário
CLASSE DO PROGRAMA: // Saída
1. NEUTRO
2. ISO
3. BUG
2 // Entrada do usuário
DEFINA A FUNÇÃO: // Saída
ir além // Entrada do usuário
DEFINA O NIVEL DE IMPACTO: // Saída
1 // Entrada do usuário
CADASTRO EFEITUADO COM SUCESSO! // Saída
GERENCIAMENTO DE ENTIDADES!
1. ADICONAR
2. BUSCAR
3. EXCLUIR
0. VOLTAR
1 // Entrada do usuário
DIGITE A IDENTIDADE DIGITAL: // Saída
12345 // Entrada do usuário
DEFINA O TIPO DA ENTIDADE: // Saída
1. USUARIO
2. PROGRAMA
2 // Entrada do usuário
CLASSE DO PROGRAMA: // Saída
1. NEUTRO
2. ISO
3. BUG
3
DEFINA A FUNÇÃO: // Saída
dar trabalho // Entrada do usuário
DEFINA O NIVEL DE IMPACTO: // Saída
0,5 // Entrada do usuário
CADASTRO EFEITUADO COM SUCESSO! // Saída
GERENCIAMENTO DE ENTIDADES!
1. ADICONAR
2. BUSCAR
3. EXCLUIR
0. VOLTAR
0 // Entrada do usuário
BEM VINDO AO GRID! // Saída
1. GERENCIAMENTO DE ENTIDADES
2. GERAR RELATORIO GRID
0. SAIR
2 // Entrada do usuário
RELATORIO GRID: // Saída
NIVEL DE ARMONIA: 50.5
ENTIDADES:
IDENTIDADE DIGITAL: 123
NOME: Leonardo
LOGIN: las3
SENHA: psswrd
STATUS: ATIVO
IDENTIDADE DIGITAL: 1234
FUNCAO: ir alem
NIVEL DE IMPACTO: 1.0
IDENTIDADE DIGITAL: 12345
FUNCAO: dar trabalho
NIVEL DE IMPACTO: 0.5
BEM VINDO AO GRID!
1. GERENCIAMENTO DE ENTIDADES
2. GERAR RELATORIO GRID
0. SAIR
0// Entrada do usuário
// Fim do programa

Questão 4 – Have you met MCP?

Os engenheiros de software da ENCOM estão preocupados com a segurança do seu servidor devido ao crescente número de tentativas de invasões que recebem diariamente, por este motivo eles decidiram que precisam otimizar o Programa de Controle Mestre (MCP) e por você ter acesso direto ao Grid (Afinal, você está dentro dele), você foi o escolhido.

Sua tarefa será criar um programa gerenciador de banco de ameaças, este programa deverá ter as seguintes funções.

1. Cadastrar uma nova ameaça.

2. Encerrar: deve exibir todas ameaças que foram cadastradas de acordo com a sua classificação e encerrar o programa.

Uma ameaça contém nívelPericulosidade, dataCriacao, nome e descricao.

Obs.: dataCriacao é do tipo Data que deve ser criado por você e contém dia, mês, ano e um método compareTo cujo retorno deve funcionar analogamente ao compareTo da classe String (Ler documentação).

A classificação de uma ameaça é dada pelos seguintes critérios(em caso de empate em um critério deve-se avaliar o critério seguinte)

1. nívelPericulosidade, ameaças mais perigosas são listadas antes.

2. dataCriacao, vírus mais novos são mais perigosos, ou seja, caso o nivelPericulosidade seja o mesmo, será exibido antes o que for mais recente.

3. Se mesmo após comparar as datas ainda persistir o empate, será exibido antes aquela cujo nome vier antes, lexicograficamente falando.

4. Se ainda tivermos um empate, será exibido aquela cuja descrição vier antes, lexicograficamente falando.

5. Tanto faz, eles são iguais, mas não precisa se dar ao trabalho de remover.

Facilitamos o seu trabalho e já encontramos a primeira ameaça, ela deve ser inserida no banco assim que o gerenciador for executado.

Nome: Regresso do monitor
Descrição: Este ser passou um tempo longe, mas agora voltou para causar o caos novamente, tretas S2.
Periculosidade: 8000
Data: 20 / 08 / 2015

Observações: seus amiguinhos de trabalho não gostam muito de você (recalcados por não terem conseguido entrar no Grid) e farão de tudo para fazer seu programa parar de funcionar, logo trate todos os possível erros que possam acontecer, caso o usuário tente digitar algum valor inválido, solicite que o mesmo digite o valor solicitado novamente.

O nível de periculosidade deve ser um inteiro positivo.

Trate todas as inconsistencias de data.

Bem vindo ao gerenciador de ameaças
Escolha a opção que deseja utilizar.
1 - Cadastrar nova ameaça
2 - Exibir ameaças e sair
1
Digite o nome da ameaça:
Rick
Digite a descrição desta ameaça:
Adepto ao tretismo.
Digite o nível de periculosidade da ameaça:
100
Digite o dia em que a ameaça foi descoberta:
25/08/2013
Entrada invalida, digite um valor númerico:
25
Digite o mês em que a ameaça foi descoberta:
08
Digite o ano em que a ameaça foi descoberta:
2015
Ameaça cadastrada com sucesso!
Escolha a opção que deseja utilizar.
1 - Cadastrar nova ameaça
2 - Exibir ameaças e sair
1
Digite o nome da ameaça:
Tiger
Digite a descrição desta ameaça:
CACiano do CIn
Digite o nível de periculosidade da ameaça:
100
Digite o dia em que a ameaça foi descoberta:
32/08/2012
Entrada invalida, digite um valor númerico:
31
Digite o mês em que a ameaça foi descoberta:
08
Digite o ano em que a ameaça foi descoberta:
2013
Ameaça cadastrada com sucesso!
Escolha a opção que deseja utilizar.
1 - Cadastrar nova ameaça
2 - Exibir ameaças e sair
1
Digite o nome da ameaça:
Rossi
Digite a descrição desta ameaça:
Monizueiro
Digite o nível de periculosidade da ameaça:
-1
O nível da ameaça deve ser um inteiro positivo.
1
Digite o dia em que a ameaça foi descoberta:
32
Digite o mês em que a ameaça foi descoberta:
09
Digite o ano em que a ameaça foi descoberta:
2015
A data esta incorreta!
Digite o dia em que a ameaça foi descoberta:
23
Digite o mês em que a ameaça foi descoberta:
09
Digite o ano em que a ameaça foi descoberta:
2015
Ameaça cadastrada com sucesso!
Escolha a opção que deseja utilizar.
1 - Cadastrar nova ameaça
2 - Exibir ameaças e sair
2
Regresso do monitor
8000
24/8/2015
Este ser passou um tempo longe, mas agora voltou para causar o caos novamente, tretas S2.
Rick
100
25/8/2015
Adepto ao tretismo.
Tiger
100
31/8/2013
CACiano do CIn
Rossi
1
23/9/2015
Monizueiro

Questão 5 - Codified Likeness Utility

Kevin Flynn tentou invadir o servidor da ENCOM com seu alias CLU para encontrar provas da sabotagem que Dillinger armou para cima dele. Entretanto, CLU foi detectado pelo MCP e a tentativa falhou miseravelmente. Estudando os motivos de sua falha, Flynn viu que para obter sucesso na sua invasão CLU precisará de um upgrade. Como ele não tem tempo para implementar as novas funções chamou você, que já se tornou uma lenda dentro do Grid, para codificar essa melhoria.

Implemente as seguintes funções para tornar CLU capaz de executar a sua tarefa:

"$cat str str" -> concatena duas strings.

"$minus str str" -> retira, da primeira String do comando, os caracteres presentes na segunda String, caso existam.

"$plus str str" -> adicionam, logo após a ocorrência do caracter, na primeira String do comando a quantidade de vezes que esse caracter aparece na segunda String, caso existam.

"$invert str" -> inverte a String.

":$insert str ch" -> insere um caracter numa String, alternando os caracteres originais com os inseridos.

"$quit" -> encerra o programa

OBS: O reconhecimento de Strings é feito encontrando caracteres de aspas duplas ("), e o de caracteres por aspas simples (')

$cat "lalau" "10"  // Entrada do usuário
"lalau10"  // Saída
$minus "parede" "pipa"  // Entrada do usuário
"rede"  // Saída
$plus "parede" "pipa"  // Entrada do usuário
"pppaarede"  // Saída
$invert "pipa"  // Entrada do usuário
"apip"  // Saída
$nsert "parede" '*'  // Entrada do usuário
"p*a*r*e*d*e"  // Saída
$quit  // Entrada do usuário
// Fim do programa

Desafio - Danger! Danger!

Perigo! Perigo!

As ameaças estão conseguindo migrar do mundo virtual para o mundo real e estão tentando acabar com a nossa comunicação, dando início ao que podemos chamar de terceira guerra mundial, desta vez entre máquinas e humanos, mas nós temos algo que elas não tem, você!

Para nossa sorte, alguns de nossos maiores especialistas conseguiram identificar seu algoritmo de locomoção, porém como ainda não sabemos como destruí-los, iremos apenas por algumas barreiras para atrasá-los.

É ai que você entra, você deve escrever um programa que diga onde cada barreira deve ficar.

Entrada: a primeira linha consistirá de um número(p) que será a quantidade de pontos, as próximas p linhas conterão cada uma dois valores(x, y) separados por um espaço em que representam as coordenadas do ponto em questão e uma última linha que será o coeficiente de variação(t).

1 < p <= 170

0 < x, y < 100

0 < t < 1

Saída: Uma única linha que contém dois valores correspondentes as coordenadas do ponto em que a barreira deve estar localizada.

Ah, quase esqueci, para saber calcular onde colocar este ponto use essa formula.

Onde:

n = número de pontos - 1

t = coeficiente de variação

Bi = Coordenada do i-ésimo ponto.

= n! / ( i! * ( n-i )! )

Observações:

Por causa da crise mundial, estamos com recursos limitados, logo você só poderá utilizar 1 laço no seu código que será para ler as entradas, em todo resto do programa deve-se usar recursão.

O programa será utilizado por usuários amigáveis, ou seja, todas entradas serão dadas no formato explicitado não precisando de validação de entrada.

Exemplo 1:
//entrada
2
2 3
5 5
0,5
//Saida
3.5
4.0
Exemplo 2:
//entrada
2
2 3
5 5
0,7
//saida
4.1
4.4
Exemplo 3:
//entrada
5
2 2
20 30
30 20
100 3
4 200
0,7
//saida
51.5866
56.83099999999999
Exemplo 4:
//entrada
10
3 7
200 200
50 15
1 1
25 35
64 10
99 64
33 33
69 96
500 600
0,3
//saida
56.09746381799998
43.94346725499998
Exemplo 5:
//entrada
10
3 7
200 200
50 15
1 1
25 35
64 10
99 64
33 33
69 96
500 600
0,9
//saida
231.04095029400006
278.287311265