NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Soutěž: Machr na OOP - Tvorba silniční sítě

Soutěž již skončila

Zadání

Vítám Vás u dalšího machra na OOP a algoritmy. Vašim úkolem bude navrhnout silniční síť pro část krajiny podle zadaných kritérií. Algoritmus a OOP budou hodnoceny nezávisle na sobě. Placky budou rozdány pro OOP i pro algoritmus.

Povolené jazyky jsou kromě C# také Java, C++ a PHP. Další jazyky po konzultaci se mnou. Pokud povolím další jazyk, uvedu to v komentářích, proto prosím čtěte i komentáře.

Zadání

Program si bude muset přečíst data ze souboru input.txt a výstup uložit do souboru output.txt. Program se bude skládat z několika částí, které lze do určité míry řešit samostatně. Celkový počet bodů bude rozdělen mezi pod úkoly. Souřadnice jsou udávány v pravoúhlém souřadnicovém systému. Ukázkový „input.txt“ :

MESTA
0: 12.60; 14.80
1: 18.40; 20.40
2: 14.60; 18.70

SILNICE
0: 14; 3.00
1: 25; 2.00
2: 48; 0.50

FINANCE
565

PODMINKY
1; 2; 4.00
0; 2; 21.60

KRAJINA
2.50; 5.00; 6.00; 10.00; 11.00
0.40; 2.00; 2.00; 2.20; 3.10

1. - Program v souboru dostane tabulku měst a dostupných silnic. Město je určeno svou pozicí v pravoúhlé soustavě souřadnic. Silnice je určena svoji cenou a časem, který odpovídá jednotkové délce silnice (řekněme 1 kilometr). Města budou vždy minimálně dvě, cesta vždy minimálně jedna.

  • Město s indexem 0 je na pozicích X[12.6, 14.8]
  • Město s indexem 1 je na pozici Y[18.4, 20.4]
  • Silnice s indexem 0 stojí 14 korun na jednotku délky a cesta bude trvat 3 minuty
  • Pokud postavím silnice typu 0 mezi městy s indexy 0 a 1, bude cena dálnice |XY|*14 = 8 * 14 = 112 korun a cesta bude trvat |XY| * 3.0 = 24 minut. Poznámka: |XY| je vzdálenost mezi městy 0 a 1.

Vašim úkolem bude spojit všechny města tak, aby se dalo z každého města dostat do libovolného jiného města (každé město musí být připojeno k silniční síti). Silnice můžou být pouze přímé a postaveny mezi dvěma městy.

2. - V souboru budou dále uvedeny finance a podmínky, které silniční síť musí splňovat. Finance bude číslo, které nesmíte překročit. Podmínky jsou definované jako index počátečního města, index cílového města a čas, který nesmí cesta překročit.

  • Celkem mám na výstavbu 565 korun
  • Z města o indexu 1 se musím dostat do města o indexu 2 za 4 minuty
  • Z města o indexu 0 se musím dostat do města o indexu 2 za 21.6 minuty

Úkolem bude navrhnout silniční síť tak, aby podmínky splnila a nepřekročila dostupné finance. Počet dostupných financí bude v souboru vždy, podmínky být uvedeny nemusí (poté by byl uveden pouze nápis PODMINKY bez záznamů). Počet řešení, které podmínky i maximálně finance splňují, může být několik. Stačí vypočítat pouze jedno.

3. - V souboru bude uveden seznam krajin, které se v regionu vyskytují. Rychlost provozu na silnici závisí na vzhledu krajiny. Krajina může rychlost provozu zpomalit nebo zrychlit. První číslo je konstanta, která bude násobit čas pro danou silnic v této krajině. Další čtyři parametry určují obdélník (krajiny mají pouze obdélníkový tvar) – počáteční bod (x,y) a rozměry obdélníku (šířka a výška).

  • První krajina násobí potřebný čas konstantou 2.5 – bude-li silnice o indexu 0 probíhat touto krajinou, je potřeba počítat 2.5*3.0=7.5 minuty na jednotku délky.
  • První krajina má levý horní roh v souřadnicích 5,6 a dolní pravý roh v souřadnicích 5+10 = 15, 6+11 = 17.

Vašim úkolem bude navrhnout silniční síť tak, aby byly splněny předcházející podmínky a zároveň byly do výpočtu zahrnuty krajiny.

