如何将输入输出为每个辅音之间带元音的字谜?

时间:2013-03-19 04:05:24

标签: c# algorithm anagram

我对编码比较陌生,我想制作一个可以输入的测试程序,并将其输出为anagram。但是字谜不仅仅是一堆乱七八糟的字母,它需要是一种可理解的“单词”(即如果我放入'恐龙',我想得到一些与'nisadoru'相反的东西而不是某种东西比如'dsrunsia')。如果进一步采取措施并不是太长,我也有兴趣让程序在输出中添加一个额外的字母(即如果我输入'恐龙',我可以收到'nisadorux')。

我不是在寻找可以添加到单词中的额外字母的选择,我希望我选择添加的字母。如果重要的话,这封信是x。所以所有的字谜都会包含一个额外的x。

我看起来很努力,但没有找到任何有用的帮助。我没有任何代码可以去,但是对于那些说我不会从简单的代码中学习的人,我更喜欢看一个完整的部分并解构它或弄清楚一切是如何工作的而不是试图把各种东西放在一起作为考验。

2 个答案:

答案 0 :(得分:1)

将你的字母数组拆分成两个数组,一个只有元音[a,e,i,o,u,y],另一个只剩下其他所有数组,dinosaur你会收到[d,n,r,s] - [a,i,o,u]然后,做一个字谜,扔掉仍然在数组中的组合字母数的随机数,选择相应的字母,将其添加到构造中的anagram中,然后从数组中删除。假设您的随机抛出6(从0开始),第一个数组的长度为4,从位置2的第二个数组(= 6-4)开始 - > 'O'。接下来随机(7)抛出2,从第一个数组中取'r',现在我们的anagram有or,数组有[d,n,s] - [a,i,u]。关于元音与辅音交换,跟踪你的字母最后被唤醒的数组,如果从一个数组中连续两次获取,则从另一个数组中取一个字母(随机)而不是从一个完整的一组中取出剩下的信件。

现在,您必须自己将此代码编入您的程序中。

答案 1 :(得分:1)

这是一个应该满足您所有需求的解决方案:

static class Program
{
    static readonly char[] Vowels = new []{'a', 'e', 'i', 'o', 'u', 'y'};
    static readonly Random r = new Random();

    static bool IsVowel(char c) { return Vowels.Contains(c); }
    static bool IsConsonant(char c) { return !IsVowel(c); }

    static string Scramble(string inpt)
    {
        string input = inpt + "x";
        List<char> vowelList = input.Where(IsVowel).ToList();
        List<char> consonantList = input.Where(IsConsonant).ToList();
        StringBuilder output = new StringBuilder();
        bool needVowel = false; // Start with a consonant, if possible.

        while (vowelList.Count > 0 || consonantList.Count > 0)
        {
            IList<char> charList = consonantList;
            if (consonantList.Count == 0 || (needVowel && vowelList.Count > 0))
            {
                charList = vowelList;
            }
            int randomIndex = r.Next(0, charList.Count);
            output.Append(charList.ElementAt(randomIndex));
            charList.RemoveAt(randomIndex);
            needVowel = !needVowel;
        }

        return output.ToString();
    }

    static void Main(string[] args)
    {
        foreach (var s in Enumerable.Repeat("dinosaur", 20).Select(Scramble))
        {
            Debug.WriteLine(s);
        }
    }
}