昨日のリストの問題。こんなのは、どうだろう。

public class Test
{
	private class Brother
	{
		private bool        b; // 兄だけ進む
		private IEnumerator p; // 兄
		private IEnumerator q; // 弟
		public Brother(IEnumerator it1, IEnumerator it2) {b = true; p = it1; q = it2;}
		public bool IsSame() {return p.Current == q.Current;} // 手抜き
		public bool MoveNext() 
		{
			if (!p.MoveNext()) return false;
			if (b = !b) q.MoveNext();
			return true;
		}
	}
	public static bool IsLoop(IEnumerable en)
	{
		Brother br = new Brother(en.GetEnumerator(), en.GetEnumerator());
		while (br.MoveNext()) if (br.IsSame()) return true;
		return false;
	}
	static void Main()
	{
		List l = new List();
		l.Add();
		l.Add();
		l.Add();
		l.Add();
		l.top.next.next.next.next = l.top.next.next;
		Console.WriteLine(IsLoop(l));
	}
	private class List : IEnumerable
	{
		public class ListItem : IEnumerator
		{
			public ListItem next;
			public ListItem(ListItem p) {next = p;}
			public void Reset() {} // 手抜き
			public object Current {get {return next;}}
			public bool MoveNext()
			{
				if (next == null) return false;
				next = next.next;
				return true;
			}
		}
		public ListItem top = null;
		public IEnumerator GetEnumerator() {return new ListItem(top);}
		public void Add() {top = new ListItem(top);}
	}
}

ループの有無を兄弟が調べる。兄が2歩行く間に弟は1歩しか歩けない。兄が弟に追いついたらループしている。


チャレンジ1年生の付録に電卓みたいなものがあって、「スピード」というゲームがある。 1分に何問の加減算を解けるか競えるようになっている。妻がはまっているので、試しにやってみる。 2桁の加減算は、計算ではなくパターンマッチングだ。結果は、今のところ妻とタイである。