如何解决 Rosetta Stone 编码挑战 C#

问题描述 投票:0回答:1

无论我重新阅读并尝试解决这个问题多少次,我都无法理解它。我不明白如何让我的代码翻译所需的文本而不对整个内容进行硬编码。

问题来了:

罗塞塔石碑 编程挑战描述: 罗塞塔石碑是一种写在石头上的古老法令,考古学家用它在希腊语和古埃及语言之间进行翻译。

编写一个程序,使用 Rosetta 来解码消息进行翻译。 “罗塞塔”将是一系列与英文单词或字符配对的字符集。如果你正确翻译加密消息,你就会发现隐藏的消息。

提示:必须保留不属于片段的空间

输入: 将给出多行输入。输入的第一行将是要翻译成英文的消息。

所有其他输入行将是需要翻译的 Rosetta。每对片段将由管道字符分隔,每行输入一对。

例如:

Hola Mundo
Mundo|World
Lunes|Monday
Hola|Hello
Translates:
Hola Mundo

进入:

Hello World

输出: 翻译后的文本,将是一个真正的英语短语

测试1

测试输入

Hola Mundo
Mundo|World
Lunes|Monday
Hola|Hello

预期产出

Hello World

测试2 测试输入

mieux vaut prévenir que guérir
merci|thank you
que|than
malade|sick
mieux|better
guérir|to heal
chien|dog
vaut prévenir|to prevent
beurre|butter
s'il vous plaît|please

Expected Output

better to prevent than to heal

测试3 测试输入

5748494348 574159 544845 57494E44 424C4F5753
41|A
42|B
43|C
44|D
45|E
46|F
47|G
48|H
49|I
4A|J
4B|K
4C|L
4D|M
4E|N
4F|O
50|P
51|Q
52|R
53|S
54|T
55|U
56|V
57|W
58|X
59|Y
5A|Z

预期产出

WHICH WAY THE WIND BLOWS

这是我当前的代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

public static class Program {
  static void Main() 
  {
    using (StreamReader reader = new StreamReader(Console.OpenStandardInput()))
      
    while (!reader.EndOfStream) 
    {
      string input = reader.ReadLine();
      string output = RosettaStoneTranslate(input);
      
      Console.WriteLine(output);
    }
  }
  
  static string RosettaStoneTranslate(string input)
  {
    string[] lines = input.Split('\n');
    string message =lines[0];
    
    //parse Rosetta Stone pairs.  
    Dictionary<string, string> rosettaDict = new Dictionary<string, string>();
    for (int i = 1; i < lines.Length - 1; i++)
    {
      string[] pair = lines[i].Trim().Split('|');
      rosettaDict[pair[0]] = pair[i];
    }
    
    string[] fragments = message.Split(' ');
    List<string> translatedFragments = new List<string>();
    
      foreach (string fragment in fragments)
      {
        if (rosettaDict.TryGetValue(fragment, out string translation))
        {
          translatedFragments.Add(translation);
        }
        else
        {
          translatedFragments.Add(fragment);
        }
      }
      
      //reconstruct translated message.
      string translatedMessage = string.Join(" ", translatedFragments);
        return translatedMessage;
    }
  }

请给我解释一下如何找到解决方案的过程!

c# dictionary translate
1个回答
0
投票

您有一些问题。第一,您需要在调用

RosettaStoneTranslate
之前构建一个线路列表。

这是执行此操作的

Main
方法:

static void Main()
{
    var input = new List<string>();
    using (StreamReader reader = new StreamReader(Console.OpenStandardInput()))
    {
        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();
            if (line == "")
                break;
            input.Add(line);
        }
    }
    Console.WriteLine(RosettaStoneTranslate(input.ToArray()));
}

然后,

RosettaStoneTranslate
的开头有一个小变化,因为我们发送的是完整列表而不是单个字符串。

static string RosettaStoneTranslate(string[] lines)
{
    string message = lines[0];

最后,你在

for
循环中遇到了一个小错误。您需要
lines.Length
而不是
lines.Length - 1

    for (int i = 1; i < lines.Length; i++)

现在可以使用了。

© www.soinside.com 2019 - 2024. All rights reserved.