无论我重新阅读并尝试解决这个问题多少次,我都无法理解它。我不明白如何让我的代码翻译所需的文本而不对整个内容进行硬编码。
问题来了:
罗塞塔石碑 编程挑战描述: 罗塞塔石碑是一种写在石头上的古老法令,考古学家用它在希腊语和古埃及语言之间进行翻译。
编写一个程序,使用 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;
}
}
请给我解释一下如何找到解决方案的过程!
您有一些问题。第一,您需要在调用
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++)
现在可以使用了。