Čísla, která jsou zapsány v ukázkovém vstupním souboru s desetinou čárkou, budou mít vždy dvě desetinná čísla. Počet různých měst, cest, podmínek a krajin může být maximálně 1000.
Testovací soubory budou připraveny tak, že bude vždy možné spojit všechny města, dodržet podmínky a vlézt se do rozpočtu – bude vždy existovat alespoň jedno řešení. Pro úspěšné splnění testu stačí najít pouze jedno řešení.

Připravil jsem testovací soubory, na kterých můžete aplikaci vyzkoušet. Můžete je najít zde.

Výstupní formát

Do výstupního souboru bude program vypisovat pouze silnice, které budou spojovat jednotlivé města. Bude se jednat o sérii celých čísel, oddělené středníkem. Bude uvedeno město, ze kterého silnice vychází, dále město, do kterého silnice vede a typ silnice, kterou program použil. Pro ukázkový příklad a první úkol (spojení všech měst), může soubor vypadat následovně:

0;1;1
1;2;2

Město o indexu 0 je spojeno s městem o indexu 1 silnicí typu 1. Město o indexu 1 je spojeno s městem o indexu 2 silnicí typu 2.

Výhra

Vítěz dostane placku Machr na OOP nebo algoritmus a ocenění do portfolia.

Výhra

Výsledky

Jméno bodů Řešení ( Stáhnout vše )
tomisoka 50 Stáhnout řešení
JOF 41 Stáhnout řešení
Jenkings 35 Stáhnout řešení
Ladislav Ondris 5 Stáhnout řešení
Neaktivní uživatel 0 Stáhnout řešení
Patrik Smělý 0 Stáhnout řešení
Honza Bittner 0 Stáhnout řešení

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Odpovídá na Patrik Valkovič
Ondřej Krsička:11.10.2015 20:01

No, vyřešil jsem, jak zjistit mezi městem vzdálenost a čas se započtením krajin. To jsem řešil první.

Ale u toho generátoru možná udělat pole možných cest seřazených podle velikosti a od nejmenších po nejdelší propojovat, ale to by nakonec mělo každý město s každým cestu, takže nějak jinak. To mě tak napadlo.

Nebo určit jedno město jako centrum a do něj že musí být cesta ze všech měst, tudíž by zároveň byla cesta odkudkoli kamkoli.

 
Odpovědět
11.10.2015 20:01
Avatar
Odpovídá na Patrik Valkovič
Ondřej Krsička:11.10.2015 20:04

Ale to by mi nejspíš vznikla hvězdice, takže tyto dvě věci zkombinovat a jedno město vždy připojit k nejbližšímu ještě nepřipojenýmu. Až by se udělaly uzavřené skupiny měst, tak by se z každé skupiny jedno město propojilo s jedním z nejbližší skupiny, která ještě není napojená na jinou skupinu.

 
Nahoru Odpovědět
11.10.2015 20:04
Avatar
Odpovídá na Ondřej Krsička
Patrik Valkovič:11.10.2015 20:07

Špatně. Co když ti nevychází podmínky? To budeš celou síť generovat znova a znova, dokud to nebude fungovat?
Pole možných cest je také pracné. Máš n měst, to znamená, že budeš mít n! cest. To je příliš.
Pokud budeš mít jedno město jako centrum, tak rozhodně nebudeš mít nejefektivnější síť.
Takže znovu, jaký úkol musíš udělat jako první?

Nahoru Odpovědět
11.10.2015 20:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Patrik Valkovič
Ondřej Krsička:11.10.2015 20:11

Zpracovat vstup a dát do pole nebo do pole objektů?

 
Nahoru Odpovědět
11.10.2015 20:11
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jenkings:11.10.2015 20:13

Trénovat ? důležité je začít na lehčích situacích.
Za příklad si můžeš vzít třeba matiku ve škole. Dostaneš příklad přes dva řádky a taky nevystřelíš výsledek od boku, ale už automaticky jdeš od těch malých problémů až se dostaneš postupně k výsledku velkého příkladu. Víš že násobení a dělení má přednost před sčítáním a odčítáním, + role závorek atd. takže si nejdříve vyřešíš závorky, potom si teprve vypočítáš násobení a dělení a nakonec sečteš a odečteš. (ne vždy to je přesně takhle,ale je to jen příklad)

A postupně to funguje i s programováním :)

