使用c#投影euler 22
本文关键字:euler 投影 使用 | 更新日期: 2023-09-27 18:25:10
我正在解决与Project Euler#22 Python相同的问题,缺少2205点?,但我使用的是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);
}
}
感谢您的回答:)
你得到不同结果的原因是捷克语中有特定的字母"CH",而"CH"在"H"之后,所以按照字母顺序,如果不使用正确的区域性,你可以得到像这样的字符串
aaa
bbb
ccc
czz
ddd
cha
这里有一些问题。您不检查读取器是否到达流的末尾,您必须检查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();
这里有一个使用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);
}