From 8b73f20b8241ddd55084f71cc1dbba71126ccd89 Mon Sep 17 00:00:00 2001 From: zihang Date: Wed, 27 Nov 2024 15:24:51 +0800 Subject: [PATCH] doc: add sudoku and add visual warning --- .vscode/settings.json | 3 + next/imgs/sudoku.jpg | Bin 0 -> 65155 bytes next/tutorial/example/index.md | 8 + next/tutorial/example/sudoku/index.md | 396 ++++++++++++++++++++++++++ next/tutorial/index.md | 4 +- 5 files changed, 410 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 next/imgs/sudoku.jpg create mode 100644 next/tutorial/example/index.md create mode 100644 next/tutorial/example/sudoku/index.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..61feb6ed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.rulers": [ 80 ] +} \ No newline at end of file diff --git a/next/imgs/sudoku.jpg b/next/imgs/sudoku.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd4caefe563b34fd634711d112ef52aeed0a95c9 GIT binary patch literal 65155 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
v#OE+A; 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árlP-n!6BNbQv+kF8oOrhZCCo>!;S5Dn_eF+bZ_JwH9w9aF=q=c z#uS|w@oMeGlxL)fV_hA9!O?#>@ul?19DYc|G|6^BvfUS)sJw^nYz^wB2Yc9`)~tN$ zHY*RlI1E=ic>=rFIX#@5tvYN4v(E)1BQLk{j$Pu1!6zFFubg_L|DC8d_SUWX@RD

