Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- data Entry = Entry (String, String)
- class Lexico a where
- (<!), (=!), (>!) :: a -> a -> Bool
- instance Lexico Entry where
- Entry (a,_) <! Entry (b,_) = a < b
- Entry (a,_) =! Entry (b,_) = a == b
- Entry (a,_) >! Entry (b,_) = a > b
- entries :: [(String, String)]
- entries = [("saves", "en vaut"), ("time", "temps"), ("in", "<`a>"),
- ("{", "{"), ("A", "Un"), ("}", "}"), ("stitch", "point"),
- ("nine.", "cent."), ("Zazie", "Zazie")]
- build :: (String, String) -> Entry
- build (a, b) = Entry (a, b)
- diction :: [Entry]
- diction = quiksrt (map build entries)
- size :: [a] -> Integer
- size [] = 0
- size (x:xs) = 1+ size xs
- quiksrt :: Lexico a => [a] -> [a]
- quiksrt [] = []
- quiksrt (x:xs)
- |(size [y|y <- xs, y =! x]) > 0 = error "Duplicates not allowed."
- |otherwise = quiksrt [y|y <- xs, y <! x]++ [x] ++ quiksrt [y|y <- xs, y >! x]
- english :: String
- english = "A stitch in time save nine."
- show :: Entry -> String
- show (Entry (a, b)) = "(" ++ Prelude.show a ++ ", " ++ Prelude.show b ++ ")"
- showAll :: [Entry] -> String
- showAll [] = []
- showAll (x:xs) = Main.show x ++ "n" ++ showAll xs
- main :: IO ()
- main = do putStr (showAll ( diction ))
- function binsearch (x : integer) : integer
- local j, k, h : integer
- j,k := 1,n
- do j+1 <> k --->
- h := (j+k) div 2
- {a[j] <= x < a[k]} // loop invariant
- if x < a[h] ---> k := h
- | x >= a[h] ---> j := h
- fi
- od
- {a[j] <= x < a[j+1]} // termination assertion
- found := x = a[j]
- if found ---> return j
- | not found ---> return 0
- fi
- binsearch :: String -> Integer -> Integer -> Entry
- *Main> map bs (words english)
- [Entry ("A","Un"),Entry ("stitch","point"),Entry ("in","<`a>"),Entry ("time","te
- mps"),*** Exception: Not found
- *Main> map bs (words englishFixed)
- [Entry ("A","Un"),Entry ("stitch","point"),Entry ("in","<`a>"),Entry ("time","te
- mps"),Entry ("saves","en vaut"),Entry ("nine.","cent.")]
- *Main>
- (!!) :: [a] -> Integer -> a
- -- xs!!n returns the nth element of xs, starting at the left and
- -- counting from 0.
- module Main where
- class Lex a where
- (<!), (=!), (>!) :: a -> a -> Bool
- data Entry = Entry String String
- instance Lex Entry where
- (Entry a _) <! (Entry b _) = a < b
- (Entry a _) =! (Entry b _) = a == b
- (Entry a _) >! (Entry b _) = a > b
- -- at this point, three binary (infix) operators on values of type 'Entry'
- -- have been defined
- type Raw = (String, String)
- raw_data :: [Raw]
- raw_data = [("than a", "qu'un"), ("saves", "en vaut"), ("time", "temps"),
- ("in", "<`a>"), ("worse", "pire"), ("{", "{"), ("A", "Un"),
- ("}", "}"), ("stitch", "point"), ("crime;", "crime,"),
- ("a", "une"), ("nine.", "cent."), ("It's", "C'est"),
- ("Zazie", "Zazie"), ("cat", "chat"), ("it's", "c'est"),
- ("raisin", "raisin sec"), ("mistake.", "faute."),
- ("blueberry", "myrtille"), ("luck", "chance"),
- ("bad", "mauvais")]
- cook :: Raw -> Entry
- cook (x, y) = Entry x y
- a :: [Entry]
- a = map cook raw_data
- quicksort :: Lex a => [a] -> [a]
- quicksort [] = []
- quicksort (x:xs) = quicksort (filter (<! x) xs) ++ [x] ++ quicksort (filter (=! x) xs) ++ quicksort (filter (>! x) xs)
- getfirst :: Entry -> String
- getfirst (Entry x y) = x
- getsecond :: Entry -> String
- getsecond (Entry x y) = y
- binarysearch :: String -> [Entry] -> Int -> Int -> String
- binarysearch s e low high
- | low > high = " NOT fOUND "
- | getfirst ((e)!!(mid)) > s = binarysearch s (e) low (mid-1)
- | getfirst ((e)!!(mid)) < s = binarysearch s (e) (mid+1) high
- | otherwise = getsecond ((e)!!(mid))
- where mid = (div (low+high) 2)
- translator :: [String] -> [Entry] -> [String]
- translator [] y = []
- translator (x:xs) y = (binarysearch x y 0 ((length y)-1):translator xs y)
- english :: String
- english = "A stitch in time saves nine."
- compute :: String -> [Entry] -> String
- compute x y = unwords(translator (words (x)) y)
- main = do
- putStr (compute english (quicksort a))
Add Comment
Please, Sign In to add comment