Általános tudnivalók
Feladatleírás
Bemenet
- A bemenet formailag és tartalmilag is helyes.
- A számok mindig egész számok.
- Az adatokat általában sorszám azonosítja, 1-től
kezdődően folyamatosan sorszámozzuk őket a bemenetbeli sorrendben, kivéve, ha feladatleírás más előírást tartalmaz.
- Soron belül minden adatelemet egyetlen szóköz választ el.
Kimenet
- Minden sort sorvég karakter zár le (az utolsót is)!
- Sor végén (a sorvég karakter előtt) lehet egy (felesleges) szóköz, ha a kimeneti adat szám.
- A kimenet csak akkor értékelhető, ha megfelel a feladatleírásban szereplő formai feltételeknek
Értékelés
Fordító (interpreter) program verziók:
- C/C++: gcc 5.4.0, fordító parancs: std=c++11 -O2 -g -static -o feladat feladat.cpp -lm
- FreePascal: 3.0.0, fordító parancs: fpc -Mobjfpc -Ci -g -O2 -Sg feladat.pas
- Java: jdk 1.8, fordító parancs: javac -cp $CP -Xstdout compile.txt feladat.java, futtatás: java feladat
- C#: mono 4.6.2, fordító parancs: mcs feladat.cs; mono --aot=full feladat.exe, futtatás: mono feladat.exe
- Python: 3.5, fordító parancs: cython3 -3 --embed -o feladat.c feladat.py,
gcc -O2 -I/usr/include/python3.5m -o feladat feladat.c -lpython3.5m -lpthread -lm -lutil -ldl
- Visual Basic, Végrehatható .NET programot kell beadni, futtatása mono –val történik, ld. C#.
Programozási nyelvi sajátosságok
Java
A megoldást tartalmazó osztály neve kötelezően „feladat”.
A feladat osztályt tartalmazó fájlban több osztály is lehet.
Nem lehet package-et alkalmazni!
Ékezetes karakter (megjegyzésben is) csak UTF-8 kódolással használható.
mesterIO műveletei
A beolvasás és kiíratás gyorsabb megvalósítását teszik lehetővé az alábbi műveletek
nextInt()
A művelet a standard inputról olvas. Az aktuális pozíciótól olvasva átlépi a szóköz, sorvége, tabulátor és kocsivissza karaktareket.
Ettől a pozíciótól a számjegy karaktereket olvassa be és a szám értékét adja vissza int értékként.
Ha az első ilyen karakter nem számjegy, akkor a 0 értéket adja (nem keletkezik megszakítás).
nextLong()
A művelet a standard inputról olvas. Az aktuális pozíciótól olvasva átlépi a szóköz, sorvége, tabulátor és kocsivissza karaktareket.
Ettől a pozíciótól a számjegy karaktereket olvassa be és a szám értékét adja vissza long értékként.
Ha az első ilyen karakter nem számjegy, akkor a 0 értéket adja (nem keletkezik megszakítás).
next()
A művelet a standard inputról olvas. Az aktuális pozíciótól olvasva átlépi a szóköz, sorvége, tabulátor és kocsivissza karaktareket.
Ettől a pozíciótól az első szóköz vagy sorvége vagy tabulátor vagy kocsivissza karakterig terjedő
szövegrész olvassa be és adja vissza String értékként.
getLine()
A művelet a standard inputról olvas. Az aktuális pozíciótól az első sorvége karakterig teljedő szövegrészt olvassa be és adja vissza String értékként.
getChar()
A művelet a standard inputról olvassa a következő karaktert.
write(int x)
Az x egész kifejezés értékét írja ki a standard outputra.
write(long x)
Az x long típusú egész kifejezés értékét írja ki a standard outputra.
writeLn(int x)
Az x egész kifejezés értékét írja ki a standard outputra, majd ír egy sorvéget.
writeLn(long x)
Az x long típusú egész kifejezés értékét írja ki a standard outputra, majd ír egy sorvéget.
write(String s)
Az s string (kifejezés) értékét írja ki a standard outputra.
writeLn(String s)
Az s string (kifejezés) értékét írja ki a standard outputra, majd ír egy sorvéget.
close()
Végrehajt egy flush() műveletet a standard outputra, majd lezárja.
A program végén (a kiíró utasítások után) végre kell hajtani egy close() utasítást!
Példa mesterIO használatára
Az alábbi példaprogram számsorozatot olvas be standard inputról és az sorozat összegét kiírja a standard outputra.
import mester.IO;
public class feladat {
public feladat() {}
public static void main(String[] args) throws Exception {
IO beki = new IO();
int N=0;
N=beki.nextInt();
int osszeg=0, x;
for(int i=0;i< N ;i++){
x=beki.nextInt();
osszeg+=x;
}
beki.writeLn(osszeg);
beki.close();
}
}
Otthoni (verseny alatti) használat
Tőltsük le a mester.jar állományt innen:letöltöm
1. módszer: A mester.jar állományt teljes úttal tegyük be a CLASSPATH környezeti változóba.
2. módszer: a javac fordításkor, illetve a java futtatáskor cp paraméterként adjuk meg "mester.jar" állományt (teljes úttal).
C#
C# programok fordítása és futtatása Mono rendszerben történik.
.NET 4.5 kompatibilis teljesül, kivéve windows komponensek.
Python tanácsok
Input/output
Beolvasáshoz és kiíráshoz használd a sys modulból az stdin.readline() és stdout.write() függvényeket.
Ezek némileg gyorsabbak, mint az input() és a print().
Az stdin.readline() egy sort ad vissza string-ként, a sorvége karakterrel együtt.
Amennyiben a sor szóközzel elválasztott számokat tartalmaz, ezeket a leggyorsabban a map(int, stdin.readline().split()) paranccsal
kaphatod meg. Ez egy map object-et ad vissza, ami iterable, tehát például egy for ciklussal végig lehet menni rajta (egyszer),
vagy listává lehet alakítani a list(...) függvénnyel.
Ha egy sor csak két számot tartalmaz, akkor a fentinél gyorsabb a következő két parancs használata:
ab = stdin.readline().split() majd a,b = int(ab[0]), int(ab[1])
Az stdout.write()-nak egy paramétere van, aminek string-nek kell lennie, és ezt sorvége karakter nélkül írja a kimenetre.
Tehát ha például két külön sorba szeretnéd írni az a és b számokat, akkor ezt az stdout.write(str(a) + ‘\n’ + str(b) + ‘\n’)
paranccsal tudod megtenni.
Main függvény
Definiálj egy main() függvényt, amibe a program törzsét írod, majd ezt egyedüli parancsként hívd meg.
Ez a trükk tapasztalataink szerint nagyjából 20%-ot gyorsít a programon.
Példa program
Álljon itt egy példa program, ami beolvas n számot, majd kiírja ezek összegét és szorzatát.
from sys import stdin, stdout
def main():
n = int(stdin.readline())
szamok = list(map(int, stdin.readline().split()))
osszeg = sum(szamok)
szorzat = 1
for x in szamok:
szorzat *= x
stdout.write(str(osszeg) + '\n' + str(szorzat) + '\n')
main()