Example #1
0
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     ((SimplifyContext)context).IsChanged = true;
     if (element.Right.Type == NodeType.Const && element.Right.Value == "1")
     {
         element = element.Left;
         return(element);
     }
     if (element.Right.Type == NodeType.Const && element.Right.Value == "0")
     {
         element = new ElementOfTree
         {
             Type  = NodeType.Const,
             Value = "1"
         };
         return(element);
     }
     if (element.Right.Type == NodeType.MinusU && element.Left.Value == "0")
     {
         element = new ElementOfTree
         {
             Type  = NodeType.Const,
             Value = "1"
         };
         return(element);
     }
     ((SimplifyContext)context).IsChanged = false;
     return(element);
 }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     element.Type  = NodeType.Const;
     element.Left  = null;
     element.Value = "1";
     return(element);
 }
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            element.Type  = NodeType.Multiply;
            element.Value = "*";
            var tempL = element.Left.Copy();
            var tempR = element.Right.Copy();

            element.Left  = context.Process(element.Left);
            element.Right = new ElementOfTree
            {
                Value = "*",
                Type  = NodeType.Multiply,
                Left  = tempR,
                Right = new ElementOfTree
                {
                    Value = "^",
                    Type  = NodeType.Degree,
                    Right = new ElementOfTree
                    {
                        Type  = NodeType.PlusMinus,
                        Value = "-",
                        Left  = element.Right.Copy(),
                        Right = new ElementOfTree
                        {
                            Value = "1",
                            Type  = NodeType.Const
                        }
                    },
                    Left = tempL
                }
            };

            return(element);
        }
Example #4
0
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            var result = new ElementOfTree
            {
                Right = context.Process(element.Left.Copy()),
                Left  = new ElementOfTree
                {
                    Left = new ElementOfTree
                    {
                        Type  = NodeType.Const,
                        Value = "1"
                    },
                    Right = new ElementOfTree
                    {
                        Left = new ElementOfTree
                        {
                            Type  = NodeType.Const,
                            Value = "2"
                        },
                        Right = element,
                        Type  = NodeType.Multiply,
                        Value = "*"
                    },
                    Value = "/",
                    Type  = NodeType.Divide
                },
                Value = "*",
                Type  = NodeType.Multiply
            };

            return(result);
        }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     element.Left = new ElementOfTree
     {
         Type  = NodeType.PlusMinus,
         Value = "-",
         Left  = new ElementOfTree
         {
             Type  = NodeType.Multiply,
             Value = "*",
             Left  = context.Process(element.Left.Copy()),
             Right = element.Right
         },
         Right = new ElementOfTree
         {
             Type  = NodeType.Multiply,
             Value = "*",
             Left  = element.Left,
             Right = context.Process(element.Right.Copy())
         }
     };
     element.Right = new ElementOfTree
     {
         Type  = NodeType.Degree,
         Value = "^",
         Left  = element.Right,
         Right = new ElementOfTree
         {
             Type  = NodeType.Const,
             Value = "2"
         }
     };
     return(element);
 }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     if (element.Right.Type == NodeType.Divide && element.Left.Type == NodeType.Const && element.Left.Value == "1")
     {
         element.Left  = element.Right.Right;
         element.Right = element.Right.Left;
         return(element);
     }
     if (element.Left.Type == NodeType.Const && element.Left.Value == "0")
     {
         element = element.Right;
         return(element);
     }
     if (element.Left.Type == NodeType.MinusU && element.Left.Left.Value == "0")
     {
         element = element.Right;
         return(element);
     }
     if (element.Right.Type == NodeType.Const && element.Right.Value == "1")
     {
         element = element.Left;
         return(element);
     }
     ((SimplifyContext)context).IsChanged = false;
     return(element);
 }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     element.Right = element.Copy();
     element.Type  = NodeType.Multiply;
     element.Left  = context.Process(element.Right?.Left.Copy());
     element.Value = "*";
     return(element);
 }
 public ElementOfTree Process(ElementOfTree element)
 {
     if (_strategies.Keys.Contains(element.Type))
     {
         foreach (var strategy in _strategies[element.Type])
         {
             element = strategy.Process(element, this);
         }
     }
     return(element);
 }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     ((SimplifyContext)context).IsChanged = true;
     if (element.Type == NodeType.Multiply && element.Right?.Type == NodeType.Const && element.Left?.Type != NodeType.Const)
     {
         var temp = element.Right;
         element.Right = element.Left;
         element.Left  = temp;
     }
     ((SimplifyContext)context).IsChanged = false;
     return(element);
 }
 private ElementOfTree ProcessElement(ElementOfTree element)
 {
     if (_strategies.Keys.Contains(element.Type))
     {
         foreach (var strategy in _strategies[element.Type])
         {
             element = strategy.Process(element, this);
         }
     }
     else
     {
         IsChanged = false;
     }
     return(element);
 }
