Prazo de entrega:
Segunda chance:
Esta tarefa tem peso 1.
Você irá aprender a alocar e manipular dados dinamicamente. Também, precisará resolver alguns exercícios escrevendo algoritmos recursivos.
1. Centroide
Uma das tarefas mais recorrentes na análise de dados é o cálculo do centroide de um conjunto de pontos do espaço euclideano $d$-dimensional. O centroide é a média do conjunto, isso é, cada uma de suas coordenadas é dada pela média das coordenadas correspondentes do conjunto de pontos. Tipicamente, o centroide é um ponto representativo das características de algum conjunto de dados.
No entanto, o cálculo de centroide é sensível à escala, então é necessário realizar uma etapa de preparação dos dados chamada de normalização (uma discussão sobre isso está disponível nesse link).
Há várias formas de preparar dados e, entre as mais comuns, listamos:
-
Não normalizar, i.e., utilizar os dados de entrada diretamente.
-
Normalizar coordenadas por intervalo, também chamada de normalização min-max. Nesse caso, cada coordenada é modificada linearmente de forma que os valores mínimos e máximos sejam $-1$ e $1$. Se todos os valores forem iguais, então cada coordenada é mapeada para $0$.
-
Tratar cada ponto como um vetor independentemente e dividir cada um deles por seu comprimento, de forma que o vetor passe a ter norma euclidiana unitária.
Escreva um programa centroide
que leia um conjunto variável de pontos
$d$-dimensionais e calcule o centroide utilizando cada uma das estratégias
acima.
Uma consideração importante ao lidar com números com o computador é que muitas vezes eles não são representados de maneira exata. Que complicações isso pode ter e que tipos de cuidados você poderia ter para mitigar essas complicações?
Entrada
A primeira linha contém dois números inteiros $d$ e $n$ que indicam a dimensão e o número de pontos que serão lidos. Cada uma das próximas $n$ linhas contém $d$ números reais, correspondendo às coordenadas de um dos pontos.
3 2
1.600 -0.700 -0.600
-1.100 0.800 -2.400
Saída
A saída contém uma linha com o centroide encontrado para cada uma das estratégias acima, em ordem.
nenhum: 0.250 0.050 -1.500
janela: 0.000 0.000 0.000
normal: 0.234 -0.045 -0.597
2. Quase palíndromo
Uma string é um $k$-quase palíndromo se, ao compará-la com o seu inverso, tiver
no máximo $k$ caracteres diferentes. Por exemplo, arara
é um $0$-quase
palíndromo e araro
é um $2$-quase palíndromo.
Crie um programa quase_palindromo
que verifique se uma palavra é um $k$-quase
palíndromo.
Entrada
A primeira linha contém um número $k$ e a segunda linha contém uma string.
2
araro
Nesse exercício, você pode supor que a maior palavra tem 400 caracteres, então
você não precisa se preocupar com entradas maiores do que isso. Na prática, isso
quase nunca é verdade, então ler uma string cegamente, com scanf
por exemplo,
é pedir para ter problemas sérios de segurança. Quais são esses problemas e o
que fazer para evitá-los mesmo sem conhecer a entrada?
Saída
Uma linha contendo sim
ou nao
, dependendo se a string é um
$k$-quase palíndromo.
sim
3. Desafio e recompensa
João tem um dado com seis faces.
Maria está a $x$ passos de João.
Se João joga o dado e tira $p$,
Maria dá $p$ passos até o João.
Se $p$ é igual a $x$ nesse momento,
Maria recompensa João agora.
Mas se for maior que $x$, João, lamento,
Maria dá as costas e vai-se embora.
Crie um programa recompensa
que calcule a probabilidade de João receber a
recompensa se ele puder jogar o dado até $n$ vezes e cada vez Maria se aproximar
mais um pouquinho. Você deve supor que todas as faces do dado ocorrem com
probabilidades iguais.
Entrada
Número inteiros $n$ e $x$.
2 2
Saída
Um número entre 0 e 1 com três casas decimais após a vírgula representando a probabilidade de João conseguir a recompensa.
0.194
Dicas
Observe que no exemplo da entrada há apenas duas possibilidades para João ganhar o jogo: jogar o dado uma vez e obter a face 2; ou jogar o dado duas vezes obtendo a face 1 em cada uma delas. Em qualquer cenário diferente desses, Maria passará direto por João. A probabilidade de João obter a face 2 na primeira jogada é $1/6$. Se João obtém a face 1, ainda tem direito a mais uma jogada. Portanto, a probabilidade de João obter a face 1 duas vezes é $(1/6)^2 = 1/36$. A probabilidade de João ganhar a recompensa é $1/6 + 1/36 = 7/36 ≈ 0.194$. A imagem abaixo ilustra essas possibilidades.
Critérios
Você deve utilizar alocação dinâmica para armazenar e manipular os dados de entrada do primeiro item. Nos demais exercícios, não é necessária alocação dinâmica, mas você deve resolver os problemas utilizando algoritmos recursivos, mesmo que conheça algoritmos iterativos para eles.