mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 01:44:37 +00:00
70 lines
1.8 KiB
Nim
70 lines
1.8 KiB
Nim
import os
|
|
import strutils
|
|
|
|
proc fannkuch (n: int): int =
|
|
var
|
|
count: seq[int]
|
|
maxFlips = 0
|
|
m = n-1
|
|
r = n
|
|
check = 0
|
|
perm1: seq[int]
|
|
perm: seq[int]
|
|
|
|
newSeq (count, n+1)
|
|
newSeq (perm1, n)
|
|
newSeq (perm, n)
|
|
for i in 0 .. n-1:
|
|
count[i] = i+1
|
|
perm1[i] = i
|
|
perm[i] = i
|
|
count[n] = n+1
|
|
|
|
while True:
|
|
if check < 30:
|
|
for i in items (perm1):
|
|
write (stdout, $(i+1))
|
|
echo ("")
|
|
inc (check)
|
|
|
|
while r != 1:
|
|
count[r-1] = r
|
|
dec (r)
|
|
|
|
if perm1[0] != 0 and perm1[m] != m:
|
|
# perm = perm1
|
|
# The above line is between 3 and 4 times slower than the loop below!
|
|
for i in 0 .. n-1:
|
|
perm[i] = perm1[i]
|
|
var flipsCount = 0
|
|
var k = perm[0]
|
|
while k != 0:
|
|
for i in 0 .. (k div 2):
|
|
swap (perm[i], perm[k-i])
|
|
inc (flipsCount)
|
|
k = perm[0]
|
|
|
|
if flipsCount > maxFlips:
|
|
maxFlips = flipsCount
|
|
|
|
block makePerm:
|
|
while r != n:
|
|
var tmp = perm1[0]
|
|
# # perm1.delete (0)
|
|
# # perm1.insert (tmp, r)
|
|
# # The above is about twice as slow as the following:
|
|
# moveMem (addr (perm1[0]), addr (perm1[1]), r * sizeof (int))
|
|
# The call to moveMem is about 50% slower than the loop below!
|
|
for i in 0 .. r-1:
|
|
perm1[i] = perm1[i+1]
|
|
perm1[r] = tmp
|
|
|
|
dec (count[r])
|
|
if count[r] > 0:
|
|
break makePerm
|
|
inc (r)
|
|
return maxFlips
|
|
|
|
var n = 10
|
|
echo ("Pfannkuchen(" & $n & ") = " & $fannkuch (n))
|