June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
108
Task/Sudoku/Ada/sudoku.ada
Normal file
108
Task/Sudoku/Ada/sudoku.ada
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
with Ada.Text_IO;
|
||||
|
||||
procedure Sudoku is
|
||||
type sudoku_ar_t is array ( integer range 0..80 ) of integer range 0..9;
|
||||
FINISH_EXCEPTION : exception;
|
||||
|
||||
procedure prettyprint(sudoku_ar: sudoku_ar_t);
|
||||
function checkValidity( val : integer; x : integer; y : integer; sudoku_ar: in sudoku_ar_t) return Boolean;
|
||||
procedure placeNumber(pos: Integer; sudoku_ar: in out sudoku_ar_t);
|
||||
procedure solve(sudoku_ar: in out sudoku_ar_t);
|
||||
|
||||
|
||||
function checkValidity( val : integer; x : integer; y : integer; sudoku_ar: in sudoku_ar_t) return Boolean
|
||||
is
|
||||
begin
|
||||
for i in 0..8 loop
|
||||
|
||||
if ( sudoku_ar( y * 9 + i ) = val or sudoku_ar( i * 9 + x ) = val ) then
|
||||
return False;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
declare
|
||||
startX : constant integer := ( x / 3 ) * 3;
|
||||
startY : constant integer := ( y / 3 ) * 3;
|
||||
begin
|
||||
for i in startY..startY+2 loop
|
||||
for j in startX..startX+2 loop
|
||||
if ( sudoku_ar( i * 9 +j ) = val ) then
|
||||
return False;
|
||||
end if;
|
||||
end loop;
|
||||
end loop;
|
||||
return True;
|
||||
end;
|
||||
end checkValidity;
|
||||
|
||||
|
||||
|
||||
procedure placeNumber(pos: Integer; sudoku_ar: in out sudoku_ar_t)
|
||||
is
|
||||
begin
|
||||
if ( pos = 81 ) then
|
||||
raise FINISH_EXCEPTION;
|
||||
end if;
|
||||
if ( sudoku_ar(pos) > 0 ) then
|
||||
placeNumber(pos+1, sudoku_ar);
|
||||
return;
|
||||
end if;
|
||||
for n in 1..9 loop
|
||||
if( checkValidity( n, pos mod 9, pos / 9 , sudoku_ar ) ) then
|
||||
sudoku_ar(pos) := n;
|
||||
placeNumber(pos + 1, sudoku_ar );
|
||||
sudoku_ar(pos) := 0;
|
||||
end if;
|
||||
end loop;
|
||||
end placeNumber;
|
||||
|
||||
|
||||
procedure solve(sudoku_ar: in out sudoku_ar_t)
|
||||
is
|
||||
begin
|
||||
placeNumber( 0, sudoku_ar );
|
||||
Ada.Text_IO.Put_Line("Unresolvable !");
|
||||
exception
|
||||
when FINISH_EXCEPTION =>
|
||||
Ada.Text_IO.Put_Line("Finished !");
|
||||
prettyprint(sudoku_ar);
|
||||
end solve;
|
||||
|
||||
|
||||
|
||||
|
||||
procedure prettyprint(sudoku_ar: sudoku_ar_t)
|
||||
is
|
||||
line_sep : constant String := "------+------+------";
|
||||
begin
|
||||
for i in sudoku_ar'Range loop
|
||||
Ada.Text_IO.Put(sudoku_ar(i)'Image);
|
||||
if (i+1) mod 3 = 0 and not((i+1) mod 9 = 0) then
|
||||
Ada.Text_IO.Put("|");
|
||||
end if;
|
||||
if (i+1) mod 9 = 0 then
|
||||
Ada.Text_IO.Put_Line("");
|
||||
end if;
|
||||
if (i+1) mod 27 = 0 then
|
||||
Ada.Text_IO.Put_Line(line_sep);
|
||||
end if;
|
||||
end loop;
|
||||
end prettyprint;
|
||||
|
||||
|
||||
sudoku_ar : sudoku_ar_t :=
|
||||
(
|
||||
8,5,0,0,0,2,4,0,0,
|
||||
7,2,0,0,0,0,0,0,9,
|
||||
0,0,4,0,0,0,0,0,0,
|
||||
0,0,0,1,0,7,0,0,2,
|
||||
3,0,5,0,0,0,9,0,0,
|
||||
0,4,0,0,0,0,0,0,0,
|
||||
0,0,0,0,8,0,0,7,0,
|
||||
0,1,7,0,0,0,0,0,0,
|
||||
0,0,0,0,3,6,0,4,0
|
||||
);
|
||||
|
||||
begin
|
||||
solve( sudoku_ar );
|
||||
end Sudoku;
|
||||
84
Task/Sudoku/Kotlin/sudoku.kotlin
Normal file
84
Task/Sudoku/Kotlin/sudoku.kotlin
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
// version 1.2.10
|
||||
|
||||
class Sudoku(rows: List<String>) {
|
||||
private val grid = IntArray(81)
|
||||
private var solved = false
|
||||
|
||||
init {
|
||||
require(rows.size == 9 && rows.all { it.length == 9 }) {
|
||||
"Grid must be 9 x 9"
|
||||
}
|
||||
for (i in 0..8) {
|
||||
for (j in 0..8 ) grid[9 * i + j] = rows[i][j] - '0'
|
||||
}
|
||||
}
|
||||
|
||||
fun solve() {
|
||||
println("Starting grid:\n\n$this")
|
||||
placeNumber(0)
|
||||
println(if (solved) "Solution:\n\n$this" else "Unsolvable!")
|
||||
}
|
||||
|
||||
private fun placeNumber(pos: Int) {
|
||||
if (solved) return
|
||||
if (pos == 81) {
|
||||
solved = true
|
||||
return
|
||||
}
|
||||
if (grid[pos] > 0) {
|
||||
placeNumber(pos + 1)
|
||||
return
|
||||
}
|
||||
for (n in 1..9) {
|
||||
if (checkValidity(n, pos % 9, pos / 9)) {
|
||||
grid[pos] = n
|
||||
placeNumber(pos + 1)
|
||||
if (solved) return
|
||||
grid[pos] = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkValidity(v: Int, x: Int, y: Int): Boolean {
|
||||
for (i in 0..8) {
|
||||
if (grid[y * 9 + i] == v || grid[i * 9 + x] == v) return false
|
||||
}
|
||||
val startX = (x / 3) * 3
|
||||
val startY = (y / 3) * 3
|
||||
for (i in startY until startY + 3) {
|
||||
for (j in startX until startX + 3) {
|
||||
if (grid[i * 9 + j] == v) return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
val sb = StringBuilder()
|
||||
for (i in 0..8) {
|
||||
for (j in 0..8) {
|
||||
sb.append(grid[i * 9 + j])
|
||||
sb.append(" ")
|
||||
if (j == 2 || j == 5) sb.append("| ")
|
||||
}
|
||||
sb.append("\n")
|
||||
if (i == 2 || i == 5) sb.append("------+-------+------\n")
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val rows = listOf(
|
||||
"850002400",
|
||||
"720000009",
|
||||
"004000000",
|
||||
"000107002",
|
||||
"305000900",
|
||||
"040000000",
|
||||
"000080070",
|
||||
"017000000",
|
||||
"000036040"
|
||||
)
|
||||
Sudoku(rows).solve()
|
||||
}
|
||||
101
Task/Sudoku/Stata/sudoku-1.stata
Normal file
101
Task/Sudoku/Stata/sudoku-1.stata
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
mata
|
||||
function sudoku(a) {
|
||||
s = J(81,20,.)
|
||||
t = J(81,3,.)
|
||||
v = J(81,9,1)
|
||||
w = J(81,1,0)
|
||||
for (i=1; i<=9; i++) {
|
||||
for (j=1; j<=9; j++) {
|
||||
n = (i-1)*9+j
|
||||
k = floor((i-1)/3)*3+floor((j-1)/3)+1
|
||||
t[n,.] = i,j,k
|
||||
}
|
||||
}
|
||||
for (i=1; i<=81; i++) {
|
||||
for (j=i+1; j<=81; j++) {
|
||||
if (any(t[i,.]:==t[j,.])) {
|
||||
w[i]=w[i]+1
|
||||
w[j]=w[j]+1
|
||||
s[i,w[i]] = j
|
||||
s[j,w[j]] = i
|
||||
}
|
||||
}
|
||||
}
|
||||
w = J(81,1,1)
|
||||
for (i=1; i<=9; i++) {
|
||||
for (j=1; j<=9; j++) {
|
||||
if (a[i,j]<.) {
|
||||
push(a,s,t,v,w,(i-1)*9+j,a[i,j])
|
||||
}
|
||||
}
|
||||
}
|
||||
return(solve(a,s,t,v,w))
|
||||
}
|
||||
|
||||
function solve(a,s,t,v,w) {
|
||||
for (q=1; q;) {
|
||||
q = 0
|
||||
for (n=1; n<=81; n++) {
|
||||
if (w[n]) {
|
||||
r = sum(v[n,.])
|
||||
if (r==0) {
|
||||
return(0)
|
||||
}
|
||||
else if (r==1) {
|
||||
q = 1
|
||||
push(a,s,t,v,w,n,selectindex(v[n,.]))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (all(w:==0)) {
|
||||
return(1)
|
||||
}
|
||||
else {
|
||||
m0 = n0 = .
|
||||
for (n=1; n<=81; n++) {
|
||||
m = sum(v[n,.])
|
||||
if (w[n] & m>1 & m<m0) {
|
||||
m0 = m
|
||||
n0 = n
|
||||
}
|
||||
}
|
||||
z = selectindex(v[n0,.])
|
||||
for (i=1; i<=m0; i++) {
|
||||
a2 = a
|
||||
v2 = v
|
||||
w2 = w
|
||||
push(a2,s,t,v2,w2,n0,z[i])
|
||||
if (solve(a2,s,t,v2,w2)) {
|
||||
a = a2
|
||||
return(1)
|
||||
}
|
||||
}
|
||||
return(0)
|
||||
}
|
||||
}
|
||||
|
||||
function push(a,s,t,v,w,n,z) {
|
||||
w[n] = 0
|
||||
i = t[n,1]
|
||||
j = t[n,2]
|
||||
a[i,j] = z
|
||||
for (k=1; k<=20; k++) {
|
||||
v[s[n,k],z] = 0
|
||||
}
|
||||
}
|
||||
|
||||
a = 5,3,.,.,7,.,.,.,.\
|
||||
6,.,.,1,9,5,.,.,.\
|
||||
.,9,8,.,.,.,.,6,.\
|
||||
8,.,.,.,6,.,.,.,3\
|
||||
4,.,.,8,.,3,.,.,1\
|
||||
7,.,.,.,2,.,.,.,6\
|
||||
.,6,.,.,.,.,2,8,.\
|
||||
.,.,.,4,1,9,.,.,5\
|
||||
.,.,.,.,8,.,.,7,9
|
||||
|
||||
sudoku(a)
|
||||
a
|
||||
end
|
||||
53
Task/Sudoku/Stata/sudoku-2.stata
Normal file
53
Task/Sudoku/Stata/sudoku-2.stata
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
a = 7,9,.,.,.,3,.,.,2\
|
||||
.,6,.,5,1,.,.,.,.\
|
||||
.,.,.,.,.,2,.,.,6\
|
||||
.,.,.,8,.,1,.,4,.\
|
||||
.,.,.,.,.,.,1,.,3\
|
||||
5,.,.,.,2,.,.,.,.\
|
||||
.,.,.,.,.,.,.,7,4\
|
||||
.,.,1,.,.,.,.,6,5\
|
||||
.,.,8,.,9,7,.,.,.
|
||||
|
||||
sudoku(a)
|
||||
a
|
||||
|
||||
|
||||
1 2 3 4 5 6 7 8 9
|
||||
+-------------------------------------+
|
||||
1 | 7 9 5 6 8 3 4 1 2 |
|
||||
2 | 2 6 4 5 1 9 7 3 8 |
|
||||
3 | 1 8 3 7 4 2 5 9 6 |
|
||||
4 | 9 3 6 8 5 1 2 4 7 |
|
||||
5 | 8 4 2 9 7 6 1 5 3 |
|
||||
6 | 5 1 7 3 2 4 6 8 9 |
|
||||
7 | 3 2 9 1 6 5 8 7 4 |
|
||||
8 | 4 7 1 2 3 8 9 6 5 |
|
||||
9 | 6 5 8 4 9 7 3 2 1 |
|
||||
+-------------------------------------+
|
||||
|
||||
a = .,.,4,1,.,.,.,.,9\
|
||||
.,9,.,.,8,.,.,6,.\
|
||||
6,.,.,.,.,3,7,.,.\
|
||||
5,.,.,.,.,2,8,.,.\
|
||||
.,4,.,.,3,.,.,2,.\
|
||||
.,.,1,8,.,.,.,.,5\
|
||||
.,.,2,5,.,.,.,.,3\
|
||||
.,8,.,.,7,.,.,1,.\
|
||||
7,.,.,.,.,1,4,.,.
|
||||
|
||||
sudoku(a)
|
||||
a
|
||||
|
||||
|
||||
1 2 3 4 5 6 7 8 9
|
||||
+-------------------------------------+
|
||||
1 | 2 7 4 1 5 6 3 8 9 |
|
||||
2 | 1 9 3 7 8 4 5 6 2 |
|
||||
3 | 6 5 8 2 9 3 7 4 1 |
|
||||
4 | 5 3 7 6 1 2 8 9 4 |
|
||||
5 | 8 4 6 9 3 5 1 2 7 |
|
||||
6 | 9 2 1 8 4 7 6 3 5 |
|
||||
7 | 4 1 2 5 6 8 9 7 3 |
|
||||
8 | 3 8 5 4 7 9 2 1 6 |
|
||||
9 | 7 6 9 3 2 1 4 5 8 |
|
||||
+-------------------------------------+
|
||||
Loading…
Add table
Add a link
Reference in a new issue