Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Ahoj, v další soutěži si tentokrát vyzkoušíte vytvořit parser matematických výrazů. Aplikace dostane výraz - např.

8 * (9 / 6) + 75

a vypíše výsledek - v ukázce 87
Čísla samozřejmě mohou být i desetinná, aplikace musí umět znaménka + - * /, samozřejmě i jejich priority a výraz může obsahovat kulaté závorky. Pokud bude ve výrazu chyba, aplikace by neměla spadnout, ale vypsat nějakou pěknou hlášku.

Šikovnější z vás mohou přidat matematické funkce jako např sin(), log() apod..

Z jazyků jsou povolené všechny, na které jsou na ITnetwork tutoriály. Je jedno, jestli to zpracujete jako konzolovou nebo okenní aplikaci, hodnotit se bude funkčnost a kód.

Řešení s použitím funkcí eval (nebo nějaké ekvivalentní) nebudu hodnotit.

Pro jakékoli dotazy je dost místa v komentářích.

Čas si dáme do pondělí 6.10.2014 do 15:00. Vyhodnocení by mělo být v pondělí odpoledne/večer.

Kompletní pravidla soutěží: http://www.itnetwork.cz/…outezi-machr

Pozn.: Prosím odevzdávejte to v zazipované složce, ať to nemusím rozbalovat nějakou webovou službou

Odpovědět 27.9.2014 20:04
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Nahoru Odpovědět  +1 27.9.2014 20:09
Nesnáším {}, proto se jim vyhýbám.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
Zdeněk Pavlátka:

Tak ten jsem před tím nikde nenašel. Teď jsem si ho vyhledal a byl před rokem a 2 měsícema. Si to budu příště víc kontrolovat.

Nahoru Odpovědět 27.9.2014 20:19
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Šimon Raichl
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Šimon Raichl:

Doufám, že se to neruší, já to začal v GM.

 
Nahoru Odpovědět 27.9.2014 20:21
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Zdeněk Pavlátka
Zdeněk Pavlátka:

Malá změna v zadání, ať se trochu odliším:

Ve výrazu mohou být použité proměnné - jejich hodnoty budou aplikaci zadány ve tvaru: x=12;y=3.7;a=6
Můžete se na ně např. nějak zeptat, v okenní aplikaci přidat nějaký textBox apod.

Pozn. V číslech může být jak desetinná tečka tak desetinná čárka.

Nahoru Odpovědět 27.9.2014 20:26
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 27.9.2014 20:27
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
sadlomaslox25:

neni tenhle problem reseny tak v milionu ruznych knihovnach ?

 
Nahoru Odpovědět 27.9.2014 20:32
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 27.9.2014 20:34
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
sadlomaslox25:

tak me by treba moc nemotivovalo delat vec ktera je milionkrat ruzne vyresena, kdyz je nepravdepodobne ze to moje bude rychlejsi nebo lepsi nez to co existuje.

 
Nahoru Odpovědět 27.9.2014 20:42
Avatar
Šimon Raichl
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Šimon Raichl:

Nevadí, že v mém programu si musíš deklarovat proměnnou, do které uložíš obsah, který chceš vypsat? Např.:

a = 2 * 9 + (5 * 6)

Vypíše 48 a pak

b = sin(a * 2)

a vypíše 0,98?

 
Nahoru Odpovědět 27.9.2014 20:43
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Šimon Raichl
Zdeněk Pavlátka:

Vadí, nesplňuje to zadání.

Nahoru Odpovědět 27.9.2014 20:46
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Honza Bittner
Redaktor
Avatar
Honza Bittner:

Machr vhodný pro Jan Barášek :P

Nahoru Odpovědět  +4 27.9.2014 20:49
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

Zítra pošlu řešení, trochu poupravím GLSL parser. Nevadí doufám, že to bude umět i vektory a matice?

 
Nahoru Odpovědět 27.9.2014 21:26
Avatar
Jan Barášek
Redaktor
Avatar
Odpovídá na Honza Bittner
Jan Barášek:

Díky za označení. Ono to v zásadě není nic těžkého a pokud budeme počítat jen s čísly (bez proměnných), tak to lze řešit dokonce i bez binárního stromu a celý příklad lze vyřešit už za jediný průchod řetězce s použitím rekurze.

Až budete programovat něco jako tohle, tak to bude teprve těžká věda: http://goo.gl/e7hRKd

Otázka pro všechny: Budou po skončení soutěže zveřejněny ukázkové kódy? Sice se v této problematice "vyznám", ale zajímá mě řešení ostatních.

Editováno 27.9.2014 21:31
Nahoru Odpovědět  +1 27.9.2014 21:29
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 27.9.2014 21:38
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

