# Formatul XMC

Formatul XMC reprezinta totalitatea formatelor lui XMC pentru stocarea datelor in sistemul de fisiere.

## Grader (*corector*)

Un grader, in formatul XMC, este un fisier cod sursa cu filename-ul de forma `numecorector.ext`, unde `numecorector` este numele unic al programului corector, iar `ext` este extensia specifica limbajului de programare in care este scris.

### Exemplu

Urmatorul fisier este un grader numit `simplegrader` scris in C:

{% code title="simplegrader.c" %}

```c
#include <stdio.h>

int main() {
    printf("This grader is pretty dumb\n");

    return 0;
}
```

{% endcode %}

## Datasets (*seturi de date*)

Un set de date reprezinta un folder al carui nume este numele unic al setului de date. Acesta contine un fisier `dataset.yaml` care stocheaza informatii specifice setului de date, impreuna cu un folder numit `testcases` care contine fisierele de test ale setului de date.

Folderul `testcases` tine pentru fiecare test cate doua fisiere: un fisier de intrare, `test1.in` de exemplu, si un fisier de iesire, `test1.out`. Formatul numelui fisierelor este `test#.in`/`test#.ok`, unde `#` este numarul testului. Testele se numeroteaza de la 1 si trebuie sa fie consecutive.

Fisierul `dataset.yaml` are urmatoarea structura:

{% code title="dataset.yaml" %}

```yaml
description: Descriere a setului de date
grader_name: example_grader
memory_limit: 1024
time_limit: 1.23s
```

{% endcode %}

Fisierul `dataset.yaml` trebuie sa fie un fisier valid YAML. Limita de memorie este o valoare intreaga in bytes, iar limita de timp respecta formatul functiei [`time.ParseDuration`](https://golang.org/pkg/time/#ParseDuration) din libraria standard Go. Pe scurt, este o secventa de numere rationale, cu partea fractionara optionala, si un sufix care reprezinta unitatea de timp. Suxifele valide sunt "ns", "us", "ms", "s", "m" si  "h".

### Exemplu

Urmatorul set de date se numeste `permuations_easy`.

```
permutations_easy
├── dataset.yaml
└── testcases
    ├── test10.in
    ├── test10.ok
    ├── test1.in
    ├── test1.ok
    ├── test2.in
    ├── test2.ok
    ├── test3.in
    ├── test3.ok
    ├── test4.in
    ├── test4.ok
    ├── test5.in
    ├── test5.ok
    ├── test6.in
    ├── test6.ok
    ├── test7.in
    ├── test7.ok
    ├── test8.in
    ├── test8.ok
    ├── test9.in
    └── test9.ok

1 directory, 21 files
```

`dataset.yaml`:

```yaml
description: Teste de dificultate redusa pentru problema permutarilor.
grader_name: basic_grader
memory_limit: 8192
time_limit: 0.45s
```

## Tasks (*sarcini, probleme*)

Un task este un director al carui nume este numele unic al task-ului. Acesta contine numai un singur fisier `task.yaml` care stocheaza informatii ce definesc task-ul.

Fisierul `task.yaml` are urmatoarea structura:

```yaml
description: Descrierea task-ului
dataset_name: example_dataset
input_file: problema.in
output_file: problema.out
```

Fisierul trebuie sa fie un fisier valid YAML. Fisierele de intrare si de iesire pot avea valorile `stdin`, respectiv `stdout`.

### Exemplu

Urmatorul task se numeste `addition`:

```
addition
└── task.yaml

0 directories, 1 file
```

`task.yaml`:

```yaml
description: Adunare simpla
dataset_name: addition.1
input_file: addition.in
output_file: addition.out
```
