どーも、みつおです。
問題
三角数のn項は tn = ½n(n+1)で与えられる. 最初の10項は
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …である.
単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば SKY は 19 + 11 + 25 = 55 = t10である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.
16Kのテキストファイル words.txt 中に約2000語の英単語が記されている. 三角語はいくつあるか?
出典:Problem42
解答
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Problem42
{
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 Data
{
public string Word { set; get; }
public int Score { set; get; }
public Data()
{
this.Word = "";
this.Score = 0;
}
public Data(string word)
{
this.Word = word;
this.Score = GetScore(word);
}
public int GetScore(string word)
{
int ret = 0;
//単語のアルファベットの数値の和
for (int i = 0; i < word.Length; i++)
{
//単語のアルファベットを数値に変換
var enmVal = (Alphabet)Enum.Parse(typeof(Alphabet), word[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 int Solve()
{
int ret = 0;
//三角数のリストを作成
var sankakulist = CreateSankakuList();
//ファイルを読み込み
var datalist = CreateDataList();
foreach(var data in datalist)
{
//三角数を取得
var find = sankakulist.Find(tmp => tmp == data.Score);
//三角数が見つかればカウントアップ
if (0 < find) ret++;
}
return ret;
}
private static List<Data> CreateDataList()
{
List<Data> datalist = new List<Data>();
//ファイルの読み込み
using (StreamReader file = new StreamReader(@"C:\Work\プロジェクトオイラー\問題42\p042_words.txt"))
{
//行を読み込み
string line = file.ReadLine();
//カンマ区切り
string[] list = line.Split(',');
string s = "";
for (int i = 0; i < list.Count(); i++)
{
//データクラスのリストに追加
s = list[i].Trim('"');
Data tmp = new Data(s);
datalist.Add(tmp);
}
}
return datalist;
}
private static List<int> CreateSankakuList()
{
int num = 0;
int max = 26 * 30;
List<int> ret = new List<int>();
for (int i = 1; i < max; i++)
{
//三角数を算出
num = (i * (i + 1)) / 2;
//最大文字数よりも小さい値なら三角数のリストに追加
if (num > max) break;
else ret.Add(num);
}
return ret;
}
}
}
出力
162


コメント