Escolar Documentos
Profissional Documentos
Cultura Documentos
Existe uma estratégia para ganhar o jogo que é muito simples: ela consiste em deixar
sempre múltiplos de (m+1) peças ao jogador oponente.
Objetivo
Uma vez iniciado o jogo, a estratégia do computador para ganhar consiste em deixar
sempre um número de peças que seja múltiplo de (m+1) ao jogador. Caso isso não
seja possível, deverá tirar o número máximo de peças possíveis.
Seu trabalho, então, será implementar o Jogo e fazer com que o computador se utilize
da estratégia vencedora.
Seu Programa
Uma dúvida que pode surgir nesse momento é como modelar o jogo de forma que
possa ser implementado em Python 3 correspondendo rigorosamente às
especificações descritas até agora.
Observe que, para isso funcionar, seu programa deve sempre "lembrar" qual é o
número de peças atualmente no tabuleiro e qual é o máximo de peças a retirar em
cada jogada.
Cuidado: o corretor automático não funciona bem se você tiver alguma chamada a
input() antes da definição de todas as funções do jogo (a menos que essa chamada
esteja dentro de uma função). Se seu programa usar input() sem que ele esteja dentro
de alguma função, coloque-o no final do programa.
Campeonatos
Como todos sabemos, uma única rodada de um jogo não é suficiente para definir
quem é o melhor jogador. Assim, uma vez que a função partida esteja funcionando,
você deverá criar uma outra função chamada campeonato. Essa nova função deve
realizar três partidas seguidas do jogo e, ao final, mostrar o placar dessas três partidas
e indicar o vencedor do campeonato. O placar deve ser impresso na forma
Quantas peças? 3
Limite de peças por jogada? 1
Computador começa!
Quantas peças? 3
Limite de peças por jogada? 2
Voce começa!
Quantas peças? 4
Limite de peças por jogada? 3
Voce começa!
Quantas peças você vai tirar? 2
Voce tirou 2 peças.
Agora restam 2 peças no tabuleiro.
Tarefa 2:
Prólogo
Nesta parte do projeto, iremos praticar não só o que vimos até agora na disciplina,
mas também outra habilidade importante de um programador: utilizar e interagir com
código escrito por terceiros. Aqui, você não irá implementar o seu programa do zero.
Você irá partir de um programa já iniciado e irá completá-lo. Na verdade, esse é o
caso mais comum na indústria de software, onde muitos desenvolvedores trabalham
colaborativamente em um mesmo programa.
Introdução
Detecção de autoria
Traços linguísticos
Funcionamento do programa
• Tamanho médio de palavra é a soma dos tamanhos das palavras dividida pelo
número total de palavras.
• Relação Type-Token é o número de palavras diferentes dividido pelo número
total de palavras. Por exemplo, na frase "O gato caçava o rato", temos 5 palavras no
total (o, gato, caçava, o, rato) mas somente 4 diferentes (o, gato, caçava, rato). Nessa
frase, a relação Type-Token vale 4/5 = 0.8.
• Razão Hapax Legomana é o número de palavras que aparecem uma única vez
dividido pelo total de palavras. Por exemplo, na frase "O gato caçava o rato", temos
5 palavras no total (o, gato, caçava, o, rato) mas somente 3 que aparecem só uma
vez (gato, caçava, rato). Nessa frase, a relação Hapax Legomana vale 3/5 = 0.6.
• Tamanho médio de sentença é a soma dos números de caracteres em todas as
sentenças dividida pelo número de sentenças (os caracteres que separam uma
sentença da outra não devem ser contabilizados como parte da sentença).
• Complexidade de sentença é o número total de frases divido pelo número de
sentenças.
• Tamanho médio de frase é a soma do número de caracteres em cada frase dividida
pelo número de frases no texto (os caracteres que separam uma frase da outra não
devem ser contabilizados como parte da frase).
Após calcular esses valores para cada texto, você deve compará-los com a assinatura
fornecida para os infectados por COH-PIAH. O grau de similaridade entre dois textos, a e b,
é dado pela fórmula:
Em que:
Caso você não esteja acostumado com a notação matemática, podemos destrinchar essa
fórmula da seguinte maneira:
Para cada traço linguístico i (tamanho médio da palavra, relação type-token etc.) se quer a
diferença entre o valor obtido em cada texto dado (a) e o valor típico do texto de uma
pessoa infectada (b): fi,a - fi,b
Perceba que quanto mais similares a e b forem, menor Sab será. Para cada texto, você deve
calcular o grau de similaridade com a assinatura do portador de COH-PIAH e, no final, exibir
qual texto mais provavelmente foi escrito por algum aluno infectado (ou seja, o texto com
assinatura mais similar à assinatura dada).
Exemplo:
Num fabulário ainda por encontrar será um dia lida esta fábula: A uma bordadora dum país
longínquo foi encomendado pela sua rainha que bordasse, sobre seda ou cetim, entre
folhas, uma rosa branca. A bordadora, como era muito jovem, foi procurar por toda a parte
aquela rosa branca perfeitíssima, em cuja semelhança bordasse a sua. Mas sucedia que
umas rosas eram menos belas do que lhe convinha, e que outras não eram brancas como
deviam ser. Gastou dias sobre dias, chorosas horas, buscando a rosa que imitasse com
seda, e, como nos países longínquos nunca deixa de haver pena de morte, ela sabia bem
que, pelas leis dos contos como este, não podiam deixar de a matar se ela não bordasse a
rosa branca. Por fim, não tendo melhor remédio, bordou de memória a rosa que lhe haviam
exigido. Depois de a bordar foi compará-la com as rosas brancas que existem realmente
nas roseiras. Sucedeu que todas as rosas brancas se pareciam exactamente com a rosa que
ela bordara, que cada uma delas era exactamente aquela. Ela levou o trabalho ao palácio e
é de supor que casasse com o príncipe. No fabulário, onde vem, esta fábula não traz
moralidade. Mesmo porque, na idade de ouro, as fábulas não tinham moralidade nenhuma.
Digite o texto 2 (aperte enter para sair):
Voltei-me para ela; Capitu tinha os olhos no chão. Ergueu-os logo, devagar, e ficamos a
olhar um para o outro... Confissão de crianças, tu valias bem duas ou três páginas, mas
quero ser poupado. Em verdade, não falamos nada; o muro falou por nós. Não nos
movemos, as mãos é que se estenderam pouco a pouco, todas quatro, pegando-se,
apertando-se, fundindo-se. Não marquei a hora exata daquele gesto. Devia tê-la marcado;
sinto a falta de uma nota escrita naquela mesma noite, e que eu poria aqui com os erros de
ortografia que trouxesse, mas não traria nenhum, tal era a diferença entre o estudante e o
adolescente. Conhecia as regras do escrever, sem suspeitar as do amar; tinha orgias de
latim e era virgem de mulheres.
Funções de suporte
Para facilitar seu trabalho, fornecemos para você um esqueleto do programa completo
como base. Use-o! As funções definidas nele devem ser utilizadas no seu programa;
algumas já estão implementadas, outras devem ser implementadas por você (conforme
indicado pelo comentário "IMPLEMENTAR"). Sinta-se livre para criar funções adicionais,
caso necessário.
import re
def le_assinatura():
'''A funcao le os valores dos tracos linguisticos do modelo e devolve uma assinatura a ser comparada com
os textos fornecidos'''
print("Bem-vindo ao detector automático de COH-PIAH.")
print("Informe a assinatura típica de um aluno infectado:")
def le_textos():
'''A funcao le todos os textos a serem comparados e devolve uma lista contendo cada texto como um
elemento'''
i=1
textos = []
texto = input("Digite o texto " + str(i) +" (aperte enter para sair):")
while texto:
textos.append(texto)
i += 1
texto = input("Digite o texto " + str(i) +" (aperte enter para sair):")
return textos
def separa_sentencas(texto):
'''A funcao recebe um texto e devolve uma lista das sentencas dentro do texto'''
sentencas = re.split(r'[.!?]+', texto)
if sentencas[-1] == '':
del sentencas[-1]
return sentencas
def separa_frases(sentenca):
'''A funcao recebe uma sentenca e devolve uma lista das frases dentro da sentenca'''
return re.split(r'[,:;]+', sentenca)
def separa_palavras(frase):
'''A funcao recebe uma frase e devolve uma lista das palavras dentro da frase'''
return frase.split()
def n_palavras_unicas(lista_palavras):
'''Essa funcao recebe uma lista de palavras e devolve o numero de palavras que aparecem uma unica vez'''
freq = dict()
unicas = 0
for palavra in lista_palavras:
p = palavra.lower()
if p in freq:
if freq[p] == 1:
unicas -= 1
freq[p] += 1
else:
freq[p] = 1
unicas += 1
return unicas
def n_palavras_diferentes(lista_palavras):
'''Essa funcao recebe uma lista de palavras e devolve o numero de palavras diferentes utilizadas'''
freq = dict()
for palavra in lista_palavras:
p = palavra.lower()
if p in freq:
freq[p] += 1
else:
freq[p] = 1
return len(freq)
def calcula_assinatura(texto):
'''IMPLEMENTAR. Essa funcao recebe um texto e deve devolver a assinatura do texto.'''