どーも、みつおです。
問題
三角数の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
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
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
コメントを残す