Diskuze: Machr na Algoritmy - parser matematických výrazů
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 50 zpráv z 52.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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.
neni tenhle problem reseny tak v milionu ruznych knihovnach ?
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.
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?
Machr vhodný pro Jan Barášek
Zítra pošlu řešení, trochu poupravím GLSL parser. Nevadí doufám, že to bude umět i vektory a matice?
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.
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.
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š.
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ý?
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.
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
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á
Důležité je všechno dohromady. Rychlost nebudu nijak měřit, ale pokud budu na jednoduchý výsledek čekat, plus to rozhodně nebude.
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í.
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.
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.
Daj sem pls ten tvoj test s 2k znakmi. (len vstup, nie program)
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 Trochu improvizované ale
pochybuju, že ten program rozpozná periodu.
EDIT: né, že bych nechtěl pomoct - už jsem to ale smazal
Tak tady je moje řešení:
http://leteckaposta.cz/987388899
Snad bude vše fungovat jak má...
Moje riesenie:
http://leteckaposta.cz/761437437
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é.
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.
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..
Zítra se ti na to kouknu a minimálně ti to v PM zhodnotim
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.
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.
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é.
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?
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ší.
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.
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.
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.
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.
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.
Taky možnost Ale na
velkých písmenech nic špatného nevidím
Zobrazeno 50 zpráv z 52.