(KWpxGjzCgN4$ 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 0, A2 => 1 +fn square_to_int(s : String) -> Int { + if in(s[0], 'A', 'I') && in(s[1], '1', '9') { + let row = s[0].to_int() - 65 // 'A' <=> 0 + let col = s[1].to_int() - 49 // '1' <=> 0 + return row * 9 + col + } else { + abort("square_to_int(): \{s} is not a square") + } +} + +// Helper function `in` checks if a character is between `lw` and `up` +fn in(this : Char, lw : Char, up : Char) -> Bool { + this >= lw && this <= up +} +``` + +Then we wrap the array and provide operations for creating, accessing, assigning values to specific coordinates, and copying SquareMap[T]. By overloading the op_get and op_set methods, we can write convenient code like table["A2"] and table["C3"] = Nil. + +```rust +struct SquareMap[T] { + contents : Array[T] +} + +fn SquareMap::new[T](val : T) -> SquareMap[T] { + { contents : Array::make(81, val) } +} + +fn copy[T](self : SquareMap[T]) -> SquareMap[T] { + let arr = Array::make(81, self.contents[0]) + let mut i = 0 + while i < 81 { + arr[i] = self.contents[i] + i = i + 1 + } + return { contents : arr } +} + +fn op_get[T](self : SquareMap[T], square : String) -> T { + self.contents[square_to_int(square)] +} + +fn op_set[T](self : SquareMap[T], square : String, x : T) -> Unit { + self.contents[square_to_int(square)] = x +} +``` + +Next, we prepare some constants: + +```rust +let rows = "ABCDEFGHI" +let cols = "123456789" + +// squares contains the coordinates of each square +let squares : List[String] = ...... + +// units[coord] contains the other squares in the unit of the square at coord +// for example:units["A3"] => [C3, C2, C1, B3, B2, B1, A2, A1] +let units : SquareMap[List[String]] = ...... + +// peers[coord] contains all the peers of the square at coord +// for example:peers["A3"] => [A1, A2, A4, A5, A6, A7, A8, A9, B1, B2, B3, C1, C2, C3, D3, E3, F3, G3, H3, I3] +let peers : SquareMap[List[String]] = ...... +``` + +The process of constructing the units and peers tables is tedious, so it will not be detailed here. + +## Preprocessing the Grid + +We use a string to represent the initial Sudoku grid. Various formats are acceptable; both `.` and `0` represent empty squares, and other characters like spaces and newlines are ignored. + +``` +"4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......" + +" +400000805 +030000000 +000700000 +020000060 +000080400 +000010000 +000603070 +500200000 +104000000" +``` + +For now, let's not consider game rules too much. If we only consider the digits that can be filled in each square, then 1-9 are all possible. Therefore, we initially set the content of all squares to `['1', '2', '3', '4', '5', '6', '7', '8', '9']` (a List). + +```rust +fn parseGrid(s : String) -> SquareMap[List[Char]] { + let digits = cols.to_list() + let values : SquareMap[List[Char]] = SquareMap::new(digits) + ...... +} +``` + +Next, we need to assign values to the squares with known digits from the input. This process can be implemented with the function `assign(values, key, val)`, where `key` is a string like `A6` and `val` is a character. It is easy to write such code. + +```rust +fn assign(values : SquareMap[List[Char]], key : String, val : Char) { + values[key] = Cons(val, Nil) +} +``` + +Let's run it and see + +``` +"4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......" + +// Using parseGrid and printGrid functions, skipping implementation details for simplicity + + 4 123456789 123456789 | 123456789 123456789 123456789 | 8 123456789 5 + 123456789 3 123456789 | 123456789 123456789 123456789 | 123456789 123456789 123456789 + 123456789 123456789 123456789 | 7 123456789 123456789 | 123456789 123456789 123456789 +---------------------------------+---------------------------------+--------------------------------- + 123456789 2 123456789 | 123456789 123456789 123456789 | 123456789 6 123456789 + 123456789 123456789 123456789 | 123456789 8 123456789 | 4 123456789 123456789 + 123456789 123456789 123456789 | 123456789 1 123456789 | 123456789 123456789 123456789 +---------------------------------+---------------------------------+--------------------------------- + 123456789 123456789 123456789 | 6 123456789 3 | 123456789 7 123456789 + 5 123456789 123456789 | 2 123456789 123456789 | 123456789 123456789 123456789 + 1 123456789 4 | 123456789 123456789 123456789 | 123456789 123456789 123456789 +``` + +This implementation is simple and precise, but we can do more. + +Now, we can reintroduce the rules that we set aside earlier. However, the rules themselves do not tell us what to do. We need heuristic strategies to gain insights from the rules, similar to solving Sudoku with pen and paper. Let's start with the elimination method: + +- **Strategy 1**: If a square `key` is assigned a value `val`, then its peers (peers[key]) should not contain `val` in their lists of possible values, as this would violate the rule that no two squares in the same unit, row, or column can have the same digit. + +- **Strategy 2**: If there is only one square in a unit that can hold a specific digit (possibly happen after applying the above rule several times), then that digit should be assigned to that square. + +We adjust the code by defining an `eliminate` function, which removes a digit from the possible values of a square. After performing the elimination task, it applies the above strategies to `key` and `val` to attempt further eliminations. Note that it includes a boolean return value to handle possible contradictions. If the list of possible values for a square becomes empty, something went wrong, and we return `false`. + +```rust +fn eliminate(values : SquareMap[List[Char]], key : String, val : Char) -> Bool { + if not(exist(values[key], fn (v) { v == val })) { + return true + } + values[key] = values[key].remove(val) + // If `key` has only one possible value left, remove this value from its peers + match single(values[key]) { + Err(b) => { + if not(b) { + return false + } + } + Ok(val) => { + let mut result = true + peers[key].iter(fn (key) { + result = result && eliminate(values, key, val) + }) + if not(result) { + return false + } + } + } + // If there is only one square in the unit of `key` that can hold `val`, assign `val` to that square + let unit = units[key] + let places = unit.filter(fn (sq) { + exist(values[sq], fn (v) { v == val }) + }) + match single(places) { + Err(b) => { + return b + } + Ok(key) => { + return assign(values, key, val) + } + } +} + + +// Return `Err(false)` if the list is empty +// Return `Ok(x)` if the list contains only `[x]` +// Return `Err(true)` if the list contains `[x1, x2, ......]` +fn single[T](this : List[T]) -> Result[T, Bool] { + match this { + Nil => Err(false) + Cons(x, Nil) => Ok(x) + _ => Err(true) + } +} +``` + +Next, we define `assign(values, key, val)` to remove all values except `val` from the possible values of `key`. + +```rust +fn assign(values : SquareMap[List[Char]], key : String, val : Char) -> Bool { + let other_values = values[key].remove(val) + let mut result = true + other_values.iter(fn (val) { + result = result && eliminate(values, key, val) + }) + return result +} +``` + +These two functions apply heuristic strategies to each square they access. A successful heuristic application introduces new squares to consider, allowing these strategies to propagate widely across the grid. This is key to quickly eliminating invalid options. + +Let's try the example again + +``` +"4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......" + + 4 1679 12679 | 139 2369 269 | 8 1239 5 + 26789 3 1256789 | 14589 24569 245689 | 12679 1249 124679 + 2689 15689 125689 | 7 234569 245689 | 12369 12349 123469 +---------------------------+---------------------------+--------------------------- + 3789 2 15789 | 3459 34579 4579 | 13579 6 13789 + 3679 15679 15679 | 359 8 25679 | 4 12359 12379 + 36789 4 56789 | 359 1 25679 | 23579 23589 23789 +---------------------------+---------------------------+--------------------------- + 289 89 289 | 6 459 3 | 1259 7 12489 + 5 6789 3 | 2 479 1 | 69 489 4689 + 1 6789 4 | 589 579 5789 | 23569 23589 23689 +``` + +A significant improvement! In fact, this preprocessing can already solve some simple Sudoku puzzles. + +``` +"003020600900305001001806400008102900700000008006708200002609500800203009005010300" + + 4 8 3 | 9 2 1 | 6 5 7 + 9 6 7 | 3 4 5 | 8 2 1 + 2 5 1 | 8 7 6 | 4 9 3 +---------+---------+--------- + 5 4 8 | 1 3 2 | 9 7 6 + 7 2 9 | 5 6 4 | 1 3 8 + 1 3 6 | 7 9 8 | 2 4 5 +---------+---------+--------- + 3 7 2 | 6 8 9 | 5 1 4 + 8 1 4 | 2 5 3 | 7 6 9 + 6 9 5 | 4 1 7 | 3 8 2 +``` + +If you are interested in artificial intelligence, you might recognize this as a Constraint Satisfaction Problem (CSP), and `assign` and `eliminate` are specialized arc consistency algorithms. For more on this topic, refer to Chapter 6 of _Artificial Intelligence: A Modern Approach_. + +## Search + +After preprocessing, we can boldly use brute-force enumeration to search for all feasible combinations. However, we can still use the heuristic strategies during the search process. When trying to assign a value to a square, we still use `assign`, which allows us to apply previous optimizations to eliminate many invalid branches during the search. + +Another point to note is that conflicts may arise during the search (when a square's possible values are exhausted). Since mutable structures make backtracking troublesome, we directly copy values each time we assign a value. + +```rust +fn search(values : SquareMap[List[Char]]) -> Option[SquareMap[List[Char]]] { + if values.contains(fn (digits){ not(isSingleton(digits)) }) { + // // Find the square with the smallest number of possible values greater than 1, and start the search from this square + // This is just a heuristic strategy; you can try finding a smarter and more effective one + let mut minsq = "" + let mut n = 10 + squares.iter(fn (sq) { + let len = values[sq].length() + if len > 1 { + if len < n { + n = len + minsq = sq + } + } + }) + // Iterate through assignments and stop if a successful search is found + loop values[minsq] { + Nil => None + Cons(digit, rest) => { + let another = values.copy() + if assign(another, minsq, digit){ + match search(another) { + None => continue rest + Some(_) as result => result + } + } else { + continue rest + } + } + } + } else { + return Some(values) + } +} +``` + +Let's run the same example again (the example is actually taken from [magictour](http://magictour.free.fr/top95), a list of difficult Sudoku puzzles, which is not easy for humans) + +``` +> solve("4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......") + + 4 1 7 | 3 6 9 | 8 2 5 + 6 3 2 | 1 5 8 | 9 4 7 + 9 5 8 | 7 2 4 | 3 1 6 +---------+---------+--------- + 8 2 5 | 4 3 7 | 1 6 9 + 7 9 1 | 5 8 6 | 4 3 2 + 3 4 6 | 9 1 2 | 7 5 8 +---------+---------+--------- + 2 8 9 | 6 4 3 | 5 7 1 + 5 7 3 | 2 9 1 | 6 8 4 + 1 6 4 | 8 7 5 | 2 9 3 +``` + +Running on [MoonBit online IDE](https://try.moonbitlang.com/), It takes only about 0.11 seconds to solve this Sudoku! + +Complete code here: [try.moonbitlang.com/#6806c2fe](https://try.moonbitlang.com/#6806c2fe) + +## Conclusion + +The purpose of games is to relieve boredom and bring joy. If playing a game becomes more anxiety-inducing than exciting, it might go against the game designer's original intent. The article demonstrated that simple elimination methods and brute-force search can quickly solve some Sudoku puzzles. This does not mean that Sudoku is not worth playing; rather, it reveals that one should not be overly concerned with an unsolvable Sudoku puzzle. + +Let's play with MoonBit with ease! + +Visit MoonBit [Gallery](https://www.moonbitlang.com/gallery/sudoku/) to play with the Sudoku solver written in MoonBit. Click [this link](https://github.com/myfreess/sudoku) to view the full source code. + +This tutorial references Norvig's blog: [http://norvig.com/sudoku.html](http://norvig.com/sudoku.html) diff --git a/next/tutorial/index.md b/next/tutorial/index.md index 26940c7a..74b50752 100644 --- a/next/tutorial/index.md +++ b/next/tutorial/index.md @@ -3,8 +3,10 @@ Here are some tutorials that may help you learn the programming language: - [Tour for Beginners](./tour.md) +- [Examples](./example/index.md) ```{toctree} :maxdepth: 2 :caption: Contents: -tour \ No newline at end of file +tour +example/index \ No newline at end of file