我的代码应该将一个短语翻译成pig拉丁语。每个单词的末尾都必须有一个"ay",每个单词的第一个字母都应该放在"ay"之前ex wall="一直"有什么想法吗?这是我能想到的最简单的方法。。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace english_to_pig_latin
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("THIS IS A English to Pig Latin translator");
Console.WriteLine("ENTER Phrase");
string[] phrase = Console.ReadLine().Split(' ');
int words = phrase.Length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < words; i++)
{
//to add ay in the end
/*sb.Append(phrase[i].ToString());
sb.Append("ay ");
Console.WriteLine(sb);*/
}
Console.ReadLine();
}
}
}
首先,您需要定义您的pig拉丁规则。你的描述缺乏真正的拉丁规则。例如,正如你上面解释的那样,英语中的"sharp"被正确地"Pig Latinated"为"arpshay",而不是"harpsey"。(但我更喜欢使用"arp sh ay"来方便阅读PigLatin,并且使用连字符可以反向翻译回英语。)我建议你先找到Pig Latin的一些规则。你的开始是一个好的开始。您的代码现在将一个短语分成(几乎)个单词。请注意,您的代码会将"Please,Joe"转换为"Please"one_answers"Joe"tho,您可能不希望将逗号发送给逐字翻译。
在定义你的规则时,我建议你考虑如何将这些单词拉丁化:你好-->"ellohay"(一个正常的词),字符串-->"ingstray"("r"是移动到末尾的整个辅音字符串),apple-->"appleway"、"appleay"或"appleeyay"(取决于你的Pig拉丁语方言),queen-->'eenquay'('qu'是这里的辅音串),黄色-->"ellowyay"(这里y是辅音),节奏-->"ythmrhay"(这里y是元音),sky-->"yskay"(这里y是元音)。请注意,对于任何以"qu"开头的单词(如"queen"),这个"qu’"也是一个需要处理的特殊条件。请注意,当y在一个英语单词的开头时,它可能是一个辅音,但当y在单词的中间或结尾时,它是一个元音。
这些单词的连字符Pig拉丁语版本是:ello-h-ay、ing str-ay、("apple-way"、"apple-ay"或"apple-yay")、"een-qu-ay"、"ellow-y-y"、"ythm-rh-ay"one_answers"y-sk-ay"。连字符既可以更容易地阅读,也可以通过计算机解析器将Pig拉丁语反译成英语。但不幸的是,许多人只是把Pig拉丁词塞在一起,而没有显示出任何连字符分隔,因此反转翻译不可能简单而不含糊。
真正的猪拉丁语实际上是根据单词的发音,而不是拼写,所以如果没有一个非常复杂的单词到音素系统,这太难了。但大多数(优秀的)猪拉丁语翻译都会处理上述情况,而忽略其他例外情况,因为英语在发音方面确实是一种非常糟糕的语言。
所以我的第一个建议是制定一套规则。我的第二个建议是使用两个函数PigLatinizePhrase()
和PigLatinizeWord()
,其中PigLatinizePhrase()
方法将短语解析为单词(和标点符号),并为每个单词调用PigLatinizeWord()
,不包括任何标点符号。您可以使用一个简单的循环来遍历每个字符并测试char。IsLetter来确定它是否是一封信。如果它是一个字母,那么将它添加到字符串生成器中,然后移动到下一个字母。如果它不是一个字母,并且字符串生成器不为空,那么将该单词发送到您的单词分析器进行解析,然后将非字母添加到结果中。这将是您的PigLatinizePhrase()
方法的逻辑。这是我的代码,可以做到这一点:
/// <summary>
/// </summary>
/// <param name="eng">English text, paragraphs, etc.</param>
/// <param name="suffixWithNoOnset">Used to differentiate between Pig Latin dialects.
/// Known dialects may use any of: "ay", "-ay", "way", "-way", "yay", or "-yay".
/// Cooresponding translations for 'egg' will yield: "eggay", "egg-ay", "eggway", "egg-way", "eggyay", "egg-yay".
/// Or for 'I': "Iay", "I-ay", "Iway", "I-way", "Iyay", "I-yay".
/// </param>
/// <returns></returns>
public static string PigLatinizePhrase(string eng, string suffixWithNoOnset = "-ay")
{
if (eng == null) { return null; } // don't break if null
var word = new StringBuilder(); // only current word, built char by char
var pig = new StringBuilder(); // pig latin text
char prevChar = ' ';
foreach (char thisChar in eng)
{
// the "'" test is so "I'll", "can't", and "Ashley's" will work right.
if (char.IsLetter(thisChar) || thisChar == ''')
{
word.Append(thisChar);
}
else
{
if (word.Length > 0)
{
pig.Append(PigLatinizeWord(word.ToString(), suffixWithNoOnset));
word = new StringBuilder();
}
pig.Append(thisChar);
}
prevChar = thisChar;
}
if (word.Length > 0)
{
pig.Append(PigLatinizeWord(word.ToString(), suffixWithNoOnset));
}
return pig.ToString();
} // public static string PigLatinizePhrase(string eng, string suffixWithNoOnset = "-ay")
后缀WithNoOnset变量只需直接传递给PigLatinizeWord()
方法,它就可以准确地确定将使用Pig Latin的哪种"方言"。(请参阅源代码中方法前面的XML注释,以获得更清晰的信息。)
对于PigLatinizeWord()
方法,在对其进行实际编程时,我发现将此功能拆分为两种方法非常方便,一种方法将英语单词解析为Pig Latin关心的两个部分,另一种方法根据需要的Pig Latine版本,实际使用这两个部分。以下是这两个函数的源代码:
/// <summary>
/// </summary>
/// <param name="eng">English word before being translated to Pig Latin.</param>
/// <param name="suffixWithNoOnset">Used to differentiate between Pig Latin dialects.
/// Known dialects may use any of: "ay", "-ay", "way", "-way", "yay", or "-yay".
/// Cooresponding translations for 'egg' will yield: "eggay", "egg-ay", "eggway", "egg-way", "eggyay", "egg-yay".
/// Or for 'I': "Iay", "I-ay", "Iway", "I-way", "Iyay", "I-yay".
/// </param>
/// <returns></returns>
public static string PigLatinizeWord(string eng, string suffixWithNoOnset = "-ay")
{
if (eng == null || eng.Length == 0) { return eng; } // don't break if null or empty
string[] onsetAndEnd = GetOnsetAndEndOfWord(eng);
// string h = string.Empty;
string o = onsetAndEnd[0]; // 'Onset' of first syllable that gets moved to end of word
string e = onsetAndEnd[1]; // 'End' of word, without the onset
bool hyphenate = suffixWithNoOnset.Contains('-');
// if (hyphenate) { h = "-"; }
var sb = new StringBuilder();
if (e.Length > 0) { sb.Append(e); if (hyphenate && o.Length > 0) { sb.Append('-'); } }
if (o.Length > 0) { sb.Append(o); if (hyphenate) { sb.Append('-'); } sb.Append("ay"); }
else { sb.Append(suffixWithNoOnset); }
return sb.ToString();
} // public static string PigLatinizeWord(string eng)
public static string[] GetOnsetAndEndOfWord(string word)
{
if (word == null) { return null; }
// string[] r = ",".Split(',');
string uppr = word.ToUpperInvariant();
if (uppr.StartsWith("QU")) { return new string[] { word.Substring(0,2), word.Substring(2) }; }
int x = 0; if (word.Length <= x) { return new string[] { string.Empty, string.Empty }; }
if ("AOEUI".Contains(uppr[x])) // tests first letter/character
{ return new string[] { word.Substring(0, x), word.Substring(x) }; }
while (++x < word.Length)
{
if ("AOEUIY".Contains(uppr[x])) // tests each character after first letter/character
{ return new string[] { word.Substring(0, x), word.Substring(x) }; }
}
return new string[] { string.Empty, word };
} // public static string[] GetOnsetAndEndOfWord(string word)
我以前用JavaScript写过一个PigLatinize()方法,这对我来说很有趣
我认为您需要这个转换:phrase[i].Substring(1) + phrase[i][0] + "ay"