A když to nechám jako originál GLSL, bude to vadit? Proměnné to teda bude umět, ale budou fungovat i některé uživatelsky definované funkce. To bych tedy musel dopsat, protože nemám úplně dořešený return. Nebo to má být ryzí kalkulačka? Protože mám proměnné jako settery, do kterých se vloží data.

 
Nahoru Odpovědět 27.9.2014 23:12
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

Kdo umí gramatiky a vyzná se např. v javacc má to za chvíli hotové :) jestli si vzpomenu jak budu na pc, vyjmu si intepret z vlastního kompilátoru a dám to tu :)

Nahoru Odpovědět 27.9.2014 23:22
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na 1Pupik1989
Zdeněk Pavlátka:

To už zas ne. Proměnné se musí zadávat ve tvaru podle zadání. O vektorech a maticích v zadání nic není, takže ty tam mít můžeš.

Nahoru Odpovědět 28.9.2014 7:26
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Zajímavé :) Budeš dávat nějaký plusový body, když to bude umět pracovat s nedefinovanými proměnnými (nejenom čísla), nebo je to zbytečný?

Nahoru Odpovědět 30.9.2014 16:53
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět 30.9.2014 17:00
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Ptal jsem se, jestli bude oceňována tato vlastnost:

Program dostane na vstupu mnohočlen obsahující kromě konstantních členů také neznámé.
např:

2a * 7a - 8(b-8)

Proměnné a ani b nabyly předem definovány. Program si neřekne o hodnotu neznámých, ale vypočítá výsledek, kterým je:

14a^2 - 8b + 64

Uživatel poté může zadat hodnoty neznámých a získat tak konkrétní hodnotu.

Nahoru Odpovědět 30.9.2014 17:16
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:

Nezadaná proměnná je chyba v zadání výrazu. Ale můžeš tam zobrazit obecné řešení + přesnou hodnotu. Ocenit to určitě ocením :)

Nahoru Odpovědět  +1 30.9.2014 17:32
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Co je největší priorita v machru na algoritmy? Rychlost, funkčnost, nebo kód? Nebo je všechno stejnoměrné? Už jsem něco vymyslel, zatím to funguje, ale při rozsáhlejším příkladu to chvíli trvá :)

 
Nahoru Odpovědět  -1 1.10.2014 17:00
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Křehula
Zdeněk Pavlátka:

Důležité je všechno dohromady. Rychlost nebudu nijak měřit, ale pokud budu na jednoduchý výsledek čekat, plus to rozhodně nebude.

Nahoru Odpovědět 1.10.2014 17:09
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Křehula:

Dneska se mi to podařilo zajistit, aby to náhodou nespadlo, a přidal jsem i Stopwatch pro kontrolu rychlost. Příklad o 2000 znacích při použití 15 proměnných se mi podařilo vypočítat za 252ms :). Ještě doladím nějaké estetické detaily a mohu to sem hodit, jestli se někdo chce podívat na moje řešení.

 
Nahoru Odpovědět 2.10.2014 22:44
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Lukáš Křehula
Matěj Kripner:

2000 znaků, 6 proměnných - 4ms :P

Nahoru Odpovědět  ±0 3.10.2014 20:11
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Ještě jedna otázka - jak moc důležitá je syntatická kontrola příkladu? Tzn. pokud příklad není zapsán správně, program nevypíše špatný výsledek, ale ohlásí chybu.

Nahoru Odpovědět 3.10.2014 20:15
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:

To je dost podstatný, ale smysl machra je v něčem jiném, takže hlavní je, aby aplikace v takovém případě nespadla.

Nahoru Odpovědět 3.10.2014 20:18
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
vitamin
Člen
Avatar
Odpovídá na Matěj Kripner
vitamin:

Daj sem pls ten tvoj test s 2k znakmi. (len vstup, nie program)

 
Nahoru Odpovědět  +1 4.10.2014 20:19
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na vitamin
Matěj Kripner:

Pokud nemáš ten program extrémně chytrý, bude stačit vytvořit co nejrozmanitější příklad s 20-ti znaky, ten okopírovat a 10x vložit, výsledek zkopírovat a zase 10x vložit :D Trochu improvizované ale pochybuju, že ten program rozpozná periodu.
EDIT: né, že bych nechtěl pomoct - už jsem to ale smazal

Editováno 4.10.2014 20:38
Nahoru Odpovědět  +1 4.10.2014 20:37
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
tomisoka
Redaktor
Avatar
tomisoka:

Tak tady je moje řešení:
http://leteckaposta.cz/987388899
Snad bude vše fungovat jak má...

 
Nahoru Odpovědět  +1 5.10.2014 17:56
Avatar
vitamin
Člen
Avatar
 
Nahoru Odpovědět 5.10.2014 18:51
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Tak tedy hodnocení:

