C# 一个人怎么能把输入输出为一个在每个辅音之间有元音的字谜呢?

C# 一个人怎么能把输入输出为一个在每个辅音之间有元音的字谜呢?,c#,algorithm,anagram,C#,Algorithm,Anagram,我对编码比较陌生,我想做一个测试程序,它可以接受输入,并将其作为一个字谜输出。但是这个字谜不能只是一堆字母,它需要是一个可以理解的“单词”(也就是说,如果我加上“恐龙”,我想得到一些类似“nisadoru”的东西作为回报,而不是像“dsrunsia”这样的东西)。如果把事情再向前推进一步不算太长,我还想让程序在输出中添加一个额外的字母(也就是说,如果我输入‘恐龙’,我可以收到‘nisadorux’) 我不是在寻找一个额外的字母来添加到这个词的选择,我希望我选择的字母被添加。如果有关系的话,这个字

我对编码比较陌生,我想做一个测试程序,它可以接受输入,并将其作为一个字谜输出。但是这个字谜不能只是一堆字母,它需要是一个可以理解的“单词”(也就是说,如果我加上“恐龙”,我想得到一些类似“nisadoru”的东西作为回报,而不是像“dsrunsia”这样的东西)。如果把事情再向前推进一步不算太长,我还想让程序在输出中添加一个额外的字母(也就是说,如果我输入‘恐龙’,我可以收到‘nisadorux’)

我不是在寻找一个额外的字母来添加到这个词的选择,我希望我选择的字母被添加。如果有关系的话,这个字母是x。所以所有的字谜都会包含一个额外的x


我努力寻找,但没有找到任何有用的帮助。我没有任何代码可以编写,但是对于那些说我不会从简单的代码中学习的人来说,我更喜欢查看一个完整的部分并对其进行解构,或者找出每件事情是如何工作的,而不是尝试将各种事情放在一起作为一个测试

将字母数组分为两个数组,一个只有元音
[a,e,i,o,u,y]
,另一个所有其他的,对于
恐龙
你将收到
[d,n,r,s]-[a,i,o,u]
然后,要做一个字谜,为数组中的字母组合数量抛出一个随机数,选择一个对应的字母,将其添加到构建中的字谜中,然后从数组中删除。假设您的随机抛出6(基于0),第一个数组的长度为4,从第二个数组的位置2(=6-4)->“o”开始。接下来随机(7)抛出2,从第一个数组中取“r”,现在我们的字谜有
,数组有
[d,n,s]-[a,i,u]
。关于元音与辅音的交换,要记录你的字母最后被唤醒的数组,如果从一个数组中有两个连续的取数,那么从另一个数组中取一个字母(随机),而不是从一整套剩余的字母中取数


现在,您必须自己将其编码到您的程序中。

这里有一个解决方案,可以满足您的所有需求:

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);
        }
    }
}
静态类程序
{
静态只读字符[]元音=新[]{'a','e','i','o','u','y'};
静态只读随机r=新随机();
静态bool是元音(charc){返回元音。包含(c);}
静态布尔是谐音(char c){return!是元音(c);}
静态字符串加扰(字符串输入)
{
字符串输入=输入+x;
List vowelList=input.Where(IsVowel.ToList();
List consonantList=input.Where(IsConsonant.ToList();
StringBuilder输出=新的StringBuilder();
bool needVowel=false;//如果可能,以辅音开头。
while(votellist.Count>0 | | consonantList.Count>0)
{
IList charList=辅音列表;
if(consonantList.Count==0 | |(needvowell&&vowelList.Count>0))
{
charList=元音列表;
}
int randomIndex=r.Next(0,charList.Count);
Append(charList.ElementAt(randomIndex));
charList.RemoveAt(随机索引);
需要元音=!需要元音;
}
返回output.ToString();
}
静态void Main(字符串[]参数)
{
foreach(可枚举的变量s。重复(“恐龙”,20)。选择(加扰))
{
Debug.WriteLine(s);
}
}
}

那你试过什么?正如我说的,还没有。我几乎什么都不知道(我会做一点Java,从中我只知道一些基础知识),我不知道从哪里开始。我想看看代码,通过阅读和理解来学习,并学习如何将代码的各个方面融入到未来的代码中,等等。那么,你最好从基础开始,即C#中的字符串操作。Y不是元音,我试图删除Y,但它不允许,因为我需要6个以上的更改来完成编辑。@ZafKhan为什么#padding#我收回Y也是元音。哇!我今天学到了一些东西![来源:为什么每次都会重新生成Random?这样,在短时间内连续调用扰码()会产生相同的结果。我不确定为什么new Random((int)…ticks…)比普通new Random()哪些使用系统时间anyway@Martheen每次置乱都会重新生成Random。无论每次执行的距离有多近,都会有不同的滴答声,因为:“一个滴答声表示一百纳秒或一千万分之一秒。一毫秒内有10000个滴答声。”种子方法来自。@Martheen还使用“ticks”可以确保您不存在频繁初始化的问题。也就是说:我同意Random应该在整个程序中只进行一次种子设定。但是由于我没有包括
main
的主体,所以我认为最好在这里包括种子设定。不。只是尝试了var data=Enumerable.Repeat(“falectia”,20)。选择(加扰).ToList();data.ForEach(Console.WriteLine);和瞧,相同的结果对tick的类似快速调用也会产生相同的值。此外,也显示了这种情况。对于像这样的普通函数调用,可以在单个tick上执行多个调用。