MC346 - Paradigmas de Programação: Programação Funcional: Desafio

      Criada: 2017-09-27
      Modificada: 2017-10-11 (putStrLn, exemplos de formato correto)
    

Projeto Haskell

Seu desafio envolvendo a linguagem Prolog será escrever um resolvedor para o jogo Master Mind.

Sobre o programa

Seu programa deverá ser entregue na forma de código fonte Haskell para ser compilado usando a Haksell Platform. Deverá conter todas as funções necessárias para resolver o problema, incluindo uma função de play. Um esqueleto do programa pode ser encontrado aqui (salve como esqueleto.hs) e é reproduzido a seguir:

      
import System.IO

-- Suas funções aqui, com comentários

play ... = do
    ...
    putStrLn chute
    ...
    answer <- getLine
    ...
    play ...	      

-- Programa principal
main = do
    hSetBuffering stdout LineBuffering
    play ...
    

Note que a função play é recursiva, para facilitar a passagem do estado do jogo de um lance a outro. Você pode defini-la com quantos parâmetros quiser. Note ainda a presença de código para configurar a buferização da saída (hSetBuffering ...). É importante incluir esta linha para que o programa funcione junto ao avaliador.

Seus chutes devem ser impressos na saída padrão. Os chutes devem ser Strings de quatro dígitos inteiros, não necessariamente distintos, cada um deles de 1 a 6, por exemplo, 5322. A resposta de cada chute deve ser lida da entrada padrão. As respostas são Strings de dois dígitos inteiros, o primeiro sendo o número de "bons" e o segundo sendo o números de "regulares" no chute, por exemplo, 40.

Seu programa deverá tentar adivinhar a senha pensada pelo outro jogador da forma mais rápida possível, isto é, com o menor número de chutes. A senha possui dígitos distintos, caso contrário seu programa deverá acusar "erro". Um programa correto deverá terminar de uma das duas formas seguintes:

Qualquer outro comprotamento será considerado errôneo e acarretará perda de pontos para a autora ou o autor.

Para efeito de depuração, os alunos poderão fazer o programa imprimir outras informações que acharem necessárias, mas todas elas deverão ser dirigidas à saída de erro (stderr), e não à saída padrão (sdtout), que deverá ser reservada para comunicação com o avaliador apenas.

Sobre o avaliador

Um programa avaliador será usado para auxiliar o instrutor a avaliar os programas dos alunos. O avaliador pensará numa senha aleatória, ou receberá uma senha na linha de comando, e dará as respostas corretas relativas a esta senha para os programas.

O avaliador foi escrito em C e seu código-fonte está disponível. Os alunos poderão compilá-lo e usá-lo para testar seus programas. O avaliador foi feito para funcionar em Linux. Seu uso em Windows poderá ser diferente. Em Linux, deve ser compilado da seguinte forma:

      gcc aval5.c -o aval5      
e chamado como:
      ./aval5 <programa-haskell> [<senha>]      
onde <programa-haskell> é o programa da aluna ou do aluno. Se a <senha> for omitida, será gerada uma senha aleatória.

Sobre o score

Para aqueles que fizeram o Desafio Prlog, observem que a função que calcula o score é diferente nos dois avaliadores. Como agora no Haskell estamos permitindo repetições nos chutes, é importante ressaltar que o score (número de bons e de regulares) é definido sempre em referência ao chute, ou seja, cada posição do chute pode ser boa (se coincide com a mesma posição na senha), ou regular (se aparece na senha em outra posição).

Vejam um exemplo: senha = 1234, chute = 1111. Neste caso, temos 1 bom e 3 regulares. E senha = 1234, chute = 1113 também dá 1 bom e 3 regulares.


MC346 Home

© 2017 João Meidanis