Библиотека strict.h

strict.h — библиотека, решающая типовые задачи, возникающие при проверке корректности входных данных в олимпиадных задачах по программированию.

Во время подготовки комплекта тестов можно легко забыть учесть какое-либо ограничение, поставить лишний пробел или перевод строки там, где его не должно быть. Кроме того можно изменить ограничения в генераторах тестов и забыть изменить в условии — в результате у многих участников соревнования могут возникнуть проблемы. Валидаторы же не допустят наличия некорректных тестов. Написание валидаторов с нуля — непростая задача. Возникает множество тонкостей при считывании данных: многие стандартные средства не способны строго контролировать расстановку пробельных символов.

Библиотека strict.h призванна облегчить написание валидаторов. С ее помощью типичные валидаторы получаются предельно просты, но при этом строго проверяют соответствие формата входных данных.

Версии:
strict.h 0.1
strict.h 0.2
strict.h 0.3

Преимущества библиотеки

Компиляторы

Библиотека протестирована со следующими компиляторами:

Интерфейс библиотеки v0.1

class Input
{
public:
    Input();
    Input(const char* fileName);
    ~Input();
    bool isSpace() const;
    bool isWhitespace() const;
    bool isEoln() const;
    bool isEof() const;
    void readSpace();
    void readOneOrMoreSpaces();
    void readEoln();
    void readSpaceOrEoln();
    void readEof();
    int readChar();
    std::string readToken();
    // charPattern is a list of correct chars like "SWNE" or a range of chars like "0-9"
    // or a combination of them like "-_a-zA-Z"
    std::string readToken(int minLength, int maxLength, const char* charPattern);
    // read whole line and advance to the beginning of the next line
    std::string readLine();
    int readInt(int minValue, int maxValue);
    long long readLong(long long minValue, long long maxValue);
    unsigned long long readULong(unsigned long long minValue, unsigned long long maxValue);
    double readDouble(double minValue, double maxValue, int maxDigits);
    // read an array of ints separated by single spaces
    std::vector<int> readIntVector(int count, int minValue, int maxValue);
    void _assert(bool noerror, const char* expr);
    void error(const char* fmt, ...);
};
#define assert(expr) _assert((expr), #expr)

void error(const char* fmt, ...);
bool isConnected(int n, const std::vector< std::pair<int, int> >& edges);
void assertTree(const std::vector< std::pair<int, int> >& tree);
void assertConnected(int n, const std::vector< std::pair<int, int> >& edges);
void assertPrime(int p);

Примеры валидаторов

1393. Average Common Prefix:

#include "strict.h"
using namespace std;

const int MAXLEN = 250000;
const int MINLEN = 2;

int main()
{
    Input in;

    int n = in.readInt(MINLEN, MAXLEN);
    in.readEoln();
    string T = in.readToken(n, n, "A-Z");
    in.readEoln();
    in.readEof();

    return 0;
}

Примеры сообщений об ошибке:

Input:
1
A

Output:
Line 1, pos 2: integer 1 is out of bounds [2, 250000]
Input:
 2
AB

Output:
Line 1, pos 1: SPACE instead of number
Input:
2
Ab

Output:
Line 2, pos 2: character 'b' is not match pattern 'A-Z'

1847. Замкадье:

#include "strict.h"
using namespace std;

const int MAXN = 1000;
const int MAXCOORD = 10000;

int main()
{
    Input in;

    int n = in.readInt(2, MAXN);
    in.readEoln();

    for (int i = 0; i < n; ++i)
    {
        in.readInt(-MAXCOORD, MAXCOORD);
        in.readSpace();
        in.readInt(-MAXCOORD, MAXCOORD);
        in.readEoln();
    }

    in.readEoln();

    vector< pair<int, int> > edges;
    for (int i = 0; i < n - 1; ++i)
    {
        int a = in.readInt(1, n);
        in.readSpace();
        int b = in.readInt(1, n);
        in.readEoln();
        edges.push_back(make_pair(a, b));
    }
    in.readEof();
    assertTree(edges);

    return 0;
}

Пример сообщения об ошибке:

Input:
4
0 0
0 1
1 0
1 1

1 2
1 3
2 3

Output:
Graph is not a tree

© Владимир Яковлев, Егор Щелконогов 2011-2012