Ejemplo n.º 1
0
        /// <summary> Annihilate </summary>
        public static MultiLinker <KeyValuePair <char, string> > Cancel(MultiLinker <KeyValuePair <char, string> > s)
        {
            if (!_prepare(s, Cancel))
            {
                return(s);
            }
            bool   mult = EqualsPorN(s.Link.Data.Data.Key, '*', '/');
            double sum = mult ? 1d : 0d, n = 0d;

            foreach (var pair in s)
            {
                var p = pair.Data;
                if (IsNum(p.Data.Value))
                {
                    //try {
                    var num = ToNum(p.Data.Value);
                    if (num.Equals(0d) && mult)
                    {
                        return(s.Clone(new KeyValuePair <char, string>(s.Data.Key,
                                                                       num.ToString(CultureInfo.InvariantCulture)), null));
                    }
                    switch (p.Data.Key)
                    {
                    case '+': sum += num; break;

                    case '-': sum -= num; break;

                    case '*': sum *= num; break;

                    case '/': sum /= num; break;
                    }
                    s.Remove(pair);
                }
                else
                {
                    //catch {
                    var c = (char)(mult ? (p.Data.Key ^ '*' ^ '/') : (p.Data.Key ^ '+' ^ '-'));
                    if (pair.Remove(mono => mono != null && mono.Data != null &&
                                    (mono.Data.Data.Key == c && EqualsByValue(mono.Data, p) /* ||
                                                                                             * mono.Data.Data.Key == p.Data.Key && EqualsByValue(mono.Data, p)*/)))
                    {
                        s.Remove(pair); continue;
                    }

                    /*
                     * if(pair.Data.Link == null)
                     * {
                     *      var temp = s.Link.Find(mono => mono != null && mono.Data != null &&
                     *              mono.Data.Count > 1 &&
                     *              IsNum(mono.Data.Link.Data.Data.Value) &&
                     *              EqualsByValue(mono.Data.Link.Link.Data.Data.Value, p.Value));
                     *      if(false)
                     *              s.Remove(pair);
                     * }
                     * //*/
                    //
                    if (EqualsPorN(p.Data.Key, '+', '-') && (p.Data.Value == @"n" ||
                                                             (p.Link != null && p.Link.Link != null && p.Link.Link.Link == null &&
                                                              IsNum(p.Link.Data.Data.Value) && p.Link.Link.Data.Data.Value == @"n")))
                    {
                        n += (p.Data.Key == '-' ? -1d : 1d) * (p.Data.Value == @"n" ? 1d : double.Parse(p.Link.Data.Data.Value));
                        s.Remove(pair);
                    }                    //*/
                }
            }
            if (s.Link == null)
            {
                return(s.Clone(new KeyValuePair <char, string>(s.Data.Key,
                                                               sum.ToString(CultureInfo.InvariantCulture)), null));
            }
            if (mult)
            {
                if (!sum.Equals(1d))
                {
                    s.AddFirst(new KeyValuePair <char, string>(/*sum < 1d ? '/' :*/ '*',
                                                               (/*sum < 1d ? 1d / sum : */ sum).ToString(CultureInfo.InvariantCulture)));
                }
            }
            if (!n.Equals(0d))
            {
                string abs = System.Math.Abs(n).ToString(CultureInfo.InvariantCulture);
                var    c   = s.Clone(new KeyValuePair <char, string>(n < 0d ? '-' : '+', abs + @"*n"), null);
                c.Add(new KeyValuePair <char, string>('*', abs));
                c.Add(new KeyValuePair <char, string>('*', @"n"));
                s.Add(c);
            }
            if (!mult)
            {
                //else {
                if (!sum.Equals(0d))
                {
                    s.Add(new KeyValuePair <char, string>(sum < 0d ? '-' : '+',
                                                          System.Math.Abs(sum).ToString(CultureInfo.InvariantCulture)));
                }
            }
            return(s);
        }
Ejemplo n.º 2
0
        public static MultiLinker <KeyValuePair <char, string> > CommonMultiplier(IEnumerable <MultiLinker <KeyValuePair <char, string> > > ss)
        {
            MultiLinker <KeyValuePair <char, string> > r = ArithmeticGraph(One), t;

            if (ss == null)
            {
                return(r);
            }
            var e = ss.GetEnumerator();

            if (!e.MoveNext() || e.Current == null)
            {
                return(r);
            }
            bool minus = false;

            if (EqualsPorN(e.Current.Data.Key, '*', '/'))
            {
                r.Add(e.Current);
            }
            else
            {
                minus = e.Current.Data.Key == '-';
                if (e.Current.Link != null && EqualsPorN(e.Current.Link.Data.Data.Key, '*', '/'))
                {
                    foreach (var mono in e.Current)
                    {
                        r.Add(mono.Data);
                    }
                }
                else
                {
                    r.Add(e.Current.Clone(new KeyValuePair <char, string>('*', e.Current.Data.Value), e.Current.Link));
                }
            }
            while (e.MoveNext())
            {
                t = ArithmeticGraph(One);
                if (e.Current == null)
                {
                    return(t);
                }
                minus &= e.Current.Data.Key == '-';
                if (EqualsPorN(e.Current.Data.Key, '*', '/'))
                {
                    t.Add(e.Current);
                }
                else
                {
                    if (e.Current.Link != null && EqualsPorN(e.Current.Link.Data.Data.Key, '*', '/'))
                    {
                        foreach (var mono in e.Current)
                        {
                            t.Add(mono.Data);
                        }
                    }
                    else
                    {
                        t.Add(e.Current.Clone(new KeyValuePair <char, string>('*', e.Current.Data.Value), e.Current.Link));
                    }
                }
                foreach (var pair in r)
                {
                    var copy = pair.Data;
                    if (!t.Remove(mono => mono != null &&
                                  (mono.Data.Data.Key == copy.Data.Key && EqualsByValue(mono.Data, copy))))
                    {
                        r.Remove(pair);
                    }
                    else if (t.Link == null)
                    {
                        pair.Link = null;
                    }
                }
            }
            return(minus ? ChangeSign(r, '+', '-') : r);
        }