package knights_tour

  1. Overview
  2. Docs
Solves the 'Knights Tour' and various 'Poyomino' puzzles

Install

dune-project
 Dependency

Authors

Maintainers

Sources

knights_tour-0.0.6.tbz
sha256=770624ae4e35d5a58188a1f25e16730d186df8bc4397827fe9a798ea5ca574e3
sha512=b6c7b2473ddf321afaac6b668f9c6820fb8cc872abc494b69edfdff4101c6b660645837b04801e2917c38dd9f19f79bb0a7b029d59a58ddf1e3a235659bab099

doc/src/knights_tour.collections/clist.ml.html

Source file clist.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
type 'a t = int * 'a list

let empty = (0, [])

let size (sz,_) = sz

let is_empty l = size l = 0

let%expect_test "empty" =
  Printf.printf "size = %d\n" (size empty);
  Printf.printf "is_empty = %B\n" (is_empty empty);
  [%expect{|
    size = 0
    is_empty = true |}]

let singleton x = (1, [x])

let rec take n ~taken ~remaining =
  if n>0 then 
    take (n-1) ~taken:((List.hd remaining)::taken) ~remaining:(List.tl remaining)
  else if n=0 then
    (List.rev taken, remaining)
  else
    raise (Failure "Can't take a negative number of elements from a list")

let to_string str (c,xs) = string_of_int c ^ "[" ^ Util.with_separator str ", " xs ^ "]"

let println msg it = Printf.printf "%s = %s\n" msg (to_string string_of_int it)

let of_list xs = (List.length xs, xs)

let%expect_test "take n" =
    let it = [1;2;3;4;5] in
    let (taken, remaining) = take 2 ~taken:[] ~remaining:it in
    println "taken" (of_list taken);
    println "remaining" (of_list remaining);
    [%expect{|
      taken = 2[1, 2]
      remaining = 3[3, 4, 5] |}]

let split_n n (sz,xs) = 
  take n ~remaining:xs ~taken:[]
  |> fun (lt,rt) -> ((n, lt), (sz-n, rt))
  
let%expect_test "split n" =
  let it = of_list [1;2;3;4;5] in
  println "it" it;
  let (f,b) = split_n 2 it in
  println "f" f;
  println "b" b;
  [%expect{|
    it = 5[1, 2, 3, 4, 5]
    f = 2[1, 2]
    b = 3[3, 4, 5] |}]

let split xs = 
  let n = (size xs) / 2 in
  split_n n xs

let%expect_test "split" =
  let do_test it = (
    let it = of_list it in
    Printf.printf "--- %s\n" (to_string string_of_int it);
    let (f, b) = split it in
    println "f" f;
    println "b" b
  ) in
  do_test [1;2;3;4;5];
  do_test [1;2;3;4];
  do_test [];
  do_test [1];
  [%expect{|
    --- 5[1, 2, 3, 4, 5]
    f = 2[1, 2]
    b = 3[3, 4, 5]
    --- 4[1, 2, 3, 4]
    f = 2[1, 2]
    b = 2[3, 4]
    --- 0[]
    f = 0[]
    b = 0[]
    --- 1[1]
    f = 0[]
    b = 1[1] |}]

let append (sx,x) (sy,y) = (sx+sy, List.append x y)
let reverse (s,x) = (s, List.rev x)

let hd (_,ls) = List.hd ls
let tl (s, ls) = (s-1, List.tl ls)

let map f (sz, ls) = (sz, List.map f ls)

let cons x (sz, xs) = (sz+1, x::xs)

let (++) = append

let to_list (_,xs) = xs

let%expect_test "of_list" =
  println "empty" (of_list []);
  println "single" (of_list [42]);
  println "several" (of_list [11;12;13]);
  [%expect{|
    empty = 0[]
    single = 1[42]
    several = 3[11, 12, 13] |}]

let%expect_test "append" =
  println "empty" (append empty empty);
  println "single l" (append (singleton 42) empty);
  println "single r" (append empty (singleton 42));
  println "double" (append (singleton 42) (singleton 43));
  println "general" (append (of_list [1;2;3]) (of_list [4;5;6]));
  [%expect{|
    empty = 0[]
    single l = 1[42]
    single r = 1[42]
    double = 2[42, 43]
    general = 6[1, 2, 3, 4, 5, 6] |}]

let%expect_test "singleton" =
  let it = singleton 42 in
  Printf.printf "it = %s\n" (to_string string_of_int it);
  Printf.printf "size = %d\n" (size it);
  Printf.printf "is_empty = %B\n" (is_empty it);
  it |> to_list |> List.iter (Printf.printf "el: %d\n");
  [%expect{|
    it = 1[42]
    size = 1
    is_empty = false
    el: 42 |}]

let with_separator str sep (_,els) = Util.with_separator str sep els