示例#1
0
        private bool Initialize()
        {
            if (LojbanData.VOWELS.Contains(InitialLetter) || LojbanData.VOWELS.Contains(MedialLetter) || LojbanData.VOWELS.Contains(FinalLetter))
            {
                return(false);
            }

            if (InitialLetter == 'n')
            {
                if (MedialLetter == 'd')
                {
                    if (FinalLetter == 'j' || FinalLetter == 'z')
                    {
                        return(false);
                    }
                }
                else if (MedialLetter == 't')
                {
                    if (FinalLetter == 'c' || FinalLetter == 's')
                    {
                        return(false);
                    }
                }
            }

            Pair initialPair = new Pair(InitialLetter, MedialLetter, false);

            if (!initialPair.IsValid)
            {
                return(false);
            }
            Pair finalPair = new Pair(MedialLetter, FinalLetter, false);

            if (!finalPair.IsValid || !MorphologyHelper.IsPermissibleInitialPair(MedialLetter, FinalLetter))
            {
                return(false);
            }

            return(true);
        }
示例#2
0
        public static Tuple <string, int, string>[] GetLujvoVariants(params string[][] rafsi)
        {
            int count         = rafsi.Length;
            var rafsiScores   = new Tuple <string, RafsiForm, string> [count][];
            int lastIndex     = count - 1;
            int variantsCount = 1;
            var counts        = new int[count];

            for (int i = 0; i < count; ++i)
            {
                rafsiScores[i] = (
                    i == lastIndex ?
                    rafsi[i].Where(r => r.Count(c => c != '\'') <= 4) :
                    rafsi[i].Where(r => r.Count(c => c != '\'') != 4)
                    ).Select(
                    r => new Tuple <string, RafsiForm, string>(r, MorphologyHelper.GetRafsiForm(r, out string rafsiForm), rafsiForm)
                    ).ToArray();
                int rafsiCount = rafsiScores[i].Length;
                variantsCount *= rafsiCount;
                counts[i]      = rafsiCount;
            }

            bool isGreaterThanTwo = count > 2;
            var  variants         = new List <Tuple <string, int, string> >(variantsCount);
            var  indices          = new int[count];
            int  mainIndex        = 0;

            while (mainIndex < variantsCount)
            {
                for (int i = lastIndex; i >= 0; --i)
                {
                    ++indices[i];
                    if (indices[i] == counts[i])
                    {
                        indices[i] = 0;
                    }
                    else
                    {
                        break;
                    }
                }

                int    variantScore                 = 0;
                var    variant                      = new KeyValuePair <string, RafsiForm> [count];
                string variantStr                   = "";
                string variantForm                  = "";
                int    variantLength                = 0;
                char   lastRafsiLastChar            = '_';
                bool   lastRafsiRequiresHyphenation = false;
                bool   doHyphenation                = isGreaterThanTwo || variant[lastIndex].Value != RafsiForm.CVC;
                var    joints       = new List <KeyValuePair <int, int> >();
                int    firstYHyphen = -1;

                for (int i = 0; i < count; ++i)
                {
                    var gismuRafsi = rafsiScores[i][indices[i]];

                    bool notLast          = i != lastIndex;
                    bool first            = i == 0;
                    bool doConsonantCheck = !first && lastRafsiLastChar != '_';
                    int  rafsiLength      = gismuRafsi.Item1.Length;
                    char lastChar         = gismuRafsi.Item1[rafsiLength - 1];
                    if (lastChar.IsVowel())
                    {
                        lastChar = '_';
                    }

                    variantScore -= ((int)gismuRafsi.Item2) * 10;
                    variantScore -= gismuRafsi.Item1.Count(c => c.IsVowel() && c != 'y');

                    if (doConsonantCheck)
                    {
                        Pair pair = new Pair(lastRafsiLastChar, gismuRafsi.Item1[0], false);
                        if (!pair.IsValid)
                        {
                            variantStr   += 'y';
                            variantForm  += '-';
                            variantScore += 100;
                            if (firstYHyphen == -1)
                            {
                                firstYHyphen = variantLength;
                            }
                            ++variantLength;
                        }
                        else if (firstYHyphen == -1)
                        {
                            joints.Add(new KeyValuePair <int, int>(variantLength - 1, variantForm.Length));
                            variantForm += '_';
                        }
                    }
                    else if (lastRafsiRequiresHyphenation)
                    {
                        // if previous rafsi ends with 'r', must hyphenate with an 'n' instead
                        variantStr   += gismuRafsi.Item1[0] == 'r' ? 'n' : 'r';
                        variantForm  += '-';
                        variantScore += 100;
                        ++variantLength;
                    }

                    variantStr  += gismuRafsi.Item1;
                    variantForm += gismuRafsi.Item3;

                    if (gismuRafsi.Item2 == RafsiForm.CV_V)
                    {
                        variantScore -= 500;
                    }

                    if (doHyphenation && notLast && (gismuRafsi.Item2 == RafsiForm.CVV || gismuRafsi.Item2 == RafsiForm.CV_V) && (isGreaterThanTwo || first))
                    {
                        doHyphenation = false;
                        lastRafsiRequiresHyphenation = true;
                    }
                    else
                    {
                        if ((gismuRafsi.Item2 == RafsiForm.CVC_C || gismuRafsi.Item2 == RafsiForm.CVC_CV) && firstYHyphen == -1)
                        {
                            joints.Add(new KeyValuePair <int, int>(variantLength + 2, variantForm.Length + 3));
                        }
                        if (notLast && gismuRafsi.Item3.Where(c => c != '_').Count() == 4)
                        {
                            variantStr   += 'y';
                            variantForm  += '-';
                            variantScore += 100;
                            if (firstYHyphen == -1)
                            {
                                firstYHyphen = variantLength;
                            }
                            ++variantLength;
                        }
                    }

                    variant[i]     = new KeyValuePair <string, RafsiForm>(gismuRafsi.Item1, gismuRafsi.Item2);
                    variantLength += rafsiLength;
                }

                if (joints.Count > 0)
                {
                    // if there are no y-hyphens, searches joints throughout the entire word
                    // only for debugging purposes, as no further joints are added after the y-hyphen is set
                    if (firstYHyphen == -1)
                    {
                        firstYHyphen = variantLength;
                    }
                    if (joints.All(j => MorphologyHelper.IsPermissibleInitialPair(variantStr[j.Key], variantStr[j.Key + 1])))
                    {
                        var firstJoint = joints[0];
                        variantStr  = variantStr.Insert(firstJoint.Key, "y");
                        variantForm = variantForm.Substring(0, firstJoint.Value) + '-' + variantForm.Substring(firstJoint.Value + 1);
                        ++variantLength;
                        variantScore += 100;
                    }
                }
                variantScore += variantLength * 1000;

                variants.Add(new Tuple <string, int, string>(variantStr, variantScore, variantForm));

                ++mainIndex;
            }

            return(variants.OrderBy(v => v.Item2).ToArray());
        }