#!/usr/local/bin/pike// -*- mode: pike -*- // $Id: lists.pike,v 1.2 2000/12/05 16:04:06 doug Exp $ // http://www.bagley.org/~doug/shootout/ // from: Per Hedbor #define SIZE 10000 #define TB(X) werror( "%s: %.2f\n", X, gauge { #define TE() }) int test_lists() { mixed Li1, Li2, Li3; // create a list of integers from 1 to SIZE. Li1 = (string)indices(allocate(SIZE+1))[1..]; // copy the list to Li2. Li2 = copy_value( Li1 ); // remove each element from left side of Li2 and append to // the right side of Li3 (preserving order) Li3 = ""; while( sizeof( Li2 ) ) { Li3 += Li2[..0]; Li2 = Li2[1..]; } // Li2 is now empty. // Remove each element from right side of Li3 and append to right // side of Li2 while( sizeof( Li3 ) ) { Li2 += Li3[sizeof( Li3 )-1..]; Li3 = Li3[..sizeof( Li3 )-2]; } // Li2 is now reversed, and Li3 empty. // Reverse Li1 in place. Li1 = reverse( Li1 ); if( Li1[0] != SIZE ) return 0; // compare Li1 and Li2 for equality, and return the length of the list. if( equal( Li1, Li2 ) ) return sizeof( Li1 ); return 0; } void main(int argc, array argv) { int result, num = (int)argv[-1]; if( num <= 0 ) num = 1; while( num-- ) result = test_lists(); write("%d\n", result ); }