Editováno 11.10.2015 20:14
Nahoru Odpovědět
11.10.2015 20:13
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Ondřej Krsička:11.10.2015 20:17

Nemyslel jsi ten příklad jako že když neumím násobit, tak nemůžu umět ani např. lomený výrazy?
Nebo podproblémy řešit od toho nejjednoduššího a pak až dělat to složitý?

 
Nahoru Odpovědět
11.10.2015 20:17
Avatar
Odpovídá na Ondřej Krsička
Patrik Valkovič:11.10.2015 20:18

Paradoxně, u tohoto příkladu musíš jít od zadu. Tedy první si vygenerovat nejkratší cesty podle podmínek, a teprve potom doplnit síť. Proč? Protože nejrychlejší cesta mezi dvěma body je pouze jedna, zatímco sítí máš mnohonásobně víc (přesné číslo ti neřeknu, ale počítej s exponenciálním přírůstkem). je tedy jednodušší zkoušet různé variace nejrychlejších cest, než generovat všechny možné sítě a na nich teprve testovat, zda splňují podmínky.
Vidíš v tom tu logiku? je jednodušší vygenerovat nejrychlejší cestu a z ní graf (jeden), než ve grafech (mnoha) vždy hledat cestu.

Nahoru Odpovědět
11.10.2015 20:18
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jenkings:11.10.2015 20:19

mínil jsem tím pouze to, že to prostě musíš umět rozložit na podproblémy a ty řešit :)

Nahoru Odpovědět
11.10.2015 20:19
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Jenkings:11.10.2015 20:22

Nad touhle metodou jsem upřímně řečeno taky uvažoval, ale bylo tam pro mně v tu chvíli pár problémů se kterými jsem si nevěděl rady, takže jsem to musel přehodnotit a udělat to aspoň tak aby to umělo najít graf. Nicméně si myslím, že nejzásadnější věc kterou jsem nemohl rozlousknout bylo to, na základě čeho vybrat typ té spojnice/cesty

Editováno 11.10.2015 20:22
Nahoru Odpovědět
11.10.2015 20:22
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Ondřej Krsička:11.10.2015 20:23

Jo ještě aby seděly podmínky, to jsem vůbec nezvažoval.

** je jednodušší vygenerovat nejrychlejší cestu a z ní graf (jeden), než ve grafech (mnoha) vždy hledat cestu.**

Z principu chápu, ale cestu a z ní graf vůbec nechápu co je to graf z něčeho.

 
Nahoru Odpovědět
11.10.2015 20:23
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jenkings:11.10.2015 20:25

ohledně toho grafu:
jde o to,že celý příklad předpokládá znalost matematické "teorie grafů". Takže ještě před započetím prací bylo potřeba si o tom dost nastudovat (tedy aspoň pro nás, kteří jsme o tom nevěděli před zadáním této soutěže téměř nic)

Nahoru Odpovědět
11.10.2015 20:25
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
rikenbekr
Člen
Avatar
rikenbekr:11.10.2015 20:25

Budou řešení poté uveřejněna ke stažení?
Pokud ne byl by mi některý autor ochotný řešení zaslat?

Editováno 11.10.2015 20:26
Nahoru Odpovědět
11.10.2015 20:25
In world without fences and walls, who needs Gates and Windows?
Avatar
Odpovídá na Jenkings
Patrik Valkovič:11.10.2015 20:28

To je bolavé místo. Když se podíváš na zadání, optimalizuješ mezi cenou / časem. Máš funkci dvou proměnných, která nelze určit algoritmem. Zde nezbývá nic jiného, než zapojit hrubou sílu.
Pomůžou tomu nějaké optimalizace, ohledně výběru cest ze vstupu (například cesta, která stojí 15 a má časovou konstantu 1, je rozhodně horší, než cesta, která stojí 15 a má časovou konstantu 0,5). Tím můžeš vyfiltrovat pár typů cest, ale potom jde použít jen hrubá síla. Zvláště v případě, kdy je více podmínek, které můžou záviset na stejné cestě.
Budeš brát v potaz všechny možnosti, která splňují časovou podmínku, a ještě splňují cenu.

Nahoru Odpovědět
11.10.2015 20:28
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na rikenbekr
Patrik Valkovič:11.10.2015 20:29

Řešení myslím bývají veřejné po ohodnocení.

