| 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 |