forked from fsprojects/fantomas
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfannkuch5.fs
68 lines (66 loc) · 1.64 KB
/
fannkuch5.fs
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
/// The Computer Language Benchmarks Game
/// http://shootout.alioth.debian.org/
/// contributed by Alex Peake
/// Literal translation of Andrei Formiga's Scala solution
module Fannkuch
[<EntryPoint>]
let main (args) =
let n =
if args.Length > 0 then int args.[0]
else 7
//printfn "Pfannkuchen(%d) = %d" x (fannkuch x)
let mutable maxFlips = 0
let mutable permN = 0
let mutable j = 0
let mutable k = 0
let mutable temp = 0
let mutable first = 0
let mutable flips = 0
let mutable perm0 = Array.create n 0
let mutable perm = Array.create n 0
let mutable rot = Array.create n 0
while (k < n) do
perm.[k] <- k + 1
rot.[k] <- 0
k <- k + 1
while (rot.[n - 1] < n) do
if (permN < 30) then
k <- 0
while (k < n) do
printf "%d" perm.[k]
k <- k + 1
printf "\n"
permN <- permN + 1
flips <- 0
k <- 0
while (k < n) do
perm0.[k] <- perm.[k]
k <- k + 1
first <- perm0.[0]
while (first <> 1) do
k <- 0
while (k < (first >>> 1)) do
temp <- perm0.[k]
perm0.[k] <- perm0.[first - 1 - k]
perm0.[first - 1 - k] <- temp
k <- k + 1
first <- perm0.[0]
flips <- flips + 1
if (flips > maxFlips) then maxFlips <- flips
temp <- perm.[0]
perm.[0] <- perm.[1]
perm.[1] <- temp
rot.[1] <- rot.[1] + 1
j <- 1
while (j < n - 1 && rot.[j] > j) do
rot.[j] <- 0
j <- j + 1
k <- 0
while (k < j) do
temp <- perm.[k]
perm.[k] <- perm.[k + 1]
perm.[k + 1] <- temp
k <- k + 1
rot.[j] <- rot.[j] + 1
printfn "Pfannkuchen(%d) = %d" n maxFlips
0