Informação Técnica
Índice |
O sistema Mooshak
P: O que é o Mooshak?
R: O Mooshak é um sistema automático de avaliação de programas, desenvolvido pelo Prof. José Paulo Leal, do Departamento de Ciência de Computadores da Faculdade de Ciências da Universidade do Porto. O Mooshak é usado presentemente em vários concursos (tal como as Olimpíadas Nacionais de Informática, a Maratona Inter-Universitária de Programação ou o concurso regional ACM do Sudoeste da Europa). Para saberes mais sobre o sistema propriamente dito, visita o sítio oficial do Mooshak.
P: O que é possível fazer no Mooshak?
R: Podes enviar uma proposta de solução para um problema, recebendo uma resposta automatizada, ver o enunciado dos problemas, fazer perguntas ao júri, ver todas as submissões efectuadas (e respectivo código), ver a classificação actual e até visualizar uma pequena ajuda sobre o sistema.
P: Como enviar uma proposta de solução?
R: Crias um ficheiro com a extensão correspondente à linguagem utilizada (.c para programas em C, .cpp para programas em C++, .pas para programas em Pascal, .java para programas em Java), fazes o código para resolver o problema :-), e depois usando o interface escolhes o problema, depois o ficheiro com o código (Browse) e por fim envias o código (Submit). Nota que deves sempre enviar o código não compilado (ou seja, não envies ficheiros executáveis!).
Compilação de Programas
P: O que significa "Compile Time Error"?
R: Esta mensagem significa que o programa submetido dá erros ou warnings quando compilado no nosso sistema. Nota que todos os warnings têm de ser "corrigidos" para o programa ser aceite.
P: Porque é que o meu código não dá erros nem avisos em minha casa e aí não funciona?
R: O uso de um compilador diferente dá origem
a resultados diferentes. Para além disso têm de ser usadas exactamente as flags de compilação que usamos aqui. Por uma questão de referência, fica aqui o que é usado no nosso sistema (esta informação pode ser consultada carregando no botão help no Mooshak ):
Linguagem | Compilador | Versão | Comando de compilação |
---|---|---|---|
C | GCC | 4.3.2 | gcc -Wall -lm prog.c |
C++ | GCC | 4.3.2 | g++ -Wall prog.cpp |
Pascal | Free Pascal | 2.2.4 | fpc -v0w -oprog prog.pas |
Java | Java(TM) | 1.6 | javac prog.java |
Para obter estes compiladores podem usar a página de ligações deste mesmo site.
Convém salientar que o sistema operativo usado aqui é o Linux e que portanto existem sempre ligeiras diferenças mesmo quando se usa o mesmo compilador. Em particular, a função gets dá um warning em Linux (podes sempre usar o fgets) e o uso de funções ou bibliotecas específicas de Windows (como por exemplo o conio.h) não é permitido.
P: Mas então, se não tiver Linux como sei que erros estou a ter quando aqui em casa uso o GCC, por exemplo em Windows, e aqui não tenho erros?
R: Basta clicares na frase Compile Time Error das tuas próprias submissões, ficando a saber exactamente o erro que tiveste no servidor.
Deve ser notado que de nenhum modo o facto de o concorrente ter 0 ou 100 compile time errors prejudica a sua classificação.
Input/Output
P: Como é feito o input/output dos programas?
R: Em todos os problemas o input é feito pelo standard input e o output é feito pelo standard output.
P: E o que é o standard input e o standard output?
R: Quando um processo pede dados, se não especificar a sua origem, o sistema operativo vai buscá-los ao standard input que, por defeito, é o teclado.
Analogamente, quando um processo faz uma escrita, se não especificar o seu destino, o sistema operativo escreve no standard output que, por defeito, é a consola.
Portanto, os vossos programas podem e devem usar as funções "normais" de escrita leitura, como sejam o scanf e printf (em C) ou o read e write (em Pascal).
P: Mas como é que o Mooshak testa os problemas? Vocês colocam "à mão", pelo teclado, os inputs para os nossos programas?
R: O Mooshak tem os inputs em vários ficheiros. O que o sistema faz é redireccionar o standard input para um ficheiro.
Para simular esse processo (e é assim que devem testar os vossos programas) façam copy/paste do exemplo de input para um ficheiro e dêem-lhe um nome, por exemplo, input.txt. Depois façam:
nome_executavel < input.txt
Como sabem, a instrucao < tanto na linha de comandos do Windows como em Linux tem o efeito de redireccionar o standard input para o ficheiro especificado (já agora para redireccionar o standard output faça nome_executavel < input.txt > output.txt). Isto é equivalente a correr o programa e introduzir via teclado todo o conteúdo do ficheiro.
Deve também ser notado que todas as linhas, incluindo a última, devem ter o caracter de mudança de linha. Isto é válido tanto para os inputs como para os outputs.
Classificação da Qualificação
P: Como será feita a classificação da qualificação?
R: A classificação é feita mediante o que está explicado no ponto 11 do regulamento:
"A classificação é atribuída automaticamente pelo sistema em função do número de testes avaliados correctamente pelos programas submetidos pelos concorrentes e será validada por um júri nacional, nomeado pela organização, o qual também desempatará os casos em que isso seja necessário, observando a qualidade da programação."
Dito por outro modo, uma série de testes (leia-se diferentes inputs, de diferentes tamanhos) serão corridos com o programa e automaticamente será visto quais os testes que o programa acerta. Cada teste corresponde a um determinado número de pontos e o máximo possível é de 100 pontos. No treino é feita exactamente a mesma coisa.
No entanto, deve ser notado que o resultado da avaliação será escondido dos concorrentes e só será divulgado depois da qualificação terminar. Isto é diferente do treino, na medida em que neste os concorrentes têm acesso à pontuação obtida, podendo experimentar vários programas, vendo qual dá mais pontuação.
Na qualificação propriamente dita, ao submeter um programa os concorrentes terão Accepted se o seu programa produzir respostas correctas para o exemplo dado no enunciado e para um outro teste de dimensão mínima (um caso básico, portanto). Isto serve para que os concorrentes possam ter a certeza que o seu programa está no formato esperado e garante que o programa passa num teste básico (o que não garante necessariamente pontos nos testes reais).
Se um programa tem Accepted na qualificação, não significa que consegue passar em todos os testes!. Tal como explicado, significa apenas que o programa passa num teste muito básico.
Outro factor muito importante é que apenas a última submissão de cada concorrente em cada um dos problemas será avaliada. Todas as outras submissões serão ignoradas para efeitos de classificação.
No treino, para saber quantos pontos tiveste, basta espreitar o "Ranking". Entre parenteses na classificação está o número de submissões feitas para esse problema.
P: Então o tempo que eu demoro a fazer o código e o número de submissões não contam para nada?
R: Para efeitos de classificação, só interessa a última submissão de cada problema feita durante o tempo da qualificação. Não importa se a submissão foi feita logo na primeira hora de concurso ou a 1 minuto deste mesmo concurso acabar. Do mesmo modo, não importa que antes da última submissão o concorrente tenha feito N submissões. O concorrente pode submeter quantas vezes quiser.
P: Mas se é assim, porque é que o nosso Mooshak me mostra uma classificação que tem em conta o tempo de submissão? [nota: isto só acontecerá na qualificação e não no treino, onde os alunos têm hipótese de ver a pontuação obtida]
R: O Mooshak que os concorrentes usam está em modo ICPC, ou seja, produz uma classificação baseada nos concursos ACM (para alunos universitários). Esta classificação é completamente irrelevante para efeitos da qualificação das ONI'2015 e está presente apenas a título informativo.
A classificação real só será portanto divulgada depois da qualificação acabar.
Para os mais curiosos, a classificação dos concursos ACM tem primeiro em conta o número de problemas resolvidos (com Accepted, portanto) e depois, em caso de empate, o tempo gasto nas submissões. Este tempo é obtido somando os tempos de cada código aceite (tempo desde o início do concurso) acrescido de 20 minutos por cada submissão errada nos problemas que chegaram a ser aceites.
Respostas do Mooshak
A tabela seguinte mostra respostas automáticas dadas pelo Mooshak para uma determinada submissão. Nota que se clicares no resultado podes ver uma tabela mais completa com os resultados obtidos em cada um dos testes. Alguns dos testes podem ser públicos, significando que o Mooshak te diz qual foi o teste, no caso de teres errado.
Resposta | Significado |
---|---|
Accepted | O programa conseguiu acertar em todos os testes que foram feitos |
Compile Time Error | O sistema não conseguiu compilar o programa, tendo acontecido um erro ou um aviso. |
Runtime Error | O programa acabou prematuramente, gerando uma excepção. |
Time Limit Exceeded | O programa não terminou dentro do limite de tempodado. |
Wrong Answer | O output do programa não é igual ao esperado. |
Presentation Error | O programa dá um output correcto, mas não correctamente formatado (por exemplo, com espaços a mais, ou sem a mudança de linha). Esta mensagem só é enviado em casos óbvios. |
Invalid Submission | O ficheiro enviado não tem uma extensão válida ou então foi feita uma submissão fora do interface. |
Output Limit Exceeded | O output gerado passou do limite de espaço necessário |
Program Size Exceeded | O código do programa é demasiado longo (normalmente será aceite um ficheiro até 100Kb) |
Requires Reevaluation | Por alguma razão não descrita atrás, o seu programa tem de ser re-avaliado |
Invalid Function | Foi usada uma função não permitida ou retornado pela função principal um código diferente de zero (nalguns casos, em Pascal, um Runtime Error é reportado como Invalid Function devido ao funcionamento do próprio compilador). |