Mooshak
Compreender o Mooshak em 15 minutos
O Mooshak é um sistema de avaliação automática de programas. Depois de resolveres um problema de programação proposto na DEI Academy, podes submetê-lo ao Mooshak e ele diz- te se está correcto! A sua utilização é simples.
Interacção com o Mooshak
Começa por aceder ao site: http://mooshak.dei.uc.pt/~academy
Aparece-te um ecran como o seguinte:
Se não estás registado ainda, clica na opção "Register for on-line contest" e aparecerá um ecran onde deverás introduzir alguns dados:
Após registares-te, recebes um mail com os dados de acesso (username e password). A partir daí, poderás logar-te na máquina e começar a resolver problemas! Depois de fazeres o login, o ecran que aparece é algo como o seguinte:
Podes então escolher um problema, clicando no botão correspondente. Se carregarmos no A, por exemplo, teremos o seguinte problema:
Podemos resolver os problemas em C, C++, Pascal, Java ou Python. Imaginemos que resolviamos o problema em Python, com o seguinte código:
x=input()
if(x%2==0):
print "sim"
else:
print "nao"
Podiamos então submeter a solução com o botão "Submit". E pronto, temos a resposta!... Claro que podem haver várias respostas, mas disso falamos mais abaixo.
ATENÇÃO! Como é uma máquina, ele exige um grande rigor do lado do programador. Mas depois de percebermos como funciona, as coisas passam a ser muito simples!... ;-)
Como é que o Mooshak avalia os programas?
O Mooshak permite que o problem setter (ou seja, o professor que inventou o problema) lá coloque um grande número de problemas para serem resolvidos. De cada vez que cria um problema novo, o que o problem setter faz é colocar um enunciado e um conjunto de casos de teste. Cada caso de teste consiste em dados de entrada e dados de saída - para um p rograma ser considerado correcto (ou seja, ter "Accepted"), terá produzir os dados de saída correctos em função dos dados de entrada. Por exemplo, imaginemos que o nosso probl ema é "Dado um número qualquer de entrada, responder sim se fôr par; responer nao se fôr impar". Dois casos de teste possível seriam os seguintes:
Caso de teste 1:
input: 5
output: nao
Caso de teste 2:
input: 6
output: sim
Na realidade, a única coisa que o mooshak faz é receber os teus programas, e corrê-los com os dados de input que tem na sua configuração. Depois, usa um comando linux (o "diff ") para ver a diferença entre o que o programa produziu e o que está especificado (pelo problem setter) no output desejado. Simples, não é? Se percebes um pouco de linux, co mpreenderás os comandos que ele usa para validar um caso de teste (o "test12). São mais ou menos estes:
# ./a.out<tests/test1/input>output
Depois, verifica a correcção da submissão através de diff:
# diff output tests/test1/output
(se não percebeste esta parte, não te preocupes, não tem mesmo grande importância!... ;-)
Que tipo de resultados mostra?
A partir do resultado do diff, produz um “relatório” e um resultado, que pode ser:
Accepted – Tudo correcto! :-)
Presentation Error – Falta/sobram espaços, \n...
Wrong Answer – Submissão errada. Há diferenças "substanciais" entre o teu output e o esperado. (ATENÇÃO: Por vezes, essa diferença é mesmo mínima. Basta que o output esp erado tenha um ponto final, por exemplo, e te tenhas esquecido de pôr e dá logo Wrong Answer!!)
Time Limit Exceeded – Programa excede limite de tempo. Toca a fazer o programa mais eficiente!
Runtime Error – Programa lança uma excepção. Ou seja, pára a meio da execução (por exemplo, crashou!).
Memory Limit Exceeded - Programa excede limite de memória
Invalid Function – Programa utiliza uma função inválida. Por exemplo, não podes nunca usar acesso a ficheiros ou executar funções no sistema, por uma questão de seguranç a do sistema (senão, era muito fácil para os hackers entrarem no mooshak! ;-) ).
Como é que ordena as submissões?
O Mooshak foi feito para apoiar em concursos de programação, por isso tem particular cuidado na ordenação das submissões. Ele permite vários tipos de ordenamento que são stand ard internacional em concursos de programação (por exemplo, seguidos pelo IPCP e pelas IOI).
Na DEI Academy vamos seguir os métodos do ICPC, que são os mais comuns e também os mais simples:
Os concorrentes são ordenados primeiro pelo número de problemas resolvidos;
Em caso de empate, o sistema ordena os utilizadores por “tempos” de submissão. Esses tempos são contados desde o inicio do concurso e são sempre a somar (por exemplo, se um concorrente resolve um problema aos 10 minutos e outro às 2h, o tempo será 2h10);
Cada submissão errada, após ter o problema resolvido, contará 20 min. extra de penalização.
Ajudas
Existem duas formas de ajuda para quando resolvemos os problemas com o Mooshak. A ajuda estática (o botão Help) serve para saber informações sobre as versões dos compiladores ou a memória máxima permitida. Mas a ajuda mais importante são as "Questions". Nesta secção, os programadores podem colocar questões ao júri (gestor). Para fazer uma pergunta sobre um problema, tens que clicar primeiro no botão do problema, e depois no botão "Ask". Depois, tens que esperar que te respondam. Aproveita para ir lendo as questões que já foram colocadas pelos teus colegas. É comum aquilo que procuras estar por lá já respondido!...
Os 7 pecados mortais do Mooshak
Assumir que os casos de teste do enunciado são os únicos testados - No enunciado, são colocados apenas examplos de casos de teste. Muitas das vezes, até são exemplos bem mais simples do que os que o Mooshak tem...
Não ler o enunciado - Muita atenção às dimensões de input e output!
Não testar com casos limite (“O que acontecerá se não houver casos de teste? E se só houver um? E se fôr o maior número possível?”)
Não ver bem o formato de saída - O enunciado tem que ser seguido rigorosamente. Se disser que tem que haver um "ponto final", então temos que o pôr. Se disser que esta ou aquela letra tem que ser maiúscula, então, temos que o fazer!!
Avançar sem ver as “questions” - Se não estamos a conseguir resolver, será que há perguntas/respostas que ajudem?
Avançar sem fazer análise de complexidade - Em face dos limites de i/o, será que o algoritmo que penso é suficiente? Durante os níveis Intermediários e Avançados vamos falando neste tema...
Submeter uma resolução sem testar convenientemente. Os passos são sempre os seguintes:
Compilar exactamente como no mooshak (ver Help)
Correr os testes na linha de comando (como mostrado anteriormente)
Utilizar vários casos de teste (pensar nos mais complicados!)
Eliminar mensagens de texto supérfluas (às vezes, pômos os nossos programas a imprimir mais coisas do que é pedido no enunciado...)