如何正确地集成代码

时间:2013-12-02 16:11:20

标签: c#

我的代码应该将一个短语翻译成猪拉丁语。每个单词的末尾必须有一个“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();
        }
    }
}

2 个答案:

答案 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"