Пример #1
0
        public List <LetterData> GetAllLetterAlterations(List <LetterData> baseLetters, LetterAlterationFilters letterAlterationFilters)
        {
            List <LetterData> letterPool = new List <LetterData>();

            // Filter: only 1 base or multiple bases?
            if (!letterAlterationFilters.differentBaseLetters)
            {
                var chosenLetter = baseLetters.RandomSelectOne();
                baseLetters.Clear();
                baseLetters.Add(chosenLetter);
            }

            // Get all alterations for the given bases
            foreach (var baseLetter in baseLetters)
            {
                // Check all alterations of this base letter
                var letterAlterations = GetLettersWithBase(baseLetter.GetId());
                List <LetterData> availableVariations = new List <LetterData>();
                foreach (var letterData in letterAlterations)
                {
                    if (!FilterByDiacritics(letterAlterationFilters.ExcludeDiacritics, letterData))
                    {
                        continue;
                    }
                    if (!FilterByLetterVariations(letterAlterationFilters.ExcludeLetterVariations, letterData))
                    {
                        continue;
                    }
                    if (!FilterByDipthongs(letterAlterationFilters.excludeDipthongs, letterData))
                    {
                        continue;
                    }
                    availableVariations.Add(letterData);
                }
                //Debug.Log("N availableVariations  " + availableVariations.Count + "  for " + baseLetter.GetId());

                List <LetterData> basesForForms = new List <LetterData>(availableVariations);
                basesForForms.Add(baseLetter);
                //Debug.Log("N bases for forms: " +  basesForForms.Count);
                if (letterAlterationFilters.includeForms)
                {
                    // Place forms only inside the pool, if needed
                    foreach (var baseForForm in basesForForms)
                    {
                        var availableForms = ExtractLettersWithForms(baseForForm);

                        if (letterAlterationFilters.oneFormPerLetter)
                        {
                            // If we are using forms and only one form per letter must appear, add just one at random
                            letterPool.Add(availableForms.RandomSelectOne());
                        }
                        else
                        {
                            // Add all the (different) forms
                            var visualFormComparer = new StrictLetterDataComparer(LetterEqualityStrictness.WithVisualForm);
                            foreach (var availableForm in availableForms)
                            {
                                if (letterAlterationFilters.visuallyDifferentForms && letterPool.Contains(availableForm, visualFormComparer))
                                {
                                    continue;
                                }
                                letterPool.Add(availableForm);
                            }
                        }
                    }
                }
                else
                {
                    // Place just the isolated versions
                    letterPool.AddRange(basesForForms);
                }
            }

            return(letterPool);
        }
Пример #2
0
        private void SimulateQuestionBuilder(QuestionBuilderType builderType)
        {
            LetterAlterationFilters letterAlterationFilters = null;

            switch (lettersVariationChoice)
            {
            case 0:
                letterAlterationFilters = LetterAlterationFilters.FormsOfSingleLetter;
                break;

            case 1:
                letterAlterationFilters = LetterAlterationFilters.FormsOfMultipleLetters;
                break;

            case 2:
                letterAlterationFilters = LetterAlterationFilters.MultipleLetters;
                break;

            case 3:
                letterAlterationFilters = LetterAlterationFilters.PhonemesOfSingleLetter;
                break;

            case 4:
                letterAlterationFilters = LetterAlterationFilters.PhonemesOfMultipleLetters;
                break;

            case 5:
                letterAlterationFilters = LetterAlterationFilters.FormsAndPhonemesOfMultipleLetters;
                break;
            }


            var builderParams        = SetupBuilderParameters();
            IQuestionBuilder builder = null;

            switch (builderType)
            {
            case QuestionBuilderType.RandomLetters:
                builder = new RandomLettersQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, firstCorrectIsQuestion: true, parameters: builderParams);
                break;

            case QuestionBuilderType.RandomLetterForms:
                builder = new RandomLetterAlterationsQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, letterAlterationFilters: letterAlterationFilters, parameters: builderParams);
                break;

            case QuestionBuilderType.Alphabet:
                builder = new AlphabetQuestionBuilder(parameters: builderParams);
                break;

            case QuestionBuilderType.LettersBySunMoon:
                builder = new LettersBySunMoonQuestionBuilder(nPacks: nPacks, parameters: builderParams);
                break;

            case QuestionBuilderType.LettersByType:
                builder = new LettersByTypeQuestionBuilder(nPacks: nPacks, parameters: builderParams);
                break;

            case QuestionBuilderType.LettersInWord:
                builder = new LettersInWordQuestionBuilder(nRounds: nPacks, nPacksPerRound: nPacksPerRound, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, useAllCorrectLetters: true, parameters: builderParams);
                break;

            case QuestionBuilderType.LetterFormsInWords:
                builder = new LetterFormsInWordsQuestionBuilder(nPacks, nPacksPerRound, parameters: builderParams);
                break;

            case QuestionBuilderType.LetterAlterationsInWords:
                builder = new LetterAlterationsInWordsQuestionBuilder(nPacks, nPacksPerRound, parameters: builderParams, letterAlterationFilters: letterAlterationFilters);
                break;

            case QuestionBuilderType.CommonLettersInWords:
                builder = new CommonLetterInWordQuestionBuilder(nPacks: nPacks, nWrong: nWrongAnswers, parameters: builderParams);
                break;

            case QuestionBuilderType.RandomWords:
                builder = new RandomWordsQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, firstCorrectIsQuestion: true, parameters: builderParams);
                break;

            case QuestionBuilderType.OrderedWords:
                builderParams.wordFilters.allowedCategories = new[] { WordDataCategory.Numbers };
                builder = new OrderedWordsQuestionBuilder(parameters: builderParams);
                break;

            case QuestionBuilderType.WordsWithLetter:
                builder = new WordsWithLetterQuestionBuilder(nRounds: nPacks, nPacksPerRound: nPacksPerRound, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, parameters: builderParams);
                break;

            case QuestionBuilderType.WordsByForm:
                builder = new WordsByFormQuestionBuilder(nPacks: nPacks, parameters: builderParams);
                break;

            case QuestionBuilderType.WordsByArticle:
                builder = new WordsByArticleQuestionBuilder(nPacks: nPacks, parameters: builderParams);
                break;

            case QuestionBuilderType.WordsBySunMoon:
                builder = new WordsBySunMoonQuestionBuilder(nPacks: nPacks, parameters: builderParams);
                break;

            case QuestionBuilderType.WordsInPhrase:
                builder = new WordsInPhraseQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, useAllCorrectWords: false, usePhraseAnswersIfFound: true, parameters: builderParams);
                break;

            case QuestionBuilderType.PhraseQuestions:
                builder = new PhraseQuestionsQuestionBuilder(nPacks: nPacks, nWrong: nWrongAnswers, parameters: builderParams);
                break;
            }

            var questionPacksGenerator = new QuestionPacksGenerator();

            questionPacksGenerator.GenerateQuestionPacks(builder);
        }