Declaratieve Talen/oplossingAlternatieveOrdes

Uit Wina Examenwiki
Versie door Roald (overleg | bijdragen) op 13 jan 2010 om 19:55 (Nieuwe pagina aangemaakt met 'Een oplossing voor het eerste deel van de opgave. Het is een beetje Prolog-generate-and-test geïnspireerd. import List berekenorde::[String]->[String] berekenor…')
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Een oplossing voor het eerste deel van de opgave. Het is een beetje Prolog-generate-and-test geïnspireerd.

import List

berekenorde::[String]->[String]
berekenorde woorden = filter (correcteOrde paren) (permuteer letters)
	where 
		paren = woordenNaarParen woorden
		letters = findLettersWoorden woorden

woordenNaarParen::[String]->[(Char, Char)]
woordenNaarParen list = nub $ woordenNaarParen' list
woordenNaarParen' [] = []
woordenNaarParen' (w:t) =
	verwerkWoorden t w ++ woordenNaarParen t

verwerkWoord::String->String->Maybe (Char, Char)
verwerkWoord "" _ = Nothing
verwerkWoord _ "" = Nothing
verwerkWoord (c1:t1) (c2:t2)
	| c1 /= c2 = Just (c1,c2)
	| otherwise = verwerkWoord t1 t2

-- geef woord en zoek naar paren met behulp van andere woordenlijst
verwerkWoorden::[String]->String->[(Char, Char)]
verwerkWoorden woorden woord = 
	[ x | Just x <- map (verwerkWoord woord) woorden]	


-- alle letters van alle woorden
findLettersWoorden::[String]->[Char]
findLettersWoorden lijst = 
	nub $ concatenate lijst

correcteOrde::[(Char,Char)]->[Char]->Bool
correcteOrde [] letters = True
correcteOrde ((c1,c2):t) letters = 
	(elemIndex c1 letters) < (elemIndex c2 letters) && correcteOrde t letters

permuteer::[a]->a
permuteer [] = [[]]
permuteer (h:t) = concatMap (permIns h) (permuteer t)
permIns::a->[a]->a
permIns x [] = x
permIns x (h:t) = (x:h:t) : map (\l -> h:l) (permIns x t)

--Roald 13 jan 2010 19:55 (UTC)