Úlohy:
Pre každú súťažnú úlohu je potrebné naprogramovať samostatný program. Úlohy budú odovzdávané, testované a vyhodnocované úplne osobitne. Odovzdáva sa zdrojový kód, kompilovanie a spúšťanie programu sa vykonáva na našom servri. Odovzdaniu riešenia sa hovorí submit.
Kompilátory:
Na testovači používame Linux a sú na ňom nasledovné verzie kompilátorov:
- C++: g++ 8.3.1, switches: -O2 -std=gnu++17
- C: gcc 8.3.1, switches: -O2 -lm -std=gnu99
- Pascal: fpc 3.2.0, switches: -Sg -O1
- Python: python 3.8.0
- Java: openjdk 11.0.8
- JavaScript: nodejs v10.16.3
- C#: mono 6.12.0.90
- Rust: rustc 1.41.1
Vstup a výstup
Programy musia čítať vstup zo štandardného vstupu (klávesnice) a písať výstup na štandardný výstup (obrazovku). Programy nesmú otvárať žiadne súbory. V prípade používania Delphi alebo iných pokročilejších vývojových prostredí treba programovať konzolovú aplikáciu (alebo niečo ekvivalentné) a pred odovzdaním riešenia odstrániť prípadné neštandardné knižnice, používané týmto vývojovým prostredím. To sa týka aj knižníc v iných jazykoch, napríklad conio.h v jazyku C. Rovnako treba odstrániť napríklad prípadnú kompilátorovú direktívu {$R *.res} v Delphi a podobne. Ak máte nejasnosti, spýtajte sa organizátorov. Je žiadúce si skúsiť pred súťažou cvične vyriešiť niektorú z prístupných úloh.
Odovzdávanie riešení
Riešenie môžete odovzdať použitím formulára na konci jeho zadania (ku ktorému sa doklikáte v záložke Úlohy). Ak má súbor koncovku pas,c,cc,cpp,java,py,js,cs,rs, potom testovač sám určil programovací jazyk. Ak programujete v Delphi, Lazaruse alebo inom Pascalovskom editore, treba odovzdať .pas alebo .dpr súbor.
Po odovzdaní sa súbor na testovači skúsi skompilovať príslušným kompilátorom. V prípade, že sa váš program podarí úspešne skompilovať, testovač ho spustí na vzorových vstupoch, ktoré nájdete v zadaní a niekoľkých ďaľších vstupoch. Výsledok tohto testu sa vám v testovači po krátkej dobe sprístupní. Z tohto výsledku môžete zistiť, či správne načítavate vstup a či správne vypisujete výstup. Testuje sa na rovnosť vášho výstupu so vzorovým znak po znaku (pokiaľ zadanie vyslovene netvrdí opak)! To znamená, že musíte dodržať presne formát výstupu, nesmiete mať vo výstupe medzery ani žiadne iné znaky navyše a váš výstup musí končiť práve jedným znakom newline (viď vzorový výstup).
To, že váš program nevyrieši úspešne niektorý/é z príkladov, neznamená, že nemôže dostať žiadne body. Odovzdať úlohu môžete ľubovoľne veľa krát. Hodnotený bude najlepší odovzdaný program pred koncom súťaže. V prípade rovnosti bodov rozhoduje o poradí to, kto skôr nadobudol posledné body.
Niektoré vstupy sú usporiadané do sád. Ak sa vstupy volajú napríklad 01.a.in, 01.b.in, ... 01.k.in, potom tvoria jednu sadu a body za ňu dostanete, len keď je celá sada správne vyriešená.
Možné odpovede testovača
- OK - odpoveď, ktorú chcete vidieť a ktorú netreba komentovať :)
- Time Limit Exceeded (TLE) - váš program neskončil v požadovanom časovom limite
- Runtime Exception (EXC, RE) - váš program počas behu spadol, alebo si vypýtal príliš veľa pamäte
- Security Exception (SE) - robíte niečo nepovolené (systémové volania, otváranie súborov), alebo rovnaký význam ako Runtime Exception
- Wrong Answer (WA) - výstup vášho programu sa nezhoduje znak po znak so správnym výstupom (v prípade úlohy, kde je možných viacero odpovedí výstup vášho programu nespĺňa podmienky zadania)
- Ignored (IGN) - váš program nemal výsledok OK na niektorom vstupe zo sady. Keďže za túto sadu už body nedostanete, pre ušetrenie času sa ďalšie vstupy z tej istej sady testovať nebudú.
Limity
- Časový limit je zvyčajne (ale nie vždy) približne päťnásobok času, ktorý potrebuje vzorové riešenie na najväčšom vstupe. Presnú informáciu pre jednotlivé úlohy nájdete v zadaní alebo sa dozviete od organizátorov.
- Pamäťový limit: 1 GB.
- Limit na veľkosť programu: 100 kB
Ako správne písať programy v Jave
Testovanie Javy je trochu komplikovanejšie, keďže pri kompilácii súbory premenúvame.
Aby všetko fungovalo ako má,
zdroják musí obsahovať práve jednu vonkajšiu classu
a táto classa nesmie byť public.
(Teda, môže byť public, ale musí sa volať presne rovnako ako úloha: ak má úloha
krátke meno zenit25ska, my si tvoj program pomenujeme zenit25ska.java.)
Spustená bude metóda main dotyčnej vonkajšej classy. (Vovnútri vonkajšej classy môžete deklarovať iné classy, ak chcete/potrebujete.)
Ďalej, zdrojový kód v Jave nesmie byť deklarovaný ako súčasť nejakého package.
Pozor, Java je pomerne pomalý a ťažkopádny jazyk. Môže sa stať, že nešikovne napísaný program s dobrou myšlienkou (a vo veľmi ojedinelých prípadoch aj šikovne napísaný) nestihne vyriešiť najväčšie vstupy v časovom limite. Ako príklad slúži načítavanie a vypisovanie. Pokiaľ potrebujete veľa načítavať, resp. vypisovať, je odporúčané použiť BufferedReader, resp. BufferedWriter.
Upozornenia pre Pascalistov
Existuje viacero dialektov Pascalu, náš testovač používa FreePascal. V prípade, že váš program na vašom počítači funguje a na testovači dostávate výsledok Wrong Answer, zamyslite sa napríklad nad rozsahom premenných, ktoré používate. FreePascal môže mať troška inak definované typy ako tie, ktoré používate v Delphi, Turbo Pascale alebo Borland Pascale. Typ longint by mal byť ten správny. V niektorých úlohách môže byť vyžadované použiť 64-bitový celočíselný dátový typ.
Príklady správnych programov:
C++
#include <iostream> using namespace std; int main() { int a,b; cin >> a; cin >> b; cout << (a+b) << endl; return 0; }
C
#include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf("%d\n",a+b); return 0; }
Pascal
var a,b : longint; begin readln(a); readln(b); writeln(a+b); end.
Java
import java.io.*; class MySolution { public static void main(String [] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int a = Integer.parseInt( in.readLine() ); int b = Integer.parseInt( in.readLine() ); System.out.println("" + (a+b)); } }
JavaScript
var fs = require('fs'); var whole_input = fs.readFileSync('/dev/stdin').toString(); var input_lines = whole_input.split('\n'); var a = parseInt(input_lines[0]); var b = parseInt(input_lines[1]); console.log( a + b );
Python
Súčet dvoch čísel, každé v novom riadku:a = int(input()) b = int(input()) print(a + b)Súčet ľubovoľne čísel, všetky v tom istom riadku:
cisla = [ int(x) for x in input().split() ] print( sum(cisla) )
Rust
use std::io::stdin; fn main() { let a = stdin_int32(); let b = stdin_int32(); println!("{}", a + b); } fn stdin_int32 () -> i32 { let mut input_temp = String::new(); stdin().read_line(&mut input_temp).expect("Failed to read line"); return input_temp.trim().parse::().expect("Failed to convert string to integer."); }