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); }
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; } } } } } }