如何正确地集成代码



我的代码应该将一个短语翻译成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"

最新更新