Created
April 1, 2017 14:13
-
-
Save chambart/15b18770d2368cc703a32f18fe12d179 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ocaml | |
(* run "./EzSudoku n" to generate template .ml file to fill with your n^2*n^2 sudoku problem | |
You probably shouldn't put anything bigger than 3. Or 2 in fact... *) | |
let size = | |
try int_of_string Sys.argv.(1) with | |
| _ -> 2 | |
let sq_size = size * size | |
let name i = Char.chr (i + Char.code 'a') | |
let name2 i = | |
if sq_size * sq_size > 26 then | |
let s = Printf.sprintf "%c%c" (name (i / 26)) (name (i mod 26)) in | |
match s with | |
| "as" -> "as_" | |
| s -> s | |
else | |
Printf.sprintf "%c" (name i) | |
let () = | |
for i = 1 to sq_size do | |
Format.printf "type r%i@." i; | |
Format.printf "type c%i@." i; | |
Format.printf "type s%i@.@." i | |
done | |
let () = Format.printf "type ('row, 'column, 'square) position@." | |
let print_position n = | |
Format.printf "\ | |
type %s = (r%i, c%i, s%i) position\ | |
@." | |
(name2 n) | |
(1 + n mod sq_size) | |
(1 + n / sq_size) | |
(1 + n mod size + ((n / sq_size) mod size) * size) | |
let () = | |
Format.printf "@."; | |
for i = 0 to sq_size * sq_size - 1 do | |
print_position i | |
done; | |
Format.printf "@." | |
let fields ppf () = | |
for i = 0 to sq_size - 1 do | |
Format.fprintf ppf "@ %c : '%c;" (name i) (name i) | |
done | |
let const name = | |
Format.printf "@[<hov 2>type 'fields %s constraint 'fields =@ @[<hov 2><%a >@]@]@." | |
name fields () | |
let () = | |
const "row "; | |
const "column"; | |
const "square"; | |
Format.printf "@." | |
let () = | |
Format.printf "type ('position, 'row, 'column, 'square) symbol =@." | |
let symb n = | |
Printf.printf " \ | |
| %c : (('r, 'c, 's) position,\n \ | |
< %c : 'r; .. > row,\n \ | |
< %c : 'c; .. > column,\n \ | |
< %c : 's; .. > square)\n \ | |
symbol\n\n%!" | |
(Char.uppercase_ascii (name n)) | |
(name n) | |
(name n) | |
(name n) | |
let () = | |
for i = 0 to sq_size - 1 do | |
symb i | |
done; | |
Format.printf "@." | |
let field i = | |
Format.printf | |
" (%s, 'row%i, 'column%i, 'square%i) symbol%s@." | |
(name2 i) | |
(1 + i / sq_size) | |
(1 + i mod sq_size) | |
(1 + (i / size) mod size | |
+ size * (i / (size * sq_size))) | |
(if i = sq_size * sq_size - 1 then "" else " *"); | |
if ((i+1) mod sq_size) = 0 then Format.printf "@." | |
let () = | |
Format.printf "type grid =@. Grid :@."; | |
for i = 0 to sq_size * sq_size - 1 do | |
field i | |
done; | |
Format.printf " -> grid@." | |
let empty_grid ppf () = | |
for i = 1 to size do | |
for j = 1 to size do | |
Format.fprintf ppf " "; | |
for k = 1 to size do | |
for l = 1 to size do | |
Format.fprintf ppf "_"; | |
if (i <> size) || (j <> size) || (k <> size) || (l <> size) then | |
Format.fprintf ppf ", "; | |
() | |
done; | |
Format.fprintf ppf " " | |
done; | |
Format.fprintf ppf "@." | |
done; | |
Format.fprintf ppf "@." | |
done | |
let () = | |
Format.printf "@.(* Fill this grid with your problem *)@."; | |
Format.printf "let g x =@. match x with@. | Grid (@.%a ) -> .@. | _ -> ()@." | |
empty_grid () |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment