-2

ここでProject Euler #22 Python, 2205 points missing?と同じ問題を解決しています。、しかし、私は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);
    }
}

答えてくれてありがとう:)

4

3 に答える 3

1

結果が異なる理由は、チェコ語には特定の文字「CH」があり、「H」の後にあるため、正しい文化を使用せずにアルファベット順で並べると、このようなものになる可能性があります

aaa
bbb
ccc
czz
ddd
cha
于 2014-07-30T09:10:38.333 に答える
0

これは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);
}
于 2014-12-24T19:25:40.060 に答える
0

ここにはいくつかの問題があります。リーダーがストリームの最後に到達したかどうかは確認しません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();
于 2013-07-28T17:13:52.027 に答える