|  | // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  | // The Great Computer Language Shootout | 
|  | // http://shootout.alioth.debian.org/ | 
|  | // Ported from JavaScript contributed by Isaac Gouy. | 
|  | // Description: Repeatedly acccess a tiny integer-sequence. | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | class FannkuchTest { | 
|  | static fannkuch(n) { | 
|  | var p = new List(n), q = new List(n), s = new List(n); | 
|  | var sign = 1, maxflips = 0, sum = 0, m = n - 1; | 
|  | for (var i = 0; i < n; i++) { p[i] = i; q[i] = i; s[i] = i; } | 
|  | do { | 
|  | // Copy and flip. | 
|  | var q0 = p[0];  // Cache 0th element. | 
|  | if (q0 != 0) { | 
|  | for (var i = 1; i < n; i++) q[i] = p[i];  // Work on a copy. | 
|  | var flips = 1; | 
|  | do { | 
|  | var qq = q[q0]; | 
|  | if (qq == 0) {  // ... until 0th element is 0. | 
|  | sum += sign * flips; | 
|  | if (flips > maxflips) maxflips = flips; // New maximum? | 
|  | break; | 
|  | } | 
|  | q[q0] = q0; | 
|  | if (q0 >= 3) { | 
|  | var i = 1, j = q0 - 1, t; | 
|  | do { t = q[i]; q[i] = q[j]; q[j] = t; i++; j--; } while (i < j); | 
|  | } | 
|  | q0 = qq; flips++; | 
|  | } while (true); | 
|  | } | 
|  | if (sign == 1) { | 
|  | var t = p[1]; p[1] = p[0]; p[0] = t; sign = -1; // Rotate 0<-1. | 
|  | } else { | 
|  | // Rotate 0<-1 and 0<-1<-2. | 
|  | var t = p[1]; | 
|  | p[1] = p[2]; | 
|  | p[2] = t; | 
|  | sign = 1; | 
|  | for(var i = 2; i < n; i++) { | 
|  | var sx = s[i]; | 
|  | if (sx != 0) { s[i] = sx-1; break; } | 
|  | if (i == m) { | 
|  | return  [sum, maxflips]; | 
|  | } | 
|  | s[i] = i; | 
|  | // Rotate 0<-...<-i+1. | 
|  | t = p[0]; | 
|  | for(var j=0; j<=i; j++) { p[j] = p[j+1]; } | 
|  | p[i+1] = t; | 
|  | } | 
|  | } | 
|  | } while (true); | 
|  | } | 
|  |  | 
|  | static testMain() { | 
|  | var n = 6; | 
|  | var pf = fannkuch(n); | 
|  | Expect.equals(49, pf[0]); | 
|  | Expect.equals(10, pf[1]); | 
|  | print("${pf[0]}\nPfannkuchen($n) = ${pf[1]}"); | 
|  | } | 
|  | } | 
|  | main() { | 
|  | FannkuchTest.testMain(); | 
|  | } |