UNIVERSIDADE DE COIMBRA FACULDADE DE CIÊNCIAS E TECNOLOGIA Departamento de Engenharia Informática Concurso de Programação Inter-Escolas 2004-2005 Novembro 2004 1. Informação geral 1.1 Objectivo do Concurso Este concurso de programação inter-escolas tem como principal objectivo promover o gosto pela programação e resolução de problemas junto dos alunos das Escolas Secundárias, é uma forma de fomentar as actividades extra-curriculares e deverá ser visto como uma medida para tentar aproximar a Universidade das Escolas e vice-versa. 1.2. Breve história do concurso Este Concurso vai-se realizar pela terceira vez em 2004-2005, após o sucesso muito interessante do Torneio no dia aberto (2002-2003) e do Concurso de Programação realizado no Dia Aberto do Dep. Engenharia Informática em Março de 2004, onde estiveram presentes equipas de alunos de várias escolas secundárias do país. 1.3. Em que consiste este concurso de programação? O concurso vai-se realizar em duas fases: (a) Fase de Eliminatórias: a decorrer nos meses de Janeiro e Fevereiro, e que servirá para apurar 15 equipas para a final do Concurso. (b) Fase Final do Concurso: a realizar in-loco no dia 1 de Março de 2005 no Dep. Eng. Informática da Universidade de Coimbra. Nesta fase final, as 15 equipas irão competir directamente entre si o objectivo será resolver o máximo de problemas num tempo limite de 3 horas. 1.4. O que é preciso para concorrer? Em primeiro lugar é preciso ter muita vontade de vencer desafios, de aprender, e de participar num concurso inter-escolas. Para resolverem os problemas, os alunos devem ter bons conhecimentos sobre algoritmos, rapidez de programação e bom espírito de equipa. Podem ser usadas as seguintes linguagens de programação: C, C++, Java e Pascal. 1.5. Quantas/Que equipas podem participar? No ínicio pode-se inscrever um número ilimitado de equipas. Cada equipa deve ser composta por 3 estudantes e deve ter um Treinador. O Treinador deverá ser um Professor da respectiva escola. Um estudante é considerado “elegível” para participante se estiver inscrito no 10º, 11º ou 12º ano de escolaridade de uma instituição do ensino secundário no ano lectivo de 2004/2005. Cada Escola pode inscrever uma ou mais equipas e cada Professor pode ser o Treinador de mais do que uma equipa. Salvo algum imprevisto, inscrições deverão estar abertas até ao final de Dezembro de 2004. 1.6. A Fase Inicial de Eliminatórias A fase de eliminatórias decorrerá nos meses de Janeiro e Fevereiro, de modo a seleccionar as 15 equipas que irão participar na grande final do Concurso no dia 1 de Março de 2005. Neste período serão lançados 7 problemas no site Web do Concurso: http://mooshak.dei.uc.pt. Os problemas serão lançados no dia 19 de Janeiro e existe basicamente um deadline de um mês para a sua resolução (até 19 de Fevereiro). A submissão dos problemas também será feita remotamente no servidor mooshak.dei.uc.pt. As instruções para submissão de problemas estão disponíveis online no site do Concurso. Na fase de eliminatórias a ordenação das equipas segue os seguintes critérios: i. O número de problemas resolvidos. O primeiro critério de seriação é o número de problemas resolvidos (independentemente de qual ou quais problemas resolvidos, desde que estejam na lista de problemas propostos). ii. O tempo total necessário (desde o início do concurso) para resolver os problemas. Este critério é o primeiro critério de desempate para equipas com o mesmo número de problemas resolvidos. iii. Cada submissão não aceite pelo sistema (por estar errada), implicará uma penalização automátia de 20 minutos. Durante as eliminatórias, as equipas podem submeter soluções para os problemas quantas vezes pretenderem. A seriação obtida serve apenas como apuramento para a final. A página Web irá manter um ranking com a classificação absoluta das equipas participantes. O Juri será composto por elementos do Clube de Programação do DEI, que constituem a Comissão de Avaliação respeitante a este concurso, e irá escolher as 15 equipas apuradas. Em caso de empate, o júri do concurso reserva-se ao direito de escolher as equipas participantes. Na grande final, o número de problemas resolvidos bem como o tempo acumulado serão recolocados a zero, e portanto todas as equipas entram em igualdade de circunstâncias. 1.7. Prémios para os melhores classificados As equipas que se classificarem nos 3 primeiros lugares, terão direito a prémios, que serão definidos mais perto do dia 1 de Março. A equipa que ficar classificada em primeiro lugar terá direito a um prémio para a escola. As 15 equipas que participarem na final terão todas direito a um Diploma de Participação. 2. Regulamento do Concurso- Fase Final 2.1. Ambiente de trabalho Cada equipa terá acesso a um computador, equipado de maneira semelhante a todas as outras equipas; Cada equipa terá acesso aos compiladores de C, C++, Java e Pascal; Os programas deverão estar escritos num só ficheiro e deverão obedecer às normas standard (ANSI-C, ISO-Pascal, Java standard...). Será permitido o uso de STL no C++ e das packages de classes habituais do Java; Todos os computadores estarão equipados com o Sistema Operativo Linux e Windows XP; As equipas poderão levar todo o tipo de material escrito, sendo expressamente proibido levar material em suporte informático, calculadoras de bolso, portáteis e telemóveis; 2.2. Concurso e problemas O concurso tem a duração de 3 horas para tentar resolver 4 a 5 problemas; Os problemas são, dentro do possível, abrangentes, de forma a evitar a dependência de uma determinada linguagem; Os enunciados dos problemas serão escritos em Inglês; Quando uma equipa achar que tem uma proposta de resolução de um problema, submete-a ao júri do concurso, que a avalia, indicando se está certa ou errada. A avaliação dos problemas será feita por um sistema de avaliação automático cujo resultado será posteriormente confirmado pela Comissão de Avaliação do concurso. 2.3. Classificação As equipas são classificadas de acordo com o número de problemas resolvidos; Em caso de empate, são classificadas pelo somatório do tempo gasto na resolução de cada problema (só contam os problemas resolvidos por cada uma). O tempo gasto na resolução de um problema é igual ao tempo passado desde o início do concurso até à sua submissão correcta mais 20 minutos de penalização por cada submissão errada para esse problema. As submissões erradas para problemas não resolvidos não contam para esse somatório. 3. Ambiente do concurso 3.1. Conceitos básicos O concurso será suportado por um ambiente de rede. A rede apenas pode ser usada para a submissão de problemas, visualização de listagens disponibilizadas pelo ambiente do concurso e visualização da documentação disponibilizada. Qualquer outro tipo de acesso ao ambiente do concurso (login remoto, ssh, ftp, telnet, mail ou outras actividades de rede) é expressamente proibido. Qualquer participante que descubra uma falha de segurança no sistema deve comunicá-la de imediato a um membro da organização do concurso. Cada equipa terá acesso a quatro compiladores: Pascal (Free Pascal 1.0.10), C (gcc), C++ (g++) e Java (javac do Sun JDK 1.4.2). Cada submissão poderá estar em qualquer uma destas linguagens, independentemente das linguagens usadas em submissões anteriores. Cada equipa terá acesso a um só computador. Todas as equipas terão equipamento semelhante e o mesmo sistema operativo. Cada submissão é aceite ou rejeitada, sendo a equipa notificada, quase instantaneamente, do resultado. Os diferentes resultados possíveis e o seu significado são: o Accepted: o programa passou em todos os testes e é aceite como correcto. o Presentation error: o output parece estar correcto mas não está a ser apresentado no formato adequado. Como não é sempre linear a distinção entre este resultado e o resultado “wrong Answer”, ele é apenas enviado nos casos mais óbvios. Ou seja, em casos menos óbvios, o problema poderá também ser de “presentation error”, embora o resultado tenha sido “wrong answer”. o Wrong answer: o programa correu em um ou mais casos de teste sem “runtime error”, mas o output gerado não é igual ao esperado. o Time limit exceeded: o programa não terminou no espaço de tempo alocado para o efeito. Duas razões típicas para este erro são a existência de “ciclos infinitos” no programa ou um algoritmo demasiado ineficiente para o problema. o Runtime error: o programa “crashou”, isto é, terminou prematuramente devido a um erro de tempo de execução. Ex.: Segmentation fault em C ou uma Exception em Java. o Compile time error: o sistema não conseguiu compilar correctamente o programa. Dependendo das flags usadas na compilação (descritas mais à frente), isto pode significar erros ou simples warnings. o Invalid submission: a submissão foi feita usando uma extensão inválida (as extensões correctas são descritas mais à frente) ou por um outro processo que não aquele disponibilizado pela interface. o Output too long: o programa gera um output demasiado longo para o problema em causa. Os limites dependem quer do problema em si, quer dos casos de teste utilizados, mas são geralmente baixos (à volta de 100 Kb por omissão). o Program size exceeded: o código do programa é demasiado extenso e não é considerado (limite à volta de 100 Kb). o Requires re-evaluation: por alguma razão, a submissão necessita de ser re-avaliada. o Invalid function: o programa tenta usar funcionalidades da linguagem que, por várias questões, não estão disponíveis. Nota: Poderá ainda, ocasionalmente, surgir o resultado “Evaluating”. Este resultado é temporário e significa que a submissão está ainda a ser avaliada. 3.2. Sistema de avaliação Mooshak Neste concurso será utilizado o sistema de avaliação Mooshak, software desenvolvido pelo Departamento de Ciências da Computação da Universidade do Porto. Este software é “web-based” e comporta-se como um completo gestor de concurso, assim como juíz automático. Comporta quatro formas de acesso (interfaces de utilizador): Participante Permite aos concorrentes: Visualizar os enunciados dos problemas; Fazer upload do código fonte de um programa como potencial solução para um problema; Fazer perguntas aos juízes; Aceder à lista completa de perguntas e correspondentes respostas dos juízes; Aceder à lista de submissões que foram feitas desde o início do concurso por todas as equipas; Aceder ao código fonte das submissões feitas pela equipa; Aceder à classificação geral do concurso. Administrador Permite aos administradores gerir todos os aspectos relacionados com o sistema, como sejam a configuração de novos concursos (equipas, passwords, problemas, casos de teste, limites de tempo, linguagens, comandos de compilação, duração, etc.), a gestão de utilizadores ou a gestão dos vários servidores quando existirem. Juíz Permite aos juízes: Apoiar o processo de juízo dos problemas, validando os resultados do juíz automático, fazendo assim a avaliação final; Responder às perguntas feitas pelas equipas. Público em geral Permite que o público em geral (audiência) siga a evolução do concurso. 3.3. Utilizar o Mooshak Acesso ao sistema A todas as equipas é fornecido um login e uma password de acesso ao sistema Mooshak enquanto “Participante”. Este login e esta password deverão ser usados na autenticação na página inicial do concurso. Submissões e avaliação Para fazer a submissão de uma tentativa de solução para um problema, deve proceder-se da seguinte forma: o No topo da interface de utilização, escolher o problema que a equipa está a tentar resolver; o Carregar no botão “Browse...” por debaixo da lista de problemas e escolher a localização do programa que se pretende apresentar como solução; o Carregar em “Submit” no canto superior direito do ecrã. Depois de efectuada a submissão, o resultado da avaliação aparece quase instantaneamente. Inicialmente, esse resultado estará marcado com o estado “Pending”, para indicar que é necessário esperar pela validação do juíz responsável. Quando isso acontecer, o estado do resultado passará a “Final”. Nota: É considerada conduta irregular, e pode ser considerado motivo de desqualificação, o envio de várias submissões num curto espaço de tempo, principalmente perto do final do concurso. Comandos de compilação e extensões de ficheiro Estes são os comandos, com as respectivas opções de compilação, e as extensões a usar para cada uma das linguagens disponíveis no concurso: o C (gcc) comando: gcc –Wall –Werror –pedantic –ansi –lm file.c extensão: .c o C++ (gcc/g++) comando: g++ –Wall –Werror –pedantic –ansi –lm file.cpp extensão: .cpp o Java (jdk 1.4.2) comando: javac file.java extensão: .java o Pascal (fpc 1.0.10) comando: fpc –v0w –oprog file.pas extensão: .pas Notas importantes: o Em geral, o nome do ficheiro usado é irrelevante para o sistema, ao contrário das extensões, que são essenciais, uma vez que é a partir delas que o sistema identifica a linguagem usada. No entanto, no caso do Java, o nome do ficheiro, de acordo com o standard, deve coincidir com o nome da classe principal do programa. Se isto não se verificar, mesmo sendo o programa uma solução correcta para o problema, ele é rejeitado pelo juíz automático, podendo ser obtido o resultado “Runtime Error” ou “Compile Time Error”, dependendo do compilador usado (no caso do javac obtém-se “Runtime Error”, o que pode ser enganador). o As flags de compilação aqui publicadas devem ser também usadas pelas equipas nos testes que efectuarem localmente na sua máquina. Isto serve obviamente para que se evitem “Compile Time Errors”. Manuais Se usado Linux, o sistema inclui as usuais man-pages, nas quais se pode obter muita informação sobre as funções do C. A organização disponibiliza ainda no servidor da prova a seguinte documentação: o Java: documentação do JDK em HTML; o STL: documentação do STL (Standard Template Library) do C++; Imprimir os programas Para imprimir uma cópia dos programas (e não dos enunciados, já que estes são distribuídos em papel a todos os participantes), que torne possível o “offline debugging” (uma vez que só existe um computador), pode fazer-se upload do código para o Mooshak, tal como para uma submissão e carregar em “Print” no menu da direita. O juíz decide aprovar ou não o pedido de impressão, e um dos membros da equipa de apoio é encarregue de entregar a impressão à equipa. Enunciados dos problemas Apesar de todos os participantes terem uma cópia dos enunciados dos problemas em papel, eles podem ser vistos também no browser se depois de seleccionado o problema desejado se carregar em “View”. Colocar questões Se a equipa precisar de colocar uma questão ao juíz sobre um dos problemas pode fazê-lo seleccionando o problema e carregando em “Ask”. Depois de colocada a questão, todas as equipas têm acesso à mesma e à respectiva resposta, quando e se esta for dada pelo juíz. Se, porque algumas perguntas poderão não ser respondidas por se considerar que ao dar uma resposta se está a revelar informação relevante para a resolução do problema, ou se a questão já tiver sido respondida. A má utilização desta funcionalidade, por exemplo no sentido de encontrar a solução para um problema, pode ser considerada como conduta irregular pelos juízes.