どーも、みつおです。
基本的にプロジェクトオイラーでクラス使わなくてもいいかと思ってたけど、今回は使った方が可読性が上がると思ったので使用したよ。
問題
5000個以上の名前が書かれている46Kのテキストファイル
names.txt を用いる. まずアルファベット順にソートせよ.
のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.
たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.
ファイル中の全名前のスコアの合計を求めよ.
出典:Problem22
解答
読み込みデータは「names.txt」を参照してね。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Problem22
{
public enum Alphabet
{
A = 1,
B = 2,
C = 3,
D = 4,
E = 5,
F = 6,
G = 7,
H = 8,
I = 9,
J = 10,
K = 11,
L = 12,
M = 13,
N = 14,
O = 15,
P = 16,
Q = 17,
R = 18,
S = 19,
T = 20,
U = 21,
V = 22,
W = 23,
X = 24,
Y = 25,
Z = 26
}
public class Student
{
public string Name { set; get; }
public int Score { set; get; }
public Student()
{
this.Name = "";
this.Score = 0;
}
public Student(string name)
{
//名前
this.Name = name;
//名前のスコア
this.Score = GetScore(name);
}
public int GetScore(string name)
{
int ret = 0;
//名前の長さ分ループ
for (int i = 0; i < name.Length; i++)
{
//文字のアルファベットを取得
var enmVal = (Alphabet)Enum.Parse(typeof(Alphabet), name[i].ToString(), true);
//アルファベットを数値に変換
int data = (int)Enum.ToObject(typeof(Alphabet), enmVal);
//アルファベットの数値を足しこむ
ret += data;
}
return ret;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Solve());
Console.ReadLine();
}
private static long Solve()
{
long ret = 0;
int no = 0;
//ファイルを読み込んで生徒リストを作成
var stlist = ReadFile(@"C:\Work\プロジェクトオイラー\問題22\names.txt");
//名前の順にソート
stlist.Sort((a, b) => a.Name.CompareTo(b.Name));
//生徒数分ループ
for (int i = 0; i < stlist.Count(); i++)
{
//リストの順序を取得
no = i + 1;
//順序と名前のスコアを掛け合わせた値を足しこむ
ret += no * stlist[i].Score;
}
return ret;
}
private static List<Student> ReadFile(string filepath)
{
List<Student> ret = new List<Student>();
using (StreamReader file = new StreamReader(filepath))
{
//ファイルを読み込み
string line = file.ReadLine();
//カンマで分割
string[] list = line.Split(',');
string s = "";
//名前の数分ループ
for (int i = 0; i < list.Count(); i++)
{
s = list[i].Trim('"');
//生徒クラスのインスタンスを生成
Student tmp = new Student(s);
//リストに追加
ret.Add(tmp);
}
}
return ret;
}
}
}
出力
871198282


コメント