Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
12 kB
2
Indexable
using System.Data;

namespace OtomataOdev
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        String emptyWord = "Ø";
        List<String> producededWords = new List<string>();
        Random random = new Random();

        private void btnProduce_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            resetAlhabetsText();
            String alphabet = textAlfabets.Text;
            String regularExpression = txtRegularExp.Text;
            int produceSizeOfWords = Convert.ToInt32(txtSizeOfWords.Text);
            printRegularExpression(regularExpression);
            printTheAlphabets(alphabet);
             produceWord(regularExpression, alphabet, produceSizeOfWords);
        }

        private void printTheAlphabets(String alphabet)
        {
            String[] alphabets = alphabet.Split(',');
            foreach (var item in alphabets)
            {
                txtAlphabetList.AppendText(item + " ");
            }
        }

        private void printRegularExpression(String regularExpression)
        {
            lblRegularExps.Text = regularExpression;
        }

        private void resetAlhabetsText()
        {
            txtAlphabetList.Clear();
        }

        private void produceWord(String regularExp, String alphabet, int produceSizeOfWords)
        {
            String normalWord = "";
            List<String> words = new List<String>();
            var validWord = "";
            var tempproduceSizeOfWords = produceSizeOfWords;
            while (tempproduceSizeOfWords >= 0)
            {
                validWord = "";
                normalWord = "";
                var i = 0;
                for (i = 0; i < regularExp.Length; i++)
                {
                    var item = regularExp[i];
                    if (item == '(')
                    {
                        if (!string.IsNullOrEmpty(normalWord))
                        {
                           validWord += normalWord;
                            produceSizeOfWords--;
                        }
                        int openParenthesisIndex = regularExp.IndexOf('(');
                        int closingParenthesisIndex = regularExp.IndexOf(')');
                        String subRule = regularExp.Substring(openParenthesisIndex + 1, (closingParenthesisIndex - 1) - openParenthesisIndex);
                        i = closingParenthesisIndex;
                        if (regularExp.Length > closingParenthesisIndex + 1 && regularExp[closingParenthesisIndex + 1] == '*')
                        {
                            words.Add(normalWord+"-");
                            words.Add(emptyWord + "-");
                            tempproduceSizeOfWords--; // Boş kelime ekledikten sonra 
                            // üretmemiz gereken kelime sayısını azaltıyorum.
                            for (int j = 0; j <= random.Next(10); j++)
                            {
                                if (subRule.Contains('+'))
                                {
                                    validWord += generateRandomWord(subRule);
                                }
                                else
                                {
                                    validWord += subRule;
                                }
                            }
                        }
                        else
                        {
                           
                            if(subRule.Contains('+') && subRule.Contains('*'))
                            {
                                var seperatedWords = subRule.Split('+');
                                var firstWord = seperatedWords.First();
                                var secondWord = seperatedWords.Last();
                               var randomNumber= random.Next(0,2);

                                if (randomNumber == 0)
                                {
                                    for (int j = 0; j < firstWord.Length; j++)
                                    {
                                        var wordItem = firstWord[j];
                                        if (wordItem == '*')
                                        {
                                            if (random.Next(0, 2) == 0)
                                            {
                                               continue;
                                            }
                                            else
                                            {
                                                // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz
                                                // kadar ekleyebiliyorduk. Onu eklemiş oldum.
                                                var wordIndex = firstWord.IndexOf(wordItem, j);
                                                validWord = validWord.Remove(wordIndex-1);

                                                var word = firstWord[wordIndex - 1];
                                                for (int k = 0; k < random.Next(10); k++)
                                                {
                                                    validWord += word;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            validWord += wordItem;
                                        }
                                    };
                                }
                                else
                                {
                                    for (int j = 0; j < secondWord.Length; j++)
                                    {
                                        var wordItem = secondWord[j];
                                        if (wordItem == '*')
                                        {
                                            if (random.Next(0, 2) == 0)
                                            {
                                                continue;
                                            }
                                            else
                                            {
                                                // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz
                                                // kadar ekleyebiliyorduk. Onu eklemiş oldum.
                                                var wordIndex = secondWord.IndexOf(wordItem, j);
                                                validWord = validWord.Remove(wordIndex - 1);

                                                var word = secondWord[wordIndex - 1];
                                                for (int k = 0; k < random.Next(10); k++)
                                                {
                                                    validWord += word;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            validWord += wordItem;
                                        }
                                    };
                                }                                                         
                            }
                           else if (subRule.Contains('+'))
                            {
                                validWord += generateRandomWord(subRule);
                            }
                            else
                            {
                                validWord += subRule;
                            }

                        }
                        words.Add(validWord + "-");
                    }
                    else if (item == '*')
                    {
                        // Eğer yıldızlı bir ifade ise o alfabeden istediğimiz
                        // kadar ekleyebiliyorduk. Onu eklemiş oldum.
                        var wordIndex = regularExp.IndexOf(item, i);
                        var word = regularExp[wordIndex - 1];
                        for (int j = 0; j < random.Next(10); j++)
                        {
                            validWord += word;
                        }
                    }
                    else if(item == '+')
                    {
                        normalWord += item;
                        var seperatedWord = generateRandomWord(normalWord);
                        words.Add(seperatedWord);
                    }
                    else
                    {
                        normalWord += item;
                    }
                }
                tempproduceSizeOfWords--;
            }

            foreach (var item in words.ToHashSet())
            {
                textBox1.AppendText(item);
            }
        }

        private String generateRandomWord(String subRule)
        {
            var validWord = "";
            var random = new Random().Next(0, 2);
            var seperatedWords = subRule.Split('+');

            if (random == 0)
            {
                return validWord += seperatedWords.First();
            }
            else
            {
                return validWord += seperatedWords.Last();
            }
        }

        private String generateRandomWord(String[] seperatedWords)
        {
            var validWord = "";
            var random = new Random().Next(0, 2);

            if (random == 0)
            {
                return validWord += seperatedWords.First();
            }
            else
            {
                return validWord += seperatedWords.Last();
            }
        }
        String aass = "";
        private void GenerateWord(String rule)
        {
            var item = rule[0];
            
                if (item=='(')
                {
                    if (!string.IsNullOrEmpty(aass))
                    {
                        producededWords.Add(aass);
                        rule = rule.Substring(aass.Length);
                    }
                    int openParenthesisIndex = rule.IndexOf('(');
                    int closingParenthesisIndex = rule.IndexOf(')');
                    String subRule = rule.Substring(openParenthesisIndex + 1, (closingParenthesisIndex - 1));
                    GenerateWord(subRule);
                }
                else if (item == '+')
                {
                    String[] seperatedWords = rule.Split("+");
                    var words =generateRandomWord(seperatedWords);
                    words.Trim('(');
                    words.Trim(')');
                    producededWords.Add(words);
                }
                else if(item == '*')
                {

                }
                else
                {
                    aass += item;
                }
           
        }

        private bool IsValidRegularExpression(string alphabet, string regularExpression)
        {
            foreach (var c in regularExpression)
            {
                if(c != '4' && c!='*' && c!='('&& c!= ')' && !alphabet.Contains(c))
                {
                    return false;
                }
            }
            return true;
        }
    }
}