Nahoru Odpovědět
11.10.2015 20:29
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Jenkings
Ondřej Krsička:11.10.2015 20:32

Teorie grafů.. to jsem možná někde slyšel. Fakt jen slyšel.
Myslíte, že mi pomůže/něco přinese nastudování té teorie grafů? Nebo je to moc těžká matika nebo to až tak důležitý není?
Kdyžtak nějaký doporučení, jak si to nastudovat? z nějaký knížky, online, wiki...?

 
Nahoru Odpovědět
11.10.2015 20:32
Avatar
alfonz
Člen
Avatar
alfonz:11.10.2015 20:36

Nemyslím že by to zrovna bylo těžké k nalezení. :)
http://lmgtfy.com/?…

Nahoru Odpovědět
11.10.2015 20:36
lmao
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jenkings:11.10.2015 20:37

stačí si vygooglit "teorie grafů" a vyhodí ti to jak wiki, tak spousty odborných skript, ale podle mého názoru je potřeba pro plné pochopení poměrně dlouhá doba. Já jsem toto využil poprvé až teď v soutěži, nicméně záleží na tom čemu se chceš věnovat, a tato problematika má rozhodně více uplatnění než jen hledání spojnic měst. Záleží tedy na tobě co pokládáš za důležité/přínosné

Nahoru Odpovědět
11.10.2015 20:37
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Ondřej Krsička
Patrik Valkovič:11.10.2015 20:39

Není to nic složitého. Jen se odprosti od představy, že je to série sloupečků v Excelu :D
Graf se skládá z uzlů a hran. V našem případě je uzel město a hrana je cesta. Většina algoritmů pracuje právě s grafy.
Nějaké ukázky:
https://jeremykun.files.wordpress.com/…ncolored.png?…
http://1.bp.blogspot.com/…s1600/p1.png
http://www.codeproject.com/…ected-Graphs

Algoritmy se poté liší v tom, jak s grafem pracují.

Nahoru Odpovědět
11.10.2015 20:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
B42P6
Člen
Avatar
B42P6:11.10.2015 20:53

Zdravím program na tvorbu cestnej siete som začal písať ale nestihol som ho ešte dokončiť (Algoritmus mám stačí ho iba implementovať do kódu ;) ) (určite ten program ešte dokončím ;) ) . Zaujímalo by ma či beriete do úvahy to, že ak je možnosť postaviť/upraviť jednu alebo viac ciest tak aby vyriešila viac podmienok bude to lacnejšie . Čo ak to bude iba jediná možnosť(2 podmienky, financie iba na 1 cestu) ?

PS: Dúfam že cieľom je nájsť čo najlacnejšie riešenie :)

Editováno 11.10.2015 20:55
Nahoru Odpovědět
11.10.2015 20:53
'long long long' is too long for GCC
Avatar
Odpovídá na B42P6
Patrik Valkovič:11.10.2015 20:56

Cílem je vlézt se do rozpočtu a splnit podmínky. Machr už ale skončil, další řešení už neberu.

Nahoru Odpovědět
11.10.2015 20:56
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
B42P6
Člen
Avatar
Odpovídá na Patrik Valkovič
B42P6:11.10.2015 21:01

Jasné, chápem že ďalšie riešenia už neberieš. Len by ma zaujímalo či pri testovaní používaš inputy v ktorých je jediné riešenie postaviť jednu alebo viacero ciest tak aby ju mohlo použiť viac podmienok.

Nahoru Odpovědět
11.10.2015 21:01
'long long long' is too long for GCC
Avatar
Odpovídá na B42P6
Patrik Valkovič:11.10.2015 21:04

Řešení používám takové, že se mi náhodně vygenerují města, ty se téměř náhodně pospojují a z nich poté určím podmínky, nic víc :D
Rozhodně to nedělá nejefektivnější cesty (spíš nejméně efektivní) a je tedy hodně velká šance postavit lepší síť. Nicméně pro velký počet měst to nezvládá žádný program.
https://onedrive.live.com/redir?…

Nahoru Odpovědět
11.10.2015 21:04
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Patrik Valkovič
Ondřej Krsička:11.10.2015 21:10

ty dva obrázky jsou hezký, na codeproject kouknu, ale tohle nedávám
https://cs.wikipedia.org/…%C5%99_barev

 
Nahoru Odpovědět
11.10.2015 21:10
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Jenkings:11.10.2015 21:13

