TIUP'2007 / 5ª Etapa
Aspectos práticos da resolução dos problemas do concurso
Este documento contém informação prática relevante para a resolução dos problemas apresentados na TIUP'2007 / 5ª Etapa.
Restrições durante a compilação dos programas
Estas são estas as restrições impostas pelo sistema de avaliação, durante a compilação de programas:
- Tempo máximo de compilação: 60 segundos.
- Tamanho máximo dum programa: 100 Kbytes.
- Cada programa tem de ficar integralmente incluido num único ficheiro.
- No caso da linguagem Java, o ficheiro ".java" tem de ter o mesmo nome que a classe que contém o método "main". Não há limite para o número de classes e de interfaces contidas no ficheiro.
Opções de compilação
É indispensável conhecer as opções de compilação que o sistema de avaliação automático usa. Por exemplo, sabia que a compilação é efectuada com todos os warnings ligados, em C, C++?
Para evitar dissabores, ao testar cada solução, é importante usar as mesmas opções de compilação do avaliador automático!
Eis as opções de compilação que o sistema de avaliação usa, para as diversas linguagens:
- gcc -ansi -pedantic -Wall -Wno-unused -lm
- g++ -ansi -pedantic -Wall -Wno-unused -lm
- javac
- fpc -v0w
Nota1: Em C++, os comentários podem ter a forma "/*...*/" ou a forma "//...". Mas em C, só a primeira forma é legítima. As opções "-ansi -pedantic" obrigam o gcc a respeitar com rigor a norma oficial, tanto neste aspecto como noutros.
Nota2: A opção "-Wno-unused" serve para eliminar os warning relativos a entidades definidas mas não usadas.
Versões dos compiladores
O sistema de avaliação corre em Linux e usa versões relativamente recentes dos compiladores.
- gcc/g++ 4.1.2
- java 6 update 2 (jdk1.6.0_02)
- fpc 1.0.10
Nota: Também está disponível o compilador gcc/g++ 3.4.6. Para pedir ao Mooshak para usar este compilador, escreva o comentário "/* GCC3 */" (em maiúsculas) na primeira linha do ficheiro fonte, em todas as submissões de C/C++.
Restrições durante a a execução dos programas
São estas as restrições impostas pelo ambiente de execução dos programas:
- Tempo máximo de CPU: 4 segundos
- Memória disponível para variáveis globais e dinâmicas: 64 megabytes
- Memória disponível para pilha de execução e variáveis locais: 1 megabyte
Os recursos disponíveis são largamente suficientes para resolver qualquer problema do concurso, independentemente da linguagem usada.
Opções de execução
No caso das linguagens C, C++ e Pascal, o Mooshak garante directamente as restrições indicadas na secção anterior.
No caso do Java, o Mooshak usa as seguintes opções de execução:
onde "-Xss1m" garante um stack de execução com 1MB (o valor por defeito é de apenas 400KB), e "-Xmx71m" garante um máximo de 64MB eficazes para a criação de objectos.
Servidor do concurso
Servidor que compila e executa as submissões dos concorrentes:
- Code 2 Duo 2Ghz com 2GB de RAM.
Também existe um segundo servidor, dedicado ao júri.
Dados de entrada
Os dados de entrada, usados para testar as soluções dos concorrentes, são lidos da entrada padrão. Consistem em texto cuidadosamente formatado para ser simples de processar:
- Normalmente, nas primeiras linhas dos dados de entrada surgem alguns números inteiros que anunciam o tamanho das diversas partes do texto que se segue. Isso evita a necessidade de testar a condição de "fim-de-ficheiro", durante a leitura dos dados.
- A última linha do ficheiro está sempre devidamente terminada por uma mudança de linha.
- Espaços em branco, quando usados, são sempre considerados como separadores. Os espaços em branco nunca ocorrem em grupos. Uma linha nunca começa com um espaço em branco. Uma linha nunca acaba com um espaço em branco.
Note que as linhas com números inteiros que ocorrem no início dos dados de entrada devem ser consumidas bem até ao fim para evitar desalinhamentos na leitura dos dados subsequentes. Eis como isso se faz nas várias linguagens:
- Supondo que os dados se iniciam por uma linha contendo um inteiro isolado:
C
int n ;
scanf("%d", &n) ;
getchar() ; /* Salta a mudança de linha. */
C++
int n ;
std::cin >> n ;
getchar() ; /* Salta a mudança de linha. */
Java
import java.util.* ;
Scanner sc = new Scanner(System.in) ; /* Aviso: nunca crie mais do que um Scanner sobre o input. */
int n = sc.nextInt() ;
sc.nextLine() ; /* Salta a mudança de linha. */
Supondo que os dados se inicia por uma linha contendo dois inteiros separados por um espaço em branco:
C
int n, m ;
scanf("%d %d", &n, &m) ;
getchar() ; /* Salta a mudança de linha. */
C++
int n, m ;
std::cin >> n >> m ;
getchar() ; /* Salta a mudança de linha. */
Java
import java.util.* ;
Scanner sc = new Scanner(System.in) ; /* Aviso: nunca crie mais do que um Scanner sobre o input. */
int n = sc.nextInt() ;
int m = sc.nextInt() ;
sc.nextLine() ; /* Salta a mudança de linha. */
Dados de saída
Os dados de saída, produzidos pelos programas dos concorrentes, são escritos na saída padrão. É necessário respeitar rigorosamente o formato exigido no enunciado. Qualquer desacerto, mesmo ligeiro, é suficiente para que um programa seja classificado como "Presentation error".
Note que não é possível detectar visualmente certas anomalias nos dados de saída. Por exemplo: um espaço em branco no final duma linha, uma linha em branco no final dos dados, a omissão da mudança de linha na última linha dos dados. Todas estas situações são inaceitáveis e provocam um "Presentation error".