File tree Expand file tree Collapse file tree 3 files changed +753
-0
lines changed Expand file tree Collapse file tree 3 files changed +753
-0
lines changed Original file line number Diff line number Diff line change
1
+ (* The Computer Language Benchmarks Game
2
+ http://shootout.alioth.debian.org/
3
+
4
+ contributed by Isaac Gouy, transliterated from Mike Pall's Lua program
5
+ *)
6
+
7
+ let fannkuch n =
8
+ let p = Array. make n 0 in
9
+ let q = Array. make n 0 in
10
+ let s = Array. make n 0 in
11
+ let sign = ref 1 in
12
+ let maxflips = ref 0 in
13
+ let sum = ref 0 in
14
+ for i = 0 to n - 1 do
15
+ p.(i) < - i;
16
+ q.(i) < - i;
17
+ s.(i) < - i
18
+ done ;
19
+ while true do
20
+ let q0 = ref p.(0 ) in
21
+ if ! q0 <> 0
22
+ then (
23
+ for i = 1 to n - 1 do
24
+ q.(i) < - p.(i)
25
+ done ;
26
+ let flips = ref 1 in
27
+ while
28
+ let qq = q.(! q0) in
29
+ if qq = 0
30
+ then (
31
+ sum := ! sum + (! sign * ! flips);
32
+ if ! flips > ! maxflips then maxflips := ! flips;
33
+ false )
34
+ else true
35
+ do
36
+ let qq = q.(! q0) in
37
+ q.(! q0) < - ! q0;
38
+ (if ! q0 > = 3
39
+ then
40
+ let i = ref 1 in
41
+ let j = ref (! q0 - 1 ) in
42
+ while
43
+ let t = q.(! i) in
44
+ q.(! i) < - q.(! j);
45
+ q.(! j) < - t;
46
+ incr i;
47
+ decr j;
48
+ ! i < ! j
49
+ do
50
+ ()
51
+ done );
52
+ q0 := qq;
53
+ incr flips
54
+ done );
55
+ if ! sign = 1
56
+ then (
57
+ let t = p.(1 ) in
58
+ p.(1 ) < - p.(0 );
59
+ p.(0 ) < - t;
60
+ sign := - 1 )
61
+ else
62
+ let t = p.(1 ) in
63
+ p.(1 ) < - p.(2 );
64
+ p.(2 ) < - t;
65
+ sign := 1 ;
66
+ try
67
+ for i = 2 to n - 1 do
68
+ let sx = s.(i) in
69
+ if sx <> 0
70
+ then (
71
+ s.(i) < - sx - 1 ;
72
+ raise Exit );
73
+ if i = n - 1
74
+ then (
75
+ if false then Format. eprintf " %d %d@." ! sum ! maxflips;
76
+ exit 0 );
77
+ s.(i) < - i;
78
+ let t = p.(0 ) in
79
+ for j = 0 to i do
80
+ p.(j) < - p.(j + 1 )
81
+ done ;
82
+ p.(i + 1 ) < - t
83
+ done
84
+ with Exit -> ()
85
+ done
86
+
87
+ let n = 10
88
+
89
+ let pf = fannkuch n
90
+
91
+ (*
92
+ //print(pf[0] + "\n" + "Pfannkuchen(" + n + ") = " + pf[1]);
93
+ *)
You can’t perform that action at this time.
0 commit comments