Taky to moc nechápu, ale musím ti poděkovat za odkaz. Nenapadlo by mně že i tohle se dá řešit pomocí grafů :)

Nahoru Odpovědět
11.10.2015 21:13
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
Ondřej Krsička:11.10.2015 21:16

Není zač, na wiki jsem našel **Teorie grafů **a tam byl na toto odkaz :)
Kdyžtak jsem založil nový téma. v sekci Matematika a Fyzika, můžete se mi tam mrknout ;)

 
Nahoru Odpovědět
11.10.2015 21:16
Avatar
B42P6
Člen
Avatar
Odpovídá na Patrik Valkovič
B42P6:11.10.2015 21:45

Akože to nieje najefektívnejšie? Keď postavíš cestu ktorá bude zdieľaná (zdieľaná znamená že trasa z mesta A do mesta B a zároveň trasa z mesta C do mesta D bude prechádzať cez túto cestu) 2 alebo viacerými podmienkami môže to byť lacnejšie, samozrejme nemusí to platiť vždy ,ale s tým počítam.

Editováno 11.10.2015 21:46
Nahoru Odpovědět
11.10.2015 21:45
'long long long' is too long for GCC
Avatar
coells
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
coells:11.10.2015 23:47

Nezvládá to žádný program, protože to zvládnout nejde. Tvoje zadání vede na NP těžkou úlohu. Dokázat to nemůžu, ale s trochou zkušenosti je to vidět na první pohled. Na nalezení řešení prostě musíš mít štěstí a ke každému algoritmu se dá vymyslet protipříklad, který [v rozumném čase] vyřešit nedokáže.

 
Nahoru Odpovědět
11.10.2015 23:47
Avatar
Odpovídá na coells
Ladislav Ondris:12.10.2015 17:44

Ale když si napíšeš dobrý program, tak proč by nemohl zvládnout vytvořit lepší síť?

Nahoru Odpovědět
12.10.2015 17:44
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
coells
Tvůrce
Avatar
Odpovídá na Ladislav Ondris
coells:12.10.2015 20:22

Obávám se, že nerozumím otázce? Nicméně existuje velká spousta problémů, pro které nedokáže nikdo napsat dost "dobrý" program.

 
Nahoru Odpovědět
12.10.2015 20:22
Avatar
Odpovídá na coells
Patrik Valkovič:12.10.2015 20:27

Zvládnout to samozřejmě jde. O tom, že je to NP problém samozřejmě vím, také je to zmíněno v jednom z předchozích příspěvků, že balancuješ mezi cenou / rychlostí.
Proto je zadání dané tak, že musí splnit rozpočet (nikde není napsáno, že má mít síť nejmenší cenu). A potom už to v rozumném čase vyřešit jde.

Nahoru Odpovědět
12.10.2015 20:27
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Patrik Valkovič:12.10.2015 21:55

Díky všem za účast, zde jsou výsledky:

Neaktivní uživatel - 0 bodů
Prázdné řešení

Patrik Smělý - 0 bodů
Prázdné řešení

tomisoka - 50 bodů
Program vytvoří síť a to i pro složitější zadání.
Co se týče návrhu, jsem z toho trochu zmatený. I když v C++ dělám, některé obraty jsou už moc hardcore :D
Nicméně, všechny algoritmy jsou pouze v jedné třídě. To by se vyksytovat nemělo. Samotná metoda Setup je hrooozně dlouhá. Měla by být rozdělena do samostatných metod. Při parsování se neustále opakuje stejná část kódu, to by šlo také vyřešit samostatnou metodou.
Co se řešení týče, spojení všech měst se všemi není moc efektivní. I když poté cesty ubíráš, dokud jsou ještě splněny podmínky.
Ve výsledku je sice síť nejefektivnější, ale výpočet trvá dlouho. I tak mě překvapuje, že to spočítá v rozumném čase.
Naštěstí jsem se podíval na atribut -quick, což je přesně to, co měl program dělat defaultně.
Ačkoliv se mi podstata kombinace všech měst se všemi moc nelíbí, program spočítá cestu relativně rychle a správně (včetně podmínek). Toto řešení tey vyhrává Machra na algoritmy.