Example #11
0
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            var tempElem = element.Copy();

            element.Right = new ElementOfTree
            {
                Type  = NodeType.Cos,
                Value = element.Value.Replace("[", "]"),
                Left  = element.Left
            };
            element.Left  = context.Process(tempElem.Left);
            element.Type  = NodeType.Multiply;
            element.Value = "*";
            return(element);
        }
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            var tempElem = element.Copy();

            tempElem.Type  = NodeType.Sin;
            tempElem.Value = tempElem.Value.Replace("]", "[");
            element.Left   = context.Process(element.Left.Copy());
            element.Right  = new ElementOfTree
            {
                Value = "-",
                Type  = NodeType.MinusU,
                Left  = tempElem
            };
            element.Value = "*";
            element.Type  = NodeType.Multiply;
            return(element);
        }
Example #13
0
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     element.Value = "*";
     element.Type  = NodeType.Multiply;
     element.Right = new ElementOfTree
     {
         Value = "/",
         Type  = NodeType.Divide,
         Left  = new ElementOfTree
         {
             Type  = NodeType.Const,
             Value = "1"
         },
         Right = element.Left
     };
     element.Left = context.Process(element.Left.Copy());
     return(element);
 }
Example #14
0
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            element.Type  = NodeType.PlusMinus;
            element.Value = "+";
            var leftTemp = element.Left.Copy();

            element.Left = new ElementOfTree
            {
                Value = "*",
                Type  = NodeType.Multiply,
                Left  = element.Left,
                Right = context.Process(element.Right.Copy())
            };
            element.Right = new ElementOfTree
            {
                Value = "*",
                Type  = NodeType.Multiply,
                Left  = context.Process(leftTemp),
                Right = element.Right
            };
            return(element);
        }
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            var leftResult = new ElementOfTree
            {
                Right = new ElementOfTree
                {
                    Type  = NodeType.Degree,
                    Value = "^",
                    Right = new ElementOfTree
                    {
                        Value = "2",
                        Type  = NodeType.Const
                    },
                    Left = new ElementOfTree
                    {
                        Type  = NodeType.Cos,
                        Value = "]",
                        Left  = element.Left
                    }
                },
                Left = new ElementOfTree
                {
                    Value = "1",
                    Type  = NodeType.Const
                },
                Type  = NodeType.Divide,
                Value = "/"
            };
            var result = new ElementOfTree
            {
                Left  = leftResult,
                Right = context.Process(element.Left.Copy()),
                Type  = NodeType.Multiply,
                Value = "*"
            };

            return(result);
        }
 public ElementOfTree Process(ElementOfTree element)
 {
     if (element.Right != null)
     {
         element.Right = Process(element.Right);
     }
     if (element.Left != null)
     {
         element.Left = Process(element.Left);
     }
     if (ToTheSimpliestForm)
     {
         IsChanged = true;
         while (IsChanged)
         {
             element = ProcessElement(element);
         }
     }
     else
     {
         element = ProcessElement(element);
     }
     return(element);
 }
