Project Euler : Problem 22 『Names scores』

namesnames / okfn


問題

projecteuler.net
 names.txt内の名前を辞書順にランク付けする。
その後、名前の各文字がアルファベット何文字目かを調べて和をとり、名前のランクと掛ける。
names.txt内の総ネームスコアはいくらか?


つまり?

 ABCさんとHIさんとDEFGさんがいるとする。
辞書順に並ぶとこう。


ABC, DEFG, HI


 ランクはABCさんが1、DEFGさんが2、HIさんが3。
次に各アルファベットが何文字目か調べて和をとる。
Aは1番目だから…


ABC, DEFG, HI
→ 1+2+3, 4+5+6+7, 8+9
→ 6, 22, 17


これにランクを掛けて、和をとる。

6×1 + 22×2 + 17×3
= 6 + 44 + 34
= 84


 そんなに難しくなさそう。


コード
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace Problem22
{
    class Program
    {
        static String[] names;

        static void Main(string[] args)
        {
            ReadNames();

            Debug.WriteLine(TotalNameScore());
        }

        /// <summary>
        /// 名前ファイルの読み込みとソート
        /// </summary>
        static void ReadNames()
        {
            String path = @"..\..\names.txt";

            names = File.ReadAllText(path).Split(',').Select(obj => obj.Replace("\"", "")).ToArray();

            Array.Sort(names);
        }

        /// <summary>
        /// 全名前スコアを求める
        /// </summary>
        static Int64 TotalNameScore()
        {
            Int64 sum = 0;

            for (int i = 0; i < names.Length; i++)
            {
                int rank = i + 1;
                int score = 0;

                foreach (char c in names[i])
                {
                    score += (c - '@');
                }

                sum += (rank * score);
            }

            return sum;
        }
    }
}
答え

 871198282



幻想人名辞典

幻想人名辞典

世界史のための人名辞典

世界史のための人名辞典

クリエーターのためのネーミング辞典 (一般向辞典)

クリエーターのためのネーミング辞典 (一般向辞典)