OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 // The Great Computer Language Shootout | |
5 // http://shootout.alioth.debian.org/ | |
6 // Ported from JavaScript contributed by Isaac Gouy. | |
7 // Description: Repeatedly acccess a tiny integer-sequence. | |
8 | |
9 class FannkuchTest { | |
10 static fannkuch(n) { | |
11 var p = new List(n), q = new List(n), s = new List(n); | |
12 var sign = 1, maxflips = 0, sum = 0, m = n - 1; | |
13 for (var i = 0; i < n; i++) { p[i] = i; q[i] = i; s[i] = i; } | |
14 do { | |
15 // Copy and flip. | |
16 var q0 = p[0]; // Cache 0th element. | |
17 if (q0 != 0) { | |
18 for (var i = 1; i < n; i++) q[i] = p[i]; // Work on a copy. | |
19 var flips = 1; | |
20 do { | |
21 var qq = q[q0]; | |
22 if (qq == 0) { // ... until 0th element is 0. | |
23 sum += sign * flips; | |
24 if (flips > maxflips) maxflips = flips; // New maximum? | |
25 break; | |
26 } | |
27 q[q0] = q0; | |
28 if (q0 >= 3) { | |
29 var i = 1, j = q0 - 1, t; | |
30 do { t = q[i]; q[i] = q[j]; q[j] = t; i++; j--; } while (i < j); | |
31 } | |
32 q0 = qq; flips++; | |
33 } while (true); | |
34 } | |
35 if (sign == 1) { | |
36 var t = p[1]; p[1] = p[0]; p[0] = t; sign = -1; // Rotate 0<-1. | |
37 } else { | |
38 // Rotate 0<-1 and 0<-1<-2. | |
39 var t = p[1]; | |
40 p[1] = p[2]; | |
41 p[2] = t; | |
42 sign = 1; | |
43 for(var i = 2; i < n; i++) { | |
44 var sx = s[i]; | |
45 if (sx != 0) { s[i] = sx-1; break; } | |
46 if (i == m) { | |
47 return [sum, maxflips]; | |
48 } | |
49 s[i] = i; | |
50 // Rotate 0<-...<-i+1. | |
51 t = p[0]; | |
52 for(var j=0; j<=i; j++) { p[j] = p[j+1]; } | |
53 p[i+1] = t; | |
54 } | |
55 } | |
56 } while (true); | |
57 } | |
58 | |
59 static testMain() { | |
60 var n = 6; | |
61 var pf = fannkuch(n); | |
62 Expect.equals(49, pf[0]); | |
63 Expect.equals(10, pf[1]); | |
64 print("${pf[0]}\nPfannkuchen($n) = ${pf[1]}"); | |
65 } | |
66 } | |
67 main() { | |
68 FannkuchTest.testMain(); | |
69 } | |
OLD | NEW |