使用c#投影euler 22

本文关键字:euler 投影 使用 | 更新日期: 2023-09-27 18:25:10

我正在解决与Project Euler#22 Python相同的问题,缺少2205点?,但我使用的是C#。我找不到错误。这是我的代码:

class Program
{
    static List<string> pole;
    static string SaveName(StreamReader reader)
    {
        int znak = reader.Read();
        string jmeno = "";
        while ((znak < 'A') || (znak > 'Z'))
        {
            znak = reader.Read();
        }
        while (znak != ',')
        {
            jmeno = jmeno + (char) znak;
            znak = reader.Read();
            if (znak == 34) break;
        }
        return jmeno;
    }
    static void SaveNamesIntoList()
    {
        StreamReader reader = new StreamReader(@"../../../names.txt");
        while (reader.Read() != ';')
        {
            pole.Add(SaveName(reader));
        }
    }
    static void Main(string[] args)
    {
        pole = new List<string>();
        SaveNamesIntoList();
        pole.Sort();
        int sum = 0;
        int sum_word = 0;
        string name = "";
        for (int i = 0; i < pole.Count; i++)
        {
            name = pole[i];
            sum_word = 0;
            for (int u = 0; u < name.Length; u++)
            {
                sum_word += (name[u] - 'A' + 1);
            }
            sum += (sum_word * (i+1));
        }
        Console.WriteLine(sum);
    }
}

感谢您的回答:)

使用c#投影euler 22

你得到不同结果的原因是捷克语中有特定的字母"CH",而"CH"在"H"之后,所以按照字母顺序,如果不使用正确的区域性,你可以得到像这样的字符串

aaa
bbb
ccc
czz
ddd
cha

这里有一些问题。您不检查读取器是否到达流的末尾,您必须检查Read是否返回-1。如果是这样,那就是文件的末尾。最重要的是,你不会处理读者。。。

然后,正如Cedric在评论中指出的那样,您还没有真正对列表进行排序,因此即使将其更改为:,结果也是错误的

 using (var reader = new StreamReader("names.txt"))
 {
      while (reader.Read() != -1)
      {
          pole.Add(SaveName(reader));
      }
 }

你需要做的是添加这一行(这通常有点浪费,但我稍后会讲到):

pole = pole.OrderBy(x => x).ToList(); //<<----- this one
for (int i = 0; i < pole.Count; i++)
{
      name = pole[i];
      sum_word = 0;
      for (int u = 0; u < name.Length; u++)
      {
          sum_word += (name[u] - 'A' + 1);
      }
      sum2 += (sum_word*(i + 1));
 }

结果是871198282,这应该是正确的——至少人们在相关问题中是这么说的。

即便如此,我是否可以建议一种更简单的方法来解决整个问题:

var scores = Enumerable.Range('A', 'Z' - 'A' + 1)
                       .Select((i, ch) => new { Character = (char) i, Weight = ch + 1 })
                       .ToDictionary(key => key.Character, val => val.Weight);
var sum = File.ReadAllText("names.txt")
                          .Split(',')
                          .Select(x => x.Trim('"'))
                          .OrderBy(x => x)
                          .Select((x, i) => (i + 1)*x.Select(y => scores[y]).Sum())
                          .Sum();

这里有一个使用Linq的版本。

void Main()
{
    var file = @"C:'...location.of.file...'p022_names.txt";
    using (var reader = new StreamReader(file, Encoding.UTF8))
    {
        NameScore(reader.ReadToEnd().Replace("'"",string.Empty).Split(new[]{','})).Dump();  
    }
}
private long NameScore(string[] names)
{
    return names.OrderBy(o => o)
                .Select((l, i) => { return l.ToUpper().ToCharArray().Sum(s => (int)s - 64) * (i + 1);})
                .Sum(s => s);
}