Lukáš Křehula : Google drive mi neumožnil přístup, takže bohužel nic.

tomisoka : Funguje mi to krásně. Kódu by prospělo pár komentářů, ale není to nejhorší :) U reálné aplikace by bylo dobré někde uvést, že goniometrické fce. pracují s radiány.

Matěj Kripner : Moc pěkně řešeno. Nikde jsem nenašel popis, co to všechno umí, z kódu to vypadalo jen na základní výpočty.

vitamin : Kód je příšerně dlouhý, ale funkce nejsou špatná věc. Nepřiložil jsi spustitelný soubor, takže jsem to nemohl vyzkoušet. Jinak kód nevypadá špatně, je to rozhodně zajímavě řešené.

Placku získává tomisoka , měl to nejlépe vyřešené.

Editováno 6.10.2014 20:34
Nahoru Odpovědět  +1 6.10.2014 20:32
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Zdeněk Pavlátka
Zdeněk Pavlátka:

Pozn. V průběhu soutěže jsem si to taky zkusil napsat v C#, kód mám na 200 řádků a dá se snadno rozšiřovat. Kdyby o to byl zájem, můžu to sem dát.

Nahoru Odpovědět 6.10.2014 20:36
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Křehula:

Ihned jak jsi zažádal o přístup tak jsem to povolil, ale i kdyby to potom nefungovalo tak jsi mi mohl napsat PM. Je to otázka vtěřin, než bych to nahrál třeba na leteckou poštu..

 
Nahoru Odpovědět  +1 6.10.2014 20:38
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Křehula
Zdeněk Pavlátka:

Zítra se ti na to kouknu a minimálně ti to v PM zhodnotim

Nahoru Odpovědět 6.10.2014 21:18
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
vitamin
Člen
Avatar
Odpovídá na Zdeněk Pavlátka
vitamin:

Je tam binaka pre linux, momentalne nemam pristup na windows.
Inak kod je preto tak dlhy lebo je mozne vytvarat funkcie a je ich mozne ukladat do premennych, cize je treba vytvarat derivacny strom a pri spustani funkcii treba vytvaat zvlast kontext pre volane funkcie.

 
Nahoru Odpovědět 6.10.2014 21:48
Avatar
coells
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
coells:

Prošel jsem si vitamínův kód a musím se ho zastat. Přesně takhle se překladače opravdu píšou. Na to, co jeho řešení umí, kód určitě není příšerně dlouhý, je to standard.

Z toho, co jsem viděl, tam není co vytknout kromě trochu nesmyslné dědičnosti syntaktického parseru z lexikálního analyzéru. Jinak bych to označil za učebnicový příklad jednoduchého překladače.

 
Nahoru Odpovědět  +1 6.10.2014 22:24
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na coells
Zdeněk Pavlátka:

Ano, kód je pěkně napsaný, jako překladač je super. Ale úkol nebyl vytvořit překladač. Zrovna tohle zadání se dá vyřesit velmi jednoduše, a to včetně matematických funkcí. Řešení podle zadání by mělo jít v C# napsat na méně než 500 řádků (v Javě určitě také, v C a C++ se to prodlouží hlavně kvůli komplikovanější práci s textem).

Takže - Kdybych zadal překladač, bylo by řešení od vitamina super. Ale u tohoto zadání je to zbytečně složité.

Nahoru Odpovědět 7.10.2014 8:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
vitamin
Člen
Avatar
vitamin:

coells Co sa ti nepaci na tom ze parser dedi lexer? Videl som to uz aj v inych prekladacoch ako napr dmd (pre jazyk D).

Zdeněk Pavlátka Preco by mala byt v c++ komplikovana praca s textom?

 
Nahoru Odpovědět 7.10.2014 9:59
Avatar
coells
Redaktor
Avatar
Odpovídá na vitamin
coells:

Nedává to smysl.

 
Nahoru Odpovědět 7.10.2014 11:02
Avatar
vitamin
Člen
Avatar
Odpovídá na coells
vitamin:

Ako by si to teda riesil ty?

 
Nahoru Odpovědět 7.10.2014 11:19
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na vitamin
Zdeněk Pavlátka:

Práce s textem v C++ určitě není tak jednoduchá jako v C# a apod.. Má svoje výhody, ale je složitější.

Editováno 7.10.2014 11:56
Nahoru Odpovědět 7.10.2014 11:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Byl přiložen soubor README.txt a v něm asi 100 řádků o vlastnostech programu... Zvládá i mocniny, faktoriál, závorky do libovolné hloubky, závislost jedné proměnné na druhé, funkce atd.

Editováno 7.10.2014 15:49
Nahoru Odpovědět 7.10.2014 15:47
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:

Promiň, README jsem četl jako první soubor v celém hodnocení, tak jsem na něj na konci zapomněl. :[ Tvoje řešení nebylo špatné, jedna z mála věcí, které bych vytkl jsou ty funkce velkými písmeny.

Do hodnocení jsem toho napsal dost málo, hlavně proto, že už bylo dost pozdě. Ale rozhodoval jsem se podle spousty věcí a hodnocení mi trvalo přes hodinu. Do výsledků už jsem psal jako komentáře k výtvorům jen na co jsem si v tu chvíli vzpomněl. Další machři budou do neděle do 12, abych měl víc času na hodnocení, včera už mě tlačil čas.

Nahoru Odpovědět 7.10.2014 16:03
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Funkce psané velkými písmeny opravdu nejsou výplod mojí fantazie. Byla by otázka vteřin to předělat. Jak jsem ale psal v README.txt - jak má program rozpoznat, zda se jedná o funkci, když uživatel napíše toto:

sin(3! / 1,5)

je to funkce, nebo výraz s * i * n * (3! / 1,5)? Jinak pokud by to nebyl problém tak až bude čas, velice ocenil podrobnější kritiku. Samozřejmě chápu, že teď nemáš čas - to ti nevyčítám :) Ale tak trochu jsem ten program psal s tím, že mi ho někdo zkušenější ohodnotí a já si z toho něco budu moct vzít.

Nahoru Odpovědět 7.10.2014 16:13
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Ještě doplním, že pokud je možno, prosím o přehodnocení výsledku poté, co si přečteš README.txt. - Nespěchá to, klidně počkám další týden.

Nahoru Odpovědět 7.10.2014 16:19
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:

README jsem četl, jen jsem na to zapomněl při psaní výsledků :) Podrobnější zhodnocení ti klidně napíšu, ale někdy o víkendu, přes týden moc času nemám.

Jinak ty funkce by se prostě rozeznávaly podle názvu, např. v tom sin(3! / 1,5) by název funkce měl prioritu před násobením proměnných.

Nahoru Odpovědět 7.10.2014 16:25
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:

Taky možnost :) Ale na velkých písmenech nic špatného nevidím :D

Nahoru Odpovědět  +1 7.10.2014 16:29
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
coells
Redaktor
Avatar
Odpovídá na vitamin
coells:

Přes delegáta. Stejným způsobem, jako tvůj Lexer získává vstupní data.

Podívej se na Lexer. Jako vstupní parametr v kontruktoru přijímá stream (string, iterátor, stream, reader, na tom nezáleží). Proč Lexer nedědí od stringu, streamu nebo iterátoru? Protože to nedává smysl. Stejným způsobem nedává smysl, aby Parser dědil od Lexeru.

Obě třídy jsou oddělené komponenty a stejně tak by měly fungovat. Dědičnost ti má ušetřit práci, jenže když se snažíš podědit bez zjevného důvodu, práci si pouze přiděláš, protože až budeš v budoucnu upravovat třídy, rozšiřovat je nebo měnit, zjistíš, že musíš brát neustále ohledy na všechny potomky.

Tady je velký rozdíl mezi poděděním kompletní funkcionality a delegátem s jasně definovaným rozhraním. Důvod k dědičnosti tu není, výstupem z lexeru jsou tokeny, které jsou vstupem do syntaktické analýzy. Reusabilita kódu je nulová, zatímco začínáš narušovat modularitu komponent. Pokud se v budoucnu rozhodneš změnit lexikální analýzu na regulární automat pomocí nejakého nástroje, který vygeneruje analyzér, máš velký problém, protože všechny úpravy se budou automaticky promítat do syntaktické analýzy. Tohle dává smysl? Argument sám za sebe pak je definice konstruktoru, která naprosto omezuje návrh potomků, kteří také budou muset vyžadovat stream ve svém konstruktoru, ale pro vyšší stupně analýzy to není žádoucí stav.

A ještě jeden pohled z trochu vyšší úrovně. Pokud bys měl vymezit funkcionalitu pro jednotlivé třídy, u Parseru bys napsal "provádí syntaktickou a sémantickou analýzu, generuje derivační strom". Jaký by byl popis Lexeru? "neumí nic, ale potomci získají možnost lexikální analýzy" Takže je každý potomek lexikální analyzér? Není, pouze získá takovou schopnost.

 
Nahoru Odpovědět 7.10.2014 19:08
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

Tak jak koukám, tak bych stejně nevyhrál, protože to mám psané jako překladač. Čili lexikálbí, semanticka a syntaxní analýza. Pak performance analýza a výstup do výstupního kódu podle pravidel. Taky to ani nejde hodnotit, protože kód je hodně dliuhý a je to navíc v JS.

 
Nahoru Odpovědět 15.10.2014 23:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 52 zpráv z 52.