Ejemplo n.º 1
0
        public string CreateNewNonterminal(string OldNonterminal)
        {
            string NontermPrefix = Regex.Replace(OldNonterminal, @"\d", "");

            var ListOfOldNontermials = from OldTerm in _Nonterminals
                                       where OldTerm.StartsWith(NontermPrefix)
                                       select OldTerm;

            ListOfOldNontermials.OrderByDescending(q => q).ToList();

            string Number = Regex.Replace(ListOfOldNontermials.Last(), @"\D", "");
            int    Max;

            if (Number == "")
            {
                Max = 1;
            }
            else
            {
                Max = int.Parse(Number) + 1;
            }
            string NewNonTerm = NontermPrefix + Max.ToString();

            return(NewNonTerm);
        }
Ejemplo n.º 2
0
        private void CalculateTerm()
        {
            //Erstelle den ersten Digit
            Literal FirstLiteral = new Literal(Digit);

            //Lege eine Liste an Index 0 an und speicher in ihr First Literal
            ListTerms.Add(new List <Term>(100000));
            ListTerms[0].Add(FirstLiteral);
            DictionaryResult.Add(FirstLiteral.GetResult(), FirstLiteral);

            //Schaue, ob Literal GoalNumber ist
            if (FirstLiteral.GetResult() == GoalNumber)
            {
                LabelResult1Term.Content = FirstLiteral.GetResult().ToString();
                NeededNumberOfDigits1    = 1;
                return;
            }

            //Erstelle für jede Ziffernlänge (alle) Terme
            for (nDigit = 1; true; nDigit++)
            {
                //Lege Liste für nDigit an
                ListTerms.Add(new List <Term>());

                //Erstelle Literal für nDigit
                long LiteralValue = ListTerms[nDigit - 1][0].GetResult();
                LiteralValue = LiteralValue * 10 + Digit;
                Literal NewLiteral = new Literal(LiteralValue);
                ListTerms[nDigit].Add(NewLiteral);

                //Muss theoretisch noch überprüft werden, ob wert nicht schon erreicht
                if (LiteralValue == GoalNumber)
                {
                    GoalNumber1Reached       = true;
                    LabelResult1Term.Content = LiteralValue.ToString();
                }

                if (Task == 2)
                {
                    //Wende Fakultät für nDigit-1 an
                    Term OldTerm;
                    int  Lenght = ListTerms[nDigit - 1].Count;

                    for (int i = 0; i < Lenght; i++)
                    {
                        OldTerm = ListTerms[nDigit - 1][i];
                        while (FactorialOperator.IsCalculatable(OldTerm))
                        {
                            Term NewTerm = new FactorialOperator(OldTerm);

                            if (CheckTerm(NewTerm))
                            {
                                ListTerms[nDigit - 1].Add(NewTerm);
                                DictionaryResult.Add(NewTerm.GetResult(), NewTerm);
                            }
                            else if (NewTerm.GetResult() == OldTerm.GetResult())
                            {
                                break;
                            }
                            OldTerm = NewTerm;
                        }
                    }
                }
                if (Task == 2 && NeededNumberOfDigits1 - 1 <= nDigit && BoolAB)
                {
                    LabelResult2Term.Content = "Keine kürzere Lösung gefunden";
                    return;
                }

                //Gehe Ziffernlänge bis zur Hälfte der aktuellen hoch
                for (int DigitLenght = 0; DigitLenght < (nDigit + 1) / 2; DigitLenght++)
                {
                    //Für jede dieser Ziffernlänge gehe alle ihre Terme durch
                    int UpperBound = ListTerms[DigitLenght].Count;
                    for (int ElementsOfDigitLength = 0; ElementsOfDigitLength < UpperBound; ElementsOfDigitLength++)
                    {
                        //Für jede dieser Terme verknüpfe sie mit mit allen nDigit-DigitLenght Termen
                        int RemainingDigitDifference = nDigit - DigitLenght - 1;
                        for (int ElementsOfRemainingDigitDifference = 0; ElementsOfRemainingDigitDifference < ListTerms[RemainingDigitDifference].Count; ElementsOfRemainingDigitDifference++)
                        {
                            //Erstelle alle sinnvollen Terme aus den zwei aktuellen Termen
                            CreateTerms(DigitLenght, ElementsOfDigitLength, RemainingDigitDifference, ElementsOfRemainingDigitDifference);

                            //Breche ab, wenn GoalNumber erreicht

                            if (Task == 2 && GoalNumber2Reached)
                            {
                                return;
                            }
                            else if (Task == 1 && GoalNumber1Reached)
                            {
                                NeededNumberOfDigits1 = nDigit + 1;
                                return;
                            }
                        }
                    }
                }
            }
        }