Example #17
0
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            ((SimplifyContext)context).IsChanged = true;
            if (element.Left?.Type == NodeType.Const && element.Right?.Type == NodeType.Const)
            {
                int a, b;
                if (int.TryParse(element.Right.Value, out a) && int.TryParse(element.Left.Value, out b))
                {
                    element.Value = (a * b).ToString();
                    element.Type  = NodeType.Const;
                    element.Right = null;
                    element.Left  = null;
                    return(element);
                }
            }
            if (element.Right?.Type == NodeType.Const && element.Right.Value == "1")
            {
                element = element.Left;
                return(element);
            }
            if (element.Left?.Type == NodeType.Const && element.Left.Value == "1")
            {
                element = element.Right;
                return(element);
            }
            if (element.Right?.Type == NodeType.Const && element.Right.Value == "0")
            {
                element = element.Right;
                return(element);
            }
            if (element.Left?.Type == NodeType.Const && element.Left.Value == "0")
            {
                element = element.Left;
                return(element);
            }
            if (element.Right?.Type == NodeType.MinusU && element.Right.Left.Value == "0")
            {
                element = element.Right;
                return(element);
            }
            if (element.Left?.Type == NodeType.MinusU && element.Left.Left.Value == "0")
            {
                element = element.Left;
                return(element);
            }

            if (element.Type == NodeType.Multiply && element.Right?.Left?.Type == NodeType.Const &&
                element.Left?.Type == NodeType.Const)
            {
                int a, b;
                if (int.TryParse(element.Right.Left.Value, out a) && int.TryParse(element.Left.Value, out b))
                {
                    element.Left.Value = (a * b).ToString();
                    element.Right      = element.Right.Right;
                    return(element);
                }
            }
            if (element.Right?.Type == NodeType.MinusU && element.Right.Type == NodeType.Const && element.Left.Type == NodeType.Const)
            {
                element.Type = NodeType.MinusU;
                int a, b;
                if (int.TryParse(element.Right?.Left?.Value, out a) && int.TryParse(element.Left.Value, out b))
                {
                    element.Type  = NodeType.MinusU;
                    element.Value = "-";
                    element.Right = null;
                    element.Left  = new ElementOfTree
                    {
                        Type  = NodeType.Const,
                        Value = (a * b).ToString()
                    };
                }
            }
            if (element.Type == NodeType.Multiply && element.Right?.Left?.Type == NodeType.MinusU &&
                element.Left?.Type == NodeType.Const)
            {
                element.Type = NodeType.MinusU;
                int a, b;
                if (int.TryParse(element.Right?.Left?.Left?.Value, out a) && int.TryParse(element.Left.Value, out b))
                {
                    element.Left.Type  = NodeType.MinusU;
                    element.Left.Value = "-";
                    element.Left.Right = null;
                    element.Left.Left  = new ElementOfTree
                    {
                        Type  = NodeType.Const,
                        Value = (a * b).ToString()
                    };
                    element.Right = element.Right.Right;
                }
            }
            ((SimplifyContext)context).IsChanged = false;
            return(element);
        }
 public ElementOfTree Process(ElementOfTree element, IContext context)
 {
     element.Left  = context.Process(element.Left);
     element.Right = context.Process(element.Right);
     return(element);
 }
Example #19
0
        public ElementOfTree Process(ElementOfTree element, IContext context)
        {
            ((SimplifyContext)context).IsChanged = true;
            if (element.Left.Type == NodeType.Const && element.Right.Type == NodeType.Const)
            {
                int a, b;
                if (int.TryParse(element.Left.Value, out a) && int.TryParse(element.Right.Value, out b))
                {
                    element.Value = element.Value == "+" ? (a + b).ToString() : (a - b).ToString();
                    element.Type  = NodeType.Const;
                    element.Right = null;
                    element.Left  = null;
                    return(element);
                }
            }
            if (element.Right.Type == NodeType.Const && element.Right.Value == "0")
            {
                element = element.Left;
                return(element);
            }
            if (element.Left.Type == NodeType.Const && element.Left.Value == "0")
            {
                if (element.Value == "-")
                {
                    element.Type  = NodeType.MinusU;
                    element.Value = "-";
                    element.Left  = element.Right;
                    element.Right = null;
                }
                else
                {
                    element = element.Right;
                }
            }
            if (element.Left.Type == NodeType.Multiply && element.Right?.Type == NodeType.Multiply &&
                element.Left.Right.Equals(element.Right.Right))
            {
                var tempElemR = element.Right.Left.Copy();
                var tempElemL = element.Left.Left.Copy();

                int a, b;
                if (int.TryParse(tempElemL.Value, out a) && int.TryParse(tempElemR.Value, out b))
                {
                    element            = element.Right;
                    element.Left.Value = (a + b).ToString();
                    return(element);
                }
                return(element);
            }
            if (element.Right?.Type == NodeType.X && element.Left?.Type == NodeType.X)
            {
                element.Type = NodeType.Multiply;
                element.Left = new ElementOfTree
                {
                    Value = "2",
                    Type  = NodeType.Const
                };
                element.Value = "*";
            }
            if (element.Right?.Type == NodeType.MinusU && element.Left.Type == NodeType.Const)
            {
                int a, b;
                if (int.TryParse(element.Right?.Left.Value, out a) && int.TryParse(element.Left.Value, out b))
                {
                    if (element.Value == "-")
                    {
                        element.Right.Left.Value = (a + b).ToString();
                    }
                    else
                    {
                        element.Right.Left.Value = (a - b).ToString();
                    }
                    element = element.Right;
                    return(element);
                }
            }
            ((SimplifyContext)context).IsChanged = false;
            return(element);
        }