Declaratieve Talen/oplossingWinkelen

Uit Wina Examenwiki
Versie door Lynn (overleg | bijdragen) op 17 jan 2011 om 10:35
Naar navigatie springen Naar zoeken springen
--Data type voor Section
data Section = Section Int Int Int deriving (Show)
--Je zou ook een type declaratie kunnen maken voor de hele weg : type Kaart = [Section]


help_jan::[Section]->[(Char,Int)]
help_jan kaart = let
		   (bestApath, bestBpath) = zoekPaden kaart ([],[]) --je berkent de beste paden die je vanboven doen uit komen (de A kant) en voor beneden (B kant)
		  in
                    if((sum[x|(a,x)<-bestApath]) < (sum[x|(a,x)<-bestBpath]))
			then reverse bestApath -- want we hebben het pad achterstevoeren opgebouwd
		    else
			reverse bestBpath


zoekPaden::[Section]->([(Char,Int)],[(Char,Int)])->([(Char,Int)],[(Char,Int)])
zoekPaden [] (pathA ,pathB) = (pathA ,pathB) --Je bent aangekomen in je eindpunt
zoekPaden ( (Section n z b ):xs) (pathA,pathB) =  let 
						   forwardA = (n + (sum[x|(a,x)<-pathA]))	 -- je bevindt je aan de A kant en je gaat gewoon rechtdoor
						   crossOverA = (b + (z + (sum[x|(a,x)<-pathB])))-- je bevindt je aan de B kant en je gaat eerst over de brug en dan aan de A kan naar voor
						   forwardB = (z + (sum[x|(a,x)<-pathB]))	 -- idem
						   crossOverB = ( b+ (n + (sum[x|(a,x)<-pathA])))--idem
						   newA |(forwardA<crossOverA) = ([('N',n)]++pathA)--kies het korste pad naar de nieuwe knoop aan de A kant
						  	|otherwise  = ([('B',b),('Z',z)]++pathB)
						   newB |(forwardB<crossOverB) =([('Z',z)]++pathB)
						  	|otherwise =([('B',b),('N',n)]++pathA)
						in zoekPaden xs (newA,newB) -- Doe de volgende stap

--Greet


--Data type voor Section
data Section a= Section Int Int Int


helpJan::[Section Int]->[([Char],Int)]
helpJan ((Section n z b):xs)|z<n = [("Z",z)] ++ (helpJan2 [("Z",z)] b 2 xs)
			    |otherwise = [("N",n)] ++ (helpJan2 [("N",n)] b 1 xs)

helpJan2::[([Char],Int)]->Int->Int->[Section Int]->[([Char],Int)]
helpJan2 xs b i [] = []
helpJan2 xs b1 i ((Section n z b2):ys) = if (and [(i==1),(n <= (b1+z))]) then [("N",n)] ++ (helpJan2 (xs++[("B",b1),("N",n)]) b2 1 ys)
					 else if (and [(i==1),(n > (b1+z))]) then [("B",b1),("Z",z)] ++ (helpJan2 (xs++[("B",b1),("Z",z)]) b2 2 ys)
					 else if (and [(i==2),(z <= (b1+n))]) then [("Z",z)] ++ (helpJan2 (xs++[("Z",z)]) b2 2 ys)
					 else [("B",b1),("N",n)] ++ (helpJan2 ([("B",b1),("N",n)]) b2 1 ys)

--eerste geval: je zit in noord en de kortste weg is verder via noord
--tweede geval: je zit in noord en de kortste weg is verder via zuid
--derde geval: je zit in zuid en de kortste weg is verder via zuid
--vierde geval: je zit in zuid en de kortste weg is verder via noord

--Lynn 17 jan 2011 10:35 (UTC)