source code
! The Computer Language Benchmarks Game
! https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
!
! converted to fortran by Gilbert Brietzke on 31. Januar 2011
! from C-code by Joseph Piché as a conversion
! from Java version by Oleg Mazurov and Isaac Gouy
program fannkuch
implicit none
integer :: n,checksum,maxFlipsCount
character(len=2) :: arg
character(len=10) :: out
call get_command_argument(1,arg);read(arg,'(I2)')n
call fannkuchredux(n,checksum,maxFlipsCount)
write(out,'(I10)') checksum;
write(*,'(A)') trim(adjustl(out))
write(out,'(I10)') maxFlipsCount;
write(*,'(A)') 'Pfannkuchen('//trim(adjustl(arg))//') = '//trim(adjustl(out))
contains
subroutine fannkuchredux(n,checksum,maxFlipsCount)
implicit none
integer, intent(in) :: n
integer, intent(out) :: maxFlipsCount,checksum
integer :: perm(0:n-1),perm1(0:n-1),icount(0:n-1);
integer :: i,r,temp,k,perm0,permCount = 0,flipsCount = 0;
checksum = 0; maxFlipsCount = 0;
do i = 0,n-1
perm1(i)= i;
enddo
r=n
do while (.true.)
do while (r /= 1)
icount(r-1)=r; r=r-1;
end do
perm = perm1; flipsCount = 0;
do while (perm(0)/=0)
k = perm(0)
do i=0,ishft(k+1,-1)-1
temp = perm(i); perm(i) = perm(k-i); perm(k-i) = temp;
enddo
flipsCount = flipsCount + 1;
end do
maxFlipsCount = max(maxFlipsCount,flipsCount);
if (modulo(permCount,2) == 0)then
checksum = checksum + flipsCount
else
checksum = checksum - flipsCount
end if
do while (.true.)
if (r==n) return
perm0 = perm1(0); i = 0;
do while (i < r)
perm1(i) = perm1(i + 1); i = i + 1;
end do
perm1(r) = perm0;
icount(r) = icount(r) - 1;
if (icount(r) > 0) exit;
r = r + 1;
end do
permCount = permCount + 1;
end do
end subroutine fannkuchredux
end program fannkuch
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
GNU Fortran (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008
Wed, 06 May 2020 01:10:58 GMT
MAKE:
/usr/bin/gfortran -pipe -O3 -fomit-frame-pointer -march=core2 -fopenmp fannkuchredux.f95 -o fannkuchredux.gfortran_run
rm fannkuchredux.f95
3.80s to complete and log all make actions
COMMAND LINE:
./fannkuchredux.gfortran_run 12
PROGRAM OUTPUT:
3968050
Pfannkuchen(12) = 65