[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / fannkuch.pir
blobabf8ef6bffb646bf5eacbd55a81afc470d225067
1 #!./parrot
2 # Copyright (C) 2005-2009, Parrot Foundation.
3 # $Id$
5 # ./parrot -R jit fannkuch.pir N         (N = 9 for shootout)
6 # by Joshua Isom
7 # modified by karl : default value of N=7 to match shootout output
10 .sub fannkuch
11         .param int n
12         .local pmc perm, perm1, count
13         perm  = new 'FixedIntegerArray'
14         perm1 = new 'FixedIntegerArray'
15         count = new 'FixedIntegerArray'
16         .local int flips, flipsMax, r, i, k, didpr
17         .local int n1
18         n1 = n
19         dec n1
21         if n > 1 goto countok
22         .return(0)
23 countok:
24         perm  = n
25         perm1 = n
26         count = n
27         i = 0
28 for_1:
29         perm1[i] = i
30         inc i
31         if i < n goto for_1
32         r = n
33         didpr = 0
34         flipsMax = 0
35 beginwhile_1:
36         unless didpr < 30 goto endif_1
37                         i = 0
38                 for_2:
39                         $I0 = perm1[i]
40                         inc $I0
41                         print $I0
42                 inc i
43                 if i < n goto for_2
44                 print "\n"
45                 inc didpr
46         endif_1:
47         for_3:
48                 unless r != 1 goto endfor_3
49                         $I0 = r - 1
50                         count[$I0] = r
51                 dec r
52                 goto for_3
53         endfor_3:
54         $I0 = perm1[0]
55         $I1 = iseq $I0, 0
56         $I0 = perm1[n1]
57         $I2 = iseq $I0, n1
58         $I0 = or $I1, $I2
59         if $I0 goto endif_2
60                         flips = 0
61                         perm = clone perm1
62                         k = perm1[0]
63                 dowhile_1:
64                         .local int j
65                         i = 1
66                         j = k - 1
67                         for_5:
68                         unless i < j goto endfor_5
69                                 $I0 = perm[i]
70                                 $I1 = perm[j]
71                                 perm[i] = $I1
72                                 perm[j] = $I0
73                         inc i
74                         dec j
75                         goto for_5
76                         endfor_5:
77                         inc flips
78                         j = perm[k]
79                         perm[k] = k
80                         k = j
81                 if k goto dowhile_1
82                 unless flipsMax < flips goto endif_3
83                         flipsMax = flips
84                 endif_3:
85 endif_2:
86 while_1:
87         unless r == n goto endif_4
88                 .return(flipsMax)
89         endif_4:
90         .local int perm0
91         perm0 = perm1[0]
92         i = 0
93         beginwhile_2:
94                 unless i < r goto endwhile_2
95                 k = i + 1
96                 $I0 = perm1[k]
97                 perm1[i] = $I0
98                 i = k
99         goto beginwhile_2
100         endwhile_2:
101         perm1[r] = perm0
102         $I0 = count[r]
103         dec $I0
104         count[r] = $I0
105         if $I0 > 0 goto beginwhile_1
106         inc r
107         goto while_1
108 .end
110 .sub main :main
111         .param pmc argv
112         .local int argc
113         argc = elements argv
114         $S0 = "7"
115         if argc == 1 goto default
116         $S0 = argv[1]
117 default:
118         $I0 = $S0
119         $I1 = fannkuch($I0)
120         print "Pfannkuchen("
121         print $S0
122         print ") = "
123         print $I1
124         print "\n"
125         exit 0
126 .end
128 # Local Variables:
129 #   mode: pir
130 #   fill-column: 100
131 # End:
132 # vim: expandtab shiftwidth=4 ft=pir: