public object Clone() { var result = new SnailPair(Value); result.Parent = Parent; result.Left = Left != null ? (Left as SnailPair).Clone() as SnailPair : null; result.Right = Right != null ? (Right as SnailPair).Clone() as SnailPair : null; return(result); }
public static SnailPair operator +(SnailPair a, SnailPair b) { var result = new SnailPair(a.Clone() as SnailPair, b.Clone() as SnailPair); while (result.Explode() || result.Split()) { ; } return(result); }
public bool Split() { if (!IsLeaf) { if ((Left as SnailPair).Split()) { return(true); } if ((Right as SnailPair).Split()) { return(true); } return(false); } if (Value >= 10) { Left = new SnailPair(Value / 2); Right = new SnailPair(Value / 2 + (Value % 2)); Value = 0; return(true); } return(false); }
public static SnailPair Parse(string s, ref int position) { SnailPair result = new SnailPair(); if (s[position] == '[') { ++position; result.Left = Parse(s, ref position); ++position; result.Right = Parse(s, ref position); ++position; } else { var dLength = 0; while (char.IsDigit(s[position + dLength])) { ++dLength; } result.Value = long.Parse(s.Substring(position, dLength)); position += dLength; } return(result); }
public SnailPair(SnailPair left, SnailPair right) : base(left, right) { }