Pub crawl
Zadáno v úterý 6. 4.
K odevzdání v pondělí 12. 4.
Získat můžete až 30 bodů
Žijete v jednorozměrném městě, které leží na úsečce. V městě je několik podniků, kde se čepuje pivo; každý podnik čepuje jen jednu značku. Seznam piv čepovaných v jednotlivých hospodách dostanete na prvním řádku vstupního souboru input.txt
. Například ze vstupu:
ABCDBC
lze vyčíst, že ve městě máte šest hospod, z nichž první točí značku A
, druhá značku B
, třetí značku C
a tak dále. Všimntěte si, že druhá a páta hospoda točí stejné pivo.
Kromě tohoto seznamu podniků, respektive jimi točených piv, máte ve vstupním souboru také seznam piv, nak které máte dnes večer chuť. A jelikož jste labužník, chcete si je vychutnat v zadaném pořadí — je vám však jedno, z kterého podniku dané pivo pochází, hlavně, když je to správná značka.
Vaším cílem bude hledat cesty mezi hospodami, které naplní váš večerní plán. Například pro výše uvedené město a seznam piv
CA
existuje jen jedna taková cesta: navštívit třetí hospodu, a po ní hospodu první.
Detaily zadání
O vstup se stará mnou napsaná funkce Main.main
. Vaším úkolem bude napsat funkci solve
, a vhodně ji zavolat z main
, a také doplnit definice typů, které jsou naznačeny v zadání. Funkci i typy si můžete pojmenovat jakkoli, museli byste však změnit importy v test/Main.purs
.
V testech jsou zatím jen dva příklady, a to na základní úroveň. Pokud budete dělat další úrovně, napište si na ně další solve
-y a v testech si k nim doplňte vhodné testy.
Úrovně řešte v zadaném pořadí. První tři byste měli stihnout do tohoto úterý. Řešení čtvrté si budeme ukazovat na hodině. Všechny ostatní jsou dobrovolné a bez pevného termínu.
Úroveň 1 (15 bodů)
Vypište délku některé validní cesty (popřípadě Nothing
v případě, že žádná taková neexistuje).
Úroveň 2 (10 bodů)
Vypište délky všech validních cest, např jako List Int
.
Úroveň 3 (5 bodů)
Vypište délku nejkratší cesty.
Úroveň 4 (15 bodů)
Odpovězte na následující otázky:
- Nakreslete strom rekurzivních volání funkce
solve
ze třetí úrovně. Tj začněte tím, že voláte funkcisolve
s nějakými namátkovými hodnotami; pod to nakreslete jednotlivá volánísolve
, opět spolu s jejich hodnotami. A pod každé z těchto volání opět vypište, s jakými parametry se volásolve
z něj. Pokud máte parametry hodně veliké, nemusíte to kreslit "až na dno". - Čím je řešení třetí úrovně neefektivní?
- Jak by šlo teoreticky zlepšit?
- Jak byste to udělal konkrétně v Purescriptu, za pomocí věcí, které už známe?
Úroveň 5 (15 bodů)
Rozšiřte zadání na dvojrozměrná města (tj místo hospodo-pivové úsečky dostanete tabulku). Druhá část vstupu zůstane stejná — seznam piv, které chcete vypít. Vypište pouze délku nejkratší cesty; použijte optimalizaci z úrovně 4.
Úroveň 6 (? bodů)
Zamyslete se, jestli by se nějak nedalo vyextraktovat z vašich řešení nějakou obecno část, které bychom jen něco málo dodali a ona by uměla řešit problém v n-rozměrných městech. Popřemýšlejte, jak by vypadal takový obecný typ Pubs
.
Pozor: Toto jsem nezkoušel řešit, vůbec nevím, jak to dopadne.