2005-11-18
昨日のリストの問題。こんなのは、どうだろう。
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桁の加減算は、計算ではなくパターンマッチングだ。結果は、今のところ妻とタイである。