// $Id: listops.csharp,v 1.0 2002/09/28 10:21:00 dada Exp $ // http://dada.perl.it/shootout/ // contributed by Erik Saltwell using System; namespace ListOps { class IntDeQueue : ICloneable { private int[] data=null; private int start=0; private int end=0; private int size=0; private int temp=0; public bool Empty{get{return start==end;}} public object Clone() { IntDeQueue temp =new IntDeQueue(size-1); temp.start=start; temp.end=end; data.CopyTo(temp.data, 0); return temp; } public bool Equals(IntDeQueue other) { if(Count!=other.Count) return false; int i = this.start; int iOther = other.start; while(i!=this.end) { if(data[i]!=other.data[iOther]) return false; Advance(ref i); other.Advance(ref iOther); } return true; } public int Count { get { if(end>=start) return end-start; else return size + end - start; } } public void Reverse() { if(Count<2) return; Array.Reverse(data); int endEnd=size-1; int startEnd=0; if(end<start) { endEnd = 0; startEnd=size-1; } int temp = start; Regress(ref end); start = Math.Abs(startEnd - Math.Abs(end - endEnd)); end = Math.Abs(endEnd - Math.Abs(temp - startEnd)); Advance(ref end); } public void PushFront(int i) { temp = start; Regress(ref start); if(start==end) { start=temp; throw new System.Exception("Invalid operation"); } data[start]=i; } public int PopFront() { int i=data[start]; if(start!=end) Advance(ref start); else throw new System.Exception("Invalid operation"); return i; } public int PeekFront() { if(start==end) throw new System.Exception("Invalid Operation"); return data[start]; } public int PeekBack() { if(start==end) throw new System.Exception("Invalid Operation"); int temp = end; Regress(ref temp); return data[temp]; } public void PushBack(int i) { temp = end; Advance(ref end); if(start==end) { end= temp; throw new System.Exception("Invalid operation"); } data[temp]=i; } public int PopBack() { if(start!=end) Regress(ref end); else throw new System.Exception("Invalid operation"); return data[end]; } public IntDeQueue(int Size){data = new int[Size+1];this.size=Size+1;} private void Advance(ref int item) { if((++item)==size) item=0; } private void Regress(ref int item) { if(item!=0) --item; else item = (size-1); } public void Clear() { start=0; end=0; } } class App { public const int SIZE=10000; [STAThread] static void Main(string[] args) { int n=int.Parse(args[0]); int result=0; for(int i=0;i<n;++i) result = RunLists(); Console.WriteLine(result); } static public int RunLists() { IntDeQueue q = new IntDeQueue(SIZE); for(int i=0;i<SIZE;++i) q.PushBack(i+1); IntDeQueue q2 = (IntDeQueue)q.Clone(); IntDeQueue q3=new IntDeQueue(SIZE); while(!q2.Empty) q3.PushBack(q2.PopFront()); while(!q3.Empty) q2.PushBack(q3.PopBack()); q.Reverse(); if(q.PeekFront() != SIZE) { Console.WriteLine("q.PeekFront()!=SIZE"); return 0; } if(!q.Equals(q2)) { Console.WriteLine("q!=q2"); return 0; } return q.Count; } } }