PageRenderTime 44ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/web_js/js_of_ocaml/benchmarks/sources/ml/soli.ml

http://github.com/aryx/fork-ocsigen
OCaml | 116 lines | 62 code | 17 blank | 37 comment | 7 complexity | a058cddf2b1525e8d01a27bb319fbb33 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.0, LGPL-2.1, MIT, WTFPL
  1. (***********************************************************************)
  2. (* *)
  3. (* Objective Caml *)
  4. (* *)
  5. (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
  6. (* *)
  7. (* Copyright 1996 Institut National de Recherche en Informatique et *)
  8. (* en Automatique. All rights reserved. This file is distributed *)
  9. (* under the terms of the Q Public License version 1.0. *)
  10. (* *)
  11. (***********************************************************************)
  12. (* $Id: soli.ml 2553 1999-11-17 18:59:06Z xleroy $ *)
  13. type peg = Out | Empty | Peg
  14. let board = [|
  15. [| Out; Out; Out; Out; Out; Out; Out; Out; Out|];
  16. [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|];
  17. [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|];
  18. [| Out; Peg; Peg; Peg; Peg; Peg; Peg; Peg; Out|];
  19. [| Out; Peg; Peg; Peg; Empty; Peg; Peg; Peg; Out|];
  20. [| Out; Peg; Peg; Peg; Peg; Peg; Peg; Peg; Out|];
  21. [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|];
  22. [| Out; Out; Out; Peg; Peg; Peg; Out; Out; Out|];
  23. [| Out; Out; Out; Out; Out; Out; Out; Out; Out|]
  24. |]
  25. (*
  26. let print_peg = function
  27. Out -> print_string "."
  28. | Empty -> print_string " "
  29. | Peg -> print_string "$"
  30. let print_board board =
  31. for i=0 to 8 do
  32. for j=0 to 8 do
  33. print_peg board.(i).(j)
  34. done;
  35. print_newline()
  36. done
  37. *)
  38. type direction = { dx: int; dy: int }
  39. let dir = [| {dx = 0; dy = 1}; {dx = 1; dy = 0};
  40. {dx = 0; dy = -1}; {dx = -1; dy = 0} |]
  41. type move = { x1: int; y1: int; x2: int; y2: int }
  42. let moves = Array.create 31 {x1=0;y1=0;x2=0;y2=0}
  43. let counter = ref 0
  44. exception Found
  45. let rec solve m =
  46. counter := !counter + 1;
  47. if m = 31 then
  48. begin match board.(4).(4) with Peg -> true | _ -> false end
  49. else
  50. try
  51. (*
  52. if !counter mod 500 = 0 then begin
  53. print_int !counter; print_newline()
  54. end;
  55. *)
  56. for i=1 to 7 do
  57. for j=1 to 7 do
  58. match board.(i).(j) with
  59. Peg ->
  60. for k=0 to 3 do
  61. let d1 = dir.(k).dx in
  62. let d2 = dir.(k).dy in
  63. let i1 = i+d1 in
  64. let i2 = i1+d1 in
  65. let j1 = j+d2 in
  66. let j2 = j1+d2 in
  67. match board.(i1).(j1) with
  68. Peg ->
  69. begin match board.(i2).(j2) with
  70. Empty ->
  71. (*
  72. print_int i; print_string ", ";
  73. print_int j; print_string ") dir ";
  74. print_int k; print_string "\n";
  75. *)
  76. board.(i).(j) <- Empty;
  77. board.(i1).(j1) <- Empty;
  78. board.(i2).(j2) <- Peg;
  79. if solve(m+1) then begin
  80. moves.(m) <- { x1=i; y1=j; x2=i2; y2=j2 };
  81. raise Found
  82. end;
  83. board.(i).(j) <- Peg;
  84. board.(i1).(j1) <- Peg;
  85. board.(i2).(j2) <- Empty
  86. | _ -> ()
  87. end
  88. | _ -> ()
  89. done
  90. | _ ->
  91. ()
  92. done
  93. done;
  94. false
  95. with Found ->
  96. true
  97. let _ = if solve 0 then ((*print_string "\n"; print_board board*)) else assert false