如何将输入输出为每个辅音之间带有元音的字谜?
Posted
技术标签:
【中文标题】如何将输入输出为每个辅音之间带有元音的字谜?【英文标题】:How can one take input and output it as an anagram with vowels between each consonant? 【发布时间】:2013-03-07 15:26:27 【问题描述】:我对编码比较陌生,我想制作一个可以接受输入并将其作为字谜输出的测试程序。但是字谜不能只是一堆乱七八糟的字母,它需要是某种可以理解的“词”(即,如果我输入“恐龙”,我想得到一些类似于“nisadoru”的东西作为回报,而不是一些东西像'dsrunsia')。如果更进一步并不太牵强,我也有兴趣让程序在输出中添加一个额外的字母(即,如果我输入“恐龙”,我可以收到“nisadorux”)。
我不是在寻找要添加到单词的额外字母的选择,我希望添加我选择的字母。如果重要的话,字母是 x。所以所有的字谜都会包含一个额外的 x。
我努力寻找,但没有找到任何有用的帮助。我没有任何代码可以关闭,但是对于那些说我不会从简单地给出代码中学习的人,我更喜欢查看一个完整的部分并解构它或弄清楚一切是如何工作的,而不是试图把各种各样的东西放在一起作为测试。
【问题讨论】:
那你有什么尝试? 正如我所说,还没有。我几乎一无所知(我会一点 Java,而且我只知道一些基础知识)而且我不知道从哪里开始。我想通过阅读和理解来查看代码并从中学习,并学习将它的各个方面融入到未来的代码中,等等。 那么,您最好的选择是从基础开始,即 C# 中的字符串操作。 msdn.microsoft.com/en-us/library/vstudio/… 【参考方案1】:将你的字母数组分成两个数组,一个只有元音[a,e,i,o,u,y]
,另一个是其余的,对于dinosaur
,你会收到[d,n,r,s] - [a,i,o,u]
仍然在数组中的字母数,选择相应的字母,将其添加到您的字谜中,然后从数组中删除。假设您的随机抛出 6(从 0 开始),第一个数组的长度为 4,取自位置 2 (=6-4) -> 'o' 的第二个数组。下一个 random(7) 抛出 2,从第一个数组中获取 'r',现在我们的 anagram 有 or
并且数组有 [d,n,s] - [a,i,u]
。关于元音与辅音互换,跟踪你的字母最后被唤醒的数组,如果从一个数组中连续取两个字母,从另一个(随机)取一个字母,而不是从一组完整的剩下的字母。
现在,您必须自己将其编码到您的程序中。
【讨论】:
Y 不是元音,我试图删除 Y 但它不允许我,因为我需要 6 次以上的更改才能完成编辑。 @ZafKhan 为什么? #padding# 我收回 Y 也是元音。哇!我今天学到了一些东西! [来源:simple.wikipedia.org/wiki/Vowel]【参考方案2】:这是一个可以满足您所有需求的解决方案:
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);
【讨论】:
Random 每次都重新生成的任何特殊原因?这样,在短时间内连续调用 Scramble() 将产生相同的结果。而且我不确定为什么 new Random((int) ... ticks...) 比使用系统时间的普通 new Random() 更好 @Martheen Random 为每次打乱重新生成。从(From the documentation) 开始,无论每次执行距离有多近,滴答声都会有所不同:“单个滴答声代表一百纳秒或百万分之一秒。一毫秒内有 10,000 个滴答声。”种子方法来自documentation for Random。 @Martheen 另外,使用“ticks”可确保您不会遇到频繁初始化的问题。话虽这么说:我同意 Random 应该只为整个程序播种一次。但由于我不包括main
的正文,我认为最好在此处包括播种。
不。刚试过 var data = Enumerable.Repeat("faleticia", 20).Select(Scramble).ToList(); data.ForEach(Console.WriteLine);瞧,相同的结果
对 Ticks 的类似快速调用也会产生相同的值。此外,social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/… 也显示了这种情况。在像这样的微不足道的函数调用中,可以一次完成多个调用。以上是关于如何将输入输出为每个辅音之间带有元音的字谜?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写一个函数,将句子中每个单词开头的所有辅音字符串转换为“r”,直到它变成元音?