我的代码应该将一个短语翻译成猪拉丁语。每个单词的末尾必须有一个“ay”,每个单词的每个首字母都应放在“ay”之前 ex wall =“allway” 有任何想法吗?这是我能想到的最简单的方法..
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();
}
}
}
答案 0 :(得分:2)
首先,你需要定义你的猪拉丁规则。你的描述缺乏真正的猪拉丁规则。例如,正如上面的解释所解释的那样,英语“sharp”正确地将“Pig-Latinized”称为“arpshay”,而不是“harpsay”。 (但我更喜欢使用'arp-sh-ay'来促进阅读PigLatin以及使用连字符使得有可能将翻译翻译成英语。)我建议你先找一些Pig-Latin的规则。你的开始是个好的开始。您的代码现在将短语分成(几乎)单词。请注意,您的代码会将“Please,Joe”变为“Please”和“Joe”,并且您可能不希望将逗号发送到您的逐字翻译器。
在定义规则时,我建议您考虑如何使用Pig-Latin-ize这些词: 你好 - &gt; 'ellohay'(一个正常的词), string - &gt; 'ingstray'('str'是整个辅音字符串移到最后), apple - &gt; 'appleway','appleay'或'appleyay',(取决于你的Pig-Latin方言), 女王 - &gt; 'eenquay'('qu'是这里的辅音字符串), 黄色 - &gt; 'ellowyay'(y在这里是辅音), 节奏 - &gt; 'ythmrhay'(你在这里是元音), 天空 - &gt; 'yskay'(你在这里是元音)。 请注意,对于任何以'qu'开头的单词(如'queen'),此'qu'是一个需要处理的特殊条件。请注意,y在开始英语单词时可能是辅音,但在单词的中间或结尾处是元音。
这些单词的带连字符的Pig拉丁语版本将是: ello-h-ay,ing-str-ay,('apple-way','apple-ay'或'apple-yay'),'een-qu-ay','ellow-y-ay',' ythm-rh-ay'和'y-sk-ay'。连字符允许更容易阅读以及通过计算机解析器将Pig Latin反转回英语的能力。但不幸的是,很多人只是将猪拉丁语拼凑在一起而没有显示任何连字符分离,因此不能简单地反转翻译。
真正的猪拉丁真的是靠这个词的声音,而不是拼写,所以没有一个非常复杂的单词到音素系统,这太难了。但大多数(好的)猪拉丁文写作翻译人员处理上述情况并忽略其他例外情况,因为在发音时,英语是一种非常糟糕的语言。
所以我的第一个建议是获得一套规则。我的第二个建议是使用两个函数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 = '\0';
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")
suffixWithNoOnset变量直接传递给PigLatinizeWord()
方法,它确切地确定将使用Pig Latin的“方言”。 (为了更加清楚,请参阅源代码中方法之前的XML注释。)
对于PigLatinizeWord()
方法,在实际编程之后,我发现将此功能拆分为两种方法非常方便,一种方法是将英语单词解析为Pig Latin所关注的两部分,以及另外,根据所需的猪拉丁语版本来实际做这两个部分所需要的。以下是这两个函数的源代码:
/// <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()方法,这对我来说很有趣。 :)我很喜欢制作具有更多功能的C#版本,使其能够翻译为Pig Latin的6种不同的“方言”,特别是因为C#是我最喜欢的(编程)语言。 ;)
答案 1 :(得分:0)
我认为你需要这种转变:phrase[i].Substring(1) + phrase[i][0] + "ay"