Jenkings - 35 bodů
Program vytvoří síť, ale nebere v potaz podmínky. Také nezvládá větší zadání.
Z hlediska OOP je pár věcí, které jsou špatně. Spousta tříd má veřejné properties. Měli by být alespoň public get, private set, nebo read-only. V Parseru jse neustále opakuje stejný kód při vytváření jednotlivých tříd. Bylo by lepší tento k=od vložit do samostatné metody. V Path nedává Region map smysl. Proč nepředat regiony přímo do funkce getTime? Nikde jinde se z regiony nepracuje.
Dále je tu třída Solver. Opět má veřejnou kostru, což by se vykytovat nemělo. Když ji někdo omylem z vnějšku změní, celá kostra bude nevalidní. Také spuštění výpočtu hned v konstruktoru není moc šikovné. Kontruktor je od toho, aby konstruoval třídu (již podle názvu), ne aby prováděl složité výpočty. naopak se mi líbí použití anonymních metod. Trošku jsem nepobral mazání poslední cesty v případě, že je síť cyklická. Jestli v tom byl nějaký záměr, tak se omlouvám a nevidím ho.

Honza Bittner - 0 bodů
Prázdné řešení

JOF - 41 bodů
Program vytvoří síť, ale nebere v potaz podmínky. Také nezvládá větší zadání.
Začnu Map třídou. Jednak samotné generování všech možných cest není moc efektivní. Pro vytváření objektů mohla existovat samostatná třída - oddělení načítání dat a výpočet. Také vytváření Listů v konstruktoru je zbytečné, když by šli vytvořit přímo u deklarace. Nepochopil jsem přístup, proč rozkládáš cestu na RoadParts. Problém regionů šel řešit efektivněji, aniž bys cestu rozkládal. Soubor Globals je zajímavý sám o sobě. Kdyby tam nebyl, pochopíl to, kdyby tam byli dvě možnosti (tedy rozdělení podle ; a :; tak to taky pochopím, ale pouze tento jeden, proč? :D
Co se Location týče, proč je definování zároveň s Line v jednom souboru? Chápu to u Road a RoadPart, ale Line a Location spolu nijak nesouvisí. Funkce Intersect je hodně nepřehledná, a tak ti budu věřit, že dělá, to co má :D
Region.GetInter­sectionWithRo­adPart by dle názvu mělo spíše vrátit Line, než body - ale to je jen otázka implementace.
trošku se mi nezdá třída Way a její statické metody. Kdyby jsi potřeboval algoritmus rozšířit, bude se to dělat těžko. Výhodnější by bylo pro výpočet algoritmu nadefinovat další třídu, která bude pouze počítat.
Jinak se mi řešení líbí nejvíc. Když opomineme ty algoritmy v jedné metoě, je projekt rozdělen hezky do tříd a používá i správné modifikátory přístupu. Na některých místech by šlo pouze využít read-only properties (C#6). Některé algoritmy propadávají skrz několik tříd a špatně se dohledávají.
Tohle řešení vyhrává Machra na OOP.

Ladislav Ondris - 5 bodů
Bohužel program nespočítá ani jednoduchý případ. Neívm, jestli je někde zacyklený, ale počítat 5 minut a použít skoro giga RAM je moc.
Co se kódu týče, spoustu obratů, kde používáš foreach, jde nahradit Linqem. Řešení bude rychlejší a přehlednější. Chválím použití Borůvkova algoritmus, který se v tomto případě hodí nejvíce. Co se Manager třídy týče, metoda ModifyRoads je šíleně dlouhá. Určitě by se měla rozdělit na několik metod. Také mít vechny algoritmy v jedné třídě není šikovné. Stejný případ, jaký jsem psal u JOFa. Není problém mít jednu třídu pro jeden algortmus. Některé části, které počítáš v Manager, se přímo dotýkají jiných tříd - tyto algoritmy by měli být ve třídách, se kterými souvisí.
U Component máš vedle veřejné Towns ještě metodu AddTown, která je zbytečná. Také můžeš foreach nahradit metodou List.Contain, která dělá to stejné. Třída IO by se měla podle názvu starat o načtení a uložení dat, ne o jejich parsování, ale dejme tomu. Máš také nadefinovanou třídu Point, což je zbytečné. ve WindowsBase assembly je Point již definovaný, a to včetně metod, které se dají využít i v tomto případě. V Road třídě máš property DistaneTown, která je zbytečná, protože jde lehce dopočítat. Pokud ji někde zapomeneš přepsat, budeš mít nevalidní data. Také by to chtělo alespoň vyhodit výjimku, když najde více průniků. A ještě taková drobnost, Math.Sqrt vrací douuble, proč celá unkce nevrací double a vyhneš se zbytečnému přetypování?
Hlavním problémem je třída Manager, která obsahuje naprosto všechny algoritmy. Ty by mohly být rozděleny do samostatných tříd, starajících se o výpočet. Také lze spoustu cyklů nahradit Linqem.

Placku tedy získává tomisoka, JOF. Gratuluji :)

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
12.10.2015 21:55
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Patrik Valkovič:12.10.2015 21:58

Čeho jsem si hlavně všiml:

  • Algoritmy v jedné třídě. Každý algoritmus by měl mít svoji vlastní třídu.
  • Zbytečné vyhodnocení if/else. Pokud je if(.....) return true; else return false; můžu rovnou použít return ....(to co bylo v ifu)
  • Špatné použití přístupových modifikátorů. Hlavně je potřeba dát pozor na to, aby nám strukturu, kterou máme, nikdo z vnějšku nezměnil - poté by již nebyla validní a nemůžeme tedy spoléhat na to, že výsledky jsou správné.
Nahoru Odpovědět
12.10.2015 21:58
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Patrik Valkovič:12.10.2015 22:05

A co jsem ještě nezmínil, byla to skvělá úloha na vícevláknové programování :)
jedno vlákno spočítá cestu pro podmínky, další vlákno doplní graf a třetí vlákno jej zvaliduje. S trochou optimalizace bude čas několikrát menší oproti jednovláknové aplikaci :)

Nahoru Odpovědět
12.10.2015 22:05
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
JOF:12.10.2015 23:09

Dík za kritické zhodnocení mého řešení i za placku ;-)
A samozřejmě gratulace pro Tomisoku!
Měl bych jeden dotaz k vyjádření: "...vytváření Listů v konstruktoru je zbytečné, když by šli vytvořit přímo u deklarace...". Myslel jsem, že funkčně je úplně jedno, kde se to vytváří a technicky, že je toto řešení čistší. Proč to takhle není správně?

 
Nahoru Odpovědět
12.10.2015 23:09
Avatar
Odpovídá na JOF
Patrik Valkovič:12.10.2015 23:23

Co je čistší je otázka. V principu si vytváření Listu nezávisí na ničem jiném. Pokud bys do kontruktoru dostal napříkald počet elementů, které bude List obsahovat, můžeš mu rovnou nastavit Capacity.
Pro přehlednost bych vytváření Listu dal přímo k deklaraci. Máš jistotu, že tam ten List vždy bude. Nemůže se ti třeba stát, že zapomeneš v kontruktoru vytvořit instanci.

Nahoru Odpovědět
12.10.2015 23:23
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na JOF
Patrik Valkovič:13.10.2015 7:37

Ještě mě napadá případ, kdy máš několik konstruktorů, které se navzájem nevolají. V každém konstruktoru bys vytvářel instance listů. V této situaci určitě budeš souhlasit, že čistší řešení je vytvářet instance při deklaraci.

Nahoru Odpovědět
13.10.2015 7:37
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Jan Vargovský:13.10.2015 11:20

Spíše mi řekni případ, kdy máš konstruktory, které navzájem nejsou závislé.

 
Nahoru Odpovědět
13.10.2015 11:20
Avatar
Ondřej Langr (andysekcze):13.10.2015 21:52

http://teorie-grafu.cz/…ti-grafu.php link pro ty kdo by chtěl

Editováno 13.10.2015 21:53
Nahoru Odpovědět
13.10.2015 21:52
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Martin Skalík
Tvůrce
Avatar
Martin Skalík:25.10.2015 21:20

jak to že placku dostal JOF a ne tomisoka?

 
Nahoru Odpovědět
25.10.2015 21:20
Avatar
Odpovídá na Martin Skalík
Patrik Valkovič:25.10.2015 21:22

Byly to dva machři v sobě. tomisoka dostal ocenění za algoritmus, JOF poté za OOP.

Nahoru Odpovědět
25.10.2015 21:22
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Martin Skalík
Tvůrce
Avatar
Martin Skalík:25.10.2015 21:28

Ahá ono to nikde nebylo uvedeno :)

 
Nahoru Odpovědět
25.10.2015 21:28
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 41 zpráv z 141.