Warning! It seems that you are using Dodona within another webpage, so not everything may work properly. Let your teacher know so that he can solve the problem by adjusting a setting in the learning environment. In the meantime, you can click this link to open Dodona in a new window.
Warning! The page was not fully loaded, probably because of a network issue. It could be that not all functionalities work as expected. Please try reloading the page.
Haskell exercise
Sudoku puzzel
Sign in to hand in your solution and get feedback.
{-|
Een sudoku wordt voorgesteld door een tweedimensionaal rooster van getallen.
We gebruiken geneste lijsten "row-first", zoals in onderstaande tekening.
o---0-1-2--3-4-5--6-7-8-----> x
|
0| [[0,0,0|,0,0,0,|0,0,0],
1| [0,0,0|,0,0,0,|0,0,0],
2| [0,0,0|,0,0,0,|0,0,0],
| ------+-------+------
3| [0,0,0|,0,0,0,|0,0,0],
4| [0,0,0|,0,0,0,|0,0,0],
5| [0,0,0|,0,0,0,|0,0,0],
| ------+-------+------
6| [0,0,0|,0,0,0,|0,0,0],
7| [0,0,0|,0,0,0,|0,0,0],
8| [0,0,0|,0,0,0,|0,0,0]]
|
V
y
-}
type Board = [[Int]]
-- Enkele type-synoniemen
type Row = [Int] -- ^ Een rij in een sudoku.
type Col = [Int] -- ^ Een kolom in een sudoku.
type X = Int -- ^ De x van een coördinaat.
type Y = Int -- ^ De y van een coördinaat.
-- Enkele constanten
empty, width, height :: Int
empty = 0 -- ^ Een leeg vakje.
width = 9 -- ^ De breedte van een sudoku.
height = 9 -- ^ De hoogte van een sudoku.
-- | Een lege rij.
emptyRow :: Row
emptyRow = undefined
-- | Een leeg bord.
emptyBoard :: Board
emptyBoard = undefined
-- | Neem een rij uit een sudoku.
getRow :: Board -> Y -> Row
getRow = undefined
-- | Neem een kolom uit een sudoku.
getCol :: Board -> X -> Col
getCol = undefined
-- | Controleert of een gegeven getal voorkomt in een gegeven rij.
contains :: Int -> [Int] -> Bool
contains = undefined
-- | Bereken een deellijst.
getSubList :: Int -- ^ Start-index (inclusief).
-> Int -- ^ Eind-index (inclusief).
-> [a] -- ^ Volledige lijst.
-> [a] -- ^ Deellijst.
getSubList = undefined
{-
Met de volgende drie functies zullen we kijken of een vierkantje van 3 op 3
een gegeven getal bevat. We omschrijven het vierkantje door 1 van zijn 9
coördinaten in het volledige rooster. Gegeven bijvoorbeeld coördinaat (1,1)
zoeken we in het vierkantje linksboven, met grenzen (0:2, 0:2). Coördinaat (7, 4) wijst van weer op
het vierkantje links in het midden (6:8, 3:5).
De indexmethode zal deze grenzen teruggeven, maar in 1 as tegelijk:
- index 1 = (0, 2)
- index 7 = (6, 8)
- index 4 = (3, 5)
-}
-- | De grenzen van het vierkantje waar gegeven getal in ligt (in 1 as).
index :: Int -> (Int, Int)
index = undefined
-- | De lijst van getallen die in het vierkantje van gegeven coördinaat liggen.
-- Hint: gebruik tweemaal `getSubList`.
getSubSquare :: Board -> X -> Y -> [Int]
getSubSquare = undefined
-- | Of in een rooster een getal in het vierkantje van gegeven coördinaten ligt.
containedInSquare :: Board -> Int -> X -> Y -> Bool
containedInSquare = undefined
-- | Of in een rooster een getal op gegeven coördinaat past. Dit is het geval
-- als de omvattende rij, kolom of vakje van die coördinaat dat getal nog niet
-- bevatten.
canPlaceNumber :: Board -> Int -> X -> Y -> Bool
canPlaceNumber = undefined
-- | Vervangt het element op gegeven coördinaat door het gegeven element.
replace :: a -> Int -> [a] -> [a]
replace = undefined
-- | Vervangt het element op gegeven coördinaat door het gegeven element.
update :: Int -> X -> Y -> Board -> Board
update = undefined
-- | De eerste (in leesvolgorde) lege coördinaat in een bord.
findFirstEmpty :: Board -> (X, Y)
findFirstEmpty = undefined
-- | Of dit bord geen lege vakjes meer bevat.
noneEmpty :: Board -> Bool
noneEmpty = undefined
-- | De lijst van getallen die past op een locatie op een bord.
options :: Board -> X -> Y -> [Int]
options = undefined
-- | De lijst van mogelijke borden die 1 vakje verder ingevuld zijn.
nextBoards :: Board -> [Board]
nextBoards = undefined
-- | Los een sudoku-puzzel op.
solve :: Board -- ^ De focus, de huidige oplossing.
-> [Board] -- ^ De borden die we nog verder kunnen uitwerken.
-> Board -- ^ De opgeloste sudoku.
solve = undefined