NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Zdeněk Pavlátka:27.9.2014 20:04

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
Odpovídá na Zdeněk Pavlátka
Michal Žůrek - misaz:27.9.2014 20:09

takovýto machr už tu byl :P

 
Nahoru Odpovědět
27.9.2014 20:09
Avatar
Odpovídá na Michal Žůrek - misaz
Zdeněk Pavlátka:27.9.2014 20:19

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Šimon Raichl:27.9.2014 20:21

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

 
Nahoru Odpovědět
27.9.2014 20:21
Avatar
Odpovídá na Zdeněk Pavlátka
Zdeněk Pavlátka:27.9.2014 20:26

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
Odpovídá na Šimon Raichl
Zdeněk Pavlátka:27.9.2014 20:27

Neruší, upravuje ;)

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:27.9.2014 20:32

neni tenhle problem reseny tak v milionu ruznych knihovnach ?

 
Nahoru Odpovědět
27.9.2014 20:32
Avatar
Odpovídá na sadlomaslox25
Zdeněk Pavlátka:27.9.2014 20:34

A to snad vadí?

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:27.9.2014 20:42

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Šimon Raichl:27.9.2014 20:43

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
Odpovídá na Šimon Raichl
Zdeněk Pavlátka:27.9.2014 20:46

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
Tvůrce
Avatar
Honza Bittner:27.9.2014 20:49

Machr vhodný pro Jan Barášek :P

Nahoru Odpovědět
27.9.2014 20:49
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:27.9.2014 21:26

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
Tvůrce
Avatar
Odpovídá na Honza Bittner
Jan Barášek:27.9.2014 21:29

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
27.9.2014 21:29
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
Jan Vargovský
Tvůrce
Avatar
 
Nahoru Odpovědět
27.9.2014 21:32
Avatar
Nahoru Odpovědět
27.9.2014 21:38
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:27.9.2014 23:12

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:27.9.2014 23:22

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
Odpovídá na 1Pupik1989
Zdeněk Pavlátka:28.9.2014 7:26

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:30.9.2014 16:53

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
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:30.9.2014 17:00

Nějak jsem nepochopil dotaz 8|

Nahoru Odpovědět
30.9.2014 17:00
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:30.9.2014 17:16

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
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:30.9.2014 17:32

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
30.9.2014 17:32
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Lukáš Křehula:1.10.2014 17:00

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.10.2014 17:00
Avatar
Odpovídá na Lukáš Křehula
Zdeněk Pavlátka:1.10.2014 17:09

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
Odpovídá na Zdeněk Pavlátka
Lukáš Křehula:2.10.2014 22:44

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
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Matěj Kripner:3.10.2014 20:11

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

 
Nahoru Odpovědět
3.10.2014 20:11
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:3.10.2014 20:15

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
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:3.10.2014 20:18

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:4.10.2014 20:19

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

 
Nahoru Odpovědět
4.10.2014 20:19
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na vitamin
Matěj Kripner:4.10.2014 20:37

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
4.10.2014 20:37
Avatar
tomisoka
Tvůrce
Avatar
tomisoka:5.10.2014 17:56

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

 
Nahoru Odpovědět
5.10.2014 17:56
Avatar
vitamin
Člen
Avatar
vitamin:5.10.2014 18:51

Moje riesenie:
http://leteckaposta.cz/761437437

 
Nahoru Odpovědět
5.10.2014 18:51
Avatar
Zdeněk Pavlátka:6.10.2014 20:32

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
6.10.2014 20:32
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Zdeněk Pavlátka:6.10.2014 20:36

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
Odpovídá na Zdeněk Pavlátka
Lukáš Křehula:6.10.2014 20:38

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
6.10.2014 20:38
Avatar
Odpovídá na Lukáš Křehula
Zdeněk Pavlátka:6.10.2014 21:18

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:6.10.2014 21:48

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
coells:6.10.2014 22:24

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
6.10.2014 22:24
Avatar
Odpovídá na coells
Zdeněk Pavlátka:7.10.2014 8:54

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:7.10.2014 9:59

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
Tvůrce
Avatar
Odpovídá na vitamin
coells:7.10.2014 11:02

Nedává to smysl.

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

Ako by si to teda riesil ty?

 
Nahoru Odpovědět
7.10.2014 11:19
Avatar
Odpovídá na vitamin
Zdeněk Pavlátka:7.10.2014 11:54

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:7.10.2014 15:47

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
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:7.10.2014 16:03

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:7.10.2014 16:13

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
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:7.10.2014 16:19

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
Avatar
Odpovídá na Matěj Kripner
Zdeněk Pavlátka:7.10.2014 16:25

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
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Matěj Kripner:7.10.2014 16:29

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

 
Nahoru Odpovědět
7.10.2014 16:29
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 50 zpráv z 52.