Difference between revisions of "FP Test3 2025"
Jump to navigation
Jump to search
| Line 45: | Line 45: | ||
<translate> | <translate> | ||
| − | * Implement a function <code>findDrink | + | * Implement a function <code>findDrink</code> that finds a drink by name from a list. |
If the drink does not exist, raise an error <code>"No such drink"</code>. | If the drink does not exist, raise an error <code>"No such drink"</code>. | ||
</translate> | </translate> | ||
| − | <syntaxhighlight lang="Haskell"> | + | <syntaxhighlight lang="Haskell">findDrink :: [Drink] -> String -> Drink</syntaxhighlight> |
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
| − | + | ghci> findDrink drinksList "Tea" | |
| − | + | Drink {name = "Tea", price = 25, ingredients = ["water","water","tea"]} | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | <translate> | ||
| − | * | + | * Implement a function <code>inStock</code> that checks whether a given ingredient is currently available in stock. |
</translate> | </translate> | ||
| − | <syntaxhighlight lang="Haskell"> | + | <syntaxhighlight lang="Haskell">inStock :: Stock -> String -> Bool</syntaxhighlight> |
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
| − | + | ghci> inStock stockExample "milk" | |
| − | + | True | |
| − | + | ghci> inStock stockExample "juice" | |
| − | + | False | |
| − | |||
| − | |||
| − | |||
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | <translate> | ||
| − | * | + | * Implement a function <code>useIngredient</code> that decreases the quantity of a given ingredient by one unit. |
| + | Ingredients with zero quantity should be removed from the stock. | ||
</translate> | </translate> | ||
<syntaxhighlight lang="Haskell"> | <syntaxhighlight lang="Haskell"> | ||
| − | + | useIngredient :: Stock -> String -> Stock | |
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
| − | + | ghci> useIngredient stockExample "milk" | |
| − | + | [("water",10),("coffee",4),("milk",1),("tea",3),("sugar",5),("cocoa",1)] | |
| − | + | ghci> useIngredient stockExample "cocoa" | |
| − | + | [("water",10),("coffee",4),("milk",2),("tea",3),("sugar",5)] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | <translate> | ||
| − | * | + | * Implement a function <code>canServeDrink</code> that checks whether all ingredients required for a drink are available. |
</translate> | </translate> | ||
| − | <syntaxhighlight lang="Haskell"> | + | <syntaxhighlight lang="Haskell">canServeDrink :: Stock -> Drink -> Bool</syntaxhighlight> |
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
| − | ghci> | + | ghci> canServeDrink stockExample (findDrink drinksList "Cocoa") |
| − | + | True | |
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | <translate> | ||
| − | * | + | * Implement a function <code>serveDrink</code> that updates the stock after preparing a drink. |
| + | If some ingredient is missing, raise an error <code>"Can not serve this drink"</code>. | ||
</translate> | </translate> | ||
| − | <syntaxhighlight lang="Haskell"> | + | <syntaxhighlight lang="Haskell">serveDrink :: Stock -> Drink -> Stock</syntaxhighlight> |
<syntaxhighlight lang="Haskell" class="myDark"> | <syntaxhighlight lang="Haskell" class="myDark"> | ||
| − | ghci> | + | ghci> serveDrink stockExample (findDrink drinksList "Cocoa") |
| − | + | [("water",10),("coffee",4),("tea",3),("sugar",5)] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 07:23, 11 November 2025
Home Preparation For Test 3 - 2025
(Theme: Vending Machine)
Data types and examples
Let's have a data types representing the state of a vending machine:
- a type
Stockfor the available ingredients (name and quantity), - a type
Drinkwith the drink’s name, price, and list of required ingredients, - a type Machine that combines both stock and available drinks.
type Stock = [(String, Int)]
data Drink = Drink { name :: String , price :: Int , ingredients :: [String] } deriving Show
data Machine = Machine {stock :: Stock, drinks :: [Drink] } deriving Show
stockExample :: Stock
stockExample = [ ("water", 10) , ("coffee", 4) , ("milk", 2) , ("tea", 3) , ("sugar", 5) , ("cocoa", 1) ]
drinksList :: [Drink]
drinksList = [
Drink "Coffee" 30 ["water","coffee"],
Drink "StrongCoffee" 40 ["water","coffee","coffee"],
Drink "Tea" 25 ["water", "water","tea"],
Drink "Cappuccino" 45 ["water","coffee","milk"],
Drink "Latte" 50 ["water","coffee","milk","sugar"],
Drink "Chocolate" 50 ["water","cocoa","milk"],
Drink "Cocoa" 60 ["milk","cocoa","milk"]
]
machineExample :: Machine
machineExample = Machine stockExample drinksList
Tasks
Create functions that:
- Implement a function
findDrinkthat finds a drink by name from a list.
If the drink does not exist, raise an error "No such drink".
findDrink :: [Drink] -> String -> Drink
ghci> findDrink drinksList "Tea"
Drink {name = "Tea", price = 25, ingredients = ["water","water","tea"]}
- Implement a function
inStockthat checks whether a given ingredient is currently available in stock.
inStock :: Stock -> String -> Bool
ghci> inStock stockExample "milk"
True
ghci> inStock stockExample "juice"
False
- Implement a function
useIngredientthat decreases the quantity of a given ingredient by one unit.
Ingredients with zero quantity should be removed from the stock.
useIngredient :: Stock -> String -> Stock
ghci> useIngredient stockExample "milk"
[("water",10),("coffee",4),("milk",1),("tea",3),("sugar",5),("cocoa",1)]
ghci> useIngredient stockExample "cocoa"
[("water",10),("coffee",4),("milk",2),("tea",3),("sugar",5)]
- Implement a function
canServeDrinkthat checks whether all ingredients required for a drink are available.
canServeDrink :: Stock -> Drink -> Bool
ghci> canServeDrink stockExample (findDrink drinksList "Cocoa")
True
- Implement a function
serveDrinkthat updates the stock after preparing a drink.
If some ingredient is missing, raise an error "Can not serve this drink".
serveDrink :: Stock -> Drink -> Stock
ghci> serveDrink stockExample (findDrink drinksList "Cocoa")
[("water",10),("coffee",4),("tea",3),("sugar",5)]
- Using the same coordinates as for the functions above, define a function
getPartthat takes a maze and extracts a rectangular part of this maze. The maze is given as first parameter. The extracted part is defined by the position of the top left corner (second parameter) and its size (third parameter, given as (height, width)).
getPart :: Maze -> (Int,Int) -> (Int,Int) -> Maze
ghci> printMaze(getPart sample1 (1,1) (7,7))
* *
* * *
* * *
*
******
*******
- Implement the function
solveMaze. It has 1 argument. It is a list of strings representing a maze row by row from top to bottom ('*' - wall, ' ' - empty square, 's' - starting position, 'e' - ending possition). At the beginning we are at position 's' and we want to get the length of the shortest path to the position denotated by 'e'. Such path compose from steps. in each step we can move one square left, right, up or down. The function returns a number of these steps in the shortest path from 's' to 'e'.
solveMaze :: Result -> Int
solveMaze sample4
12