4

c# を使用してオイラー プロジェクトの問題の 1 つを解決しようとしています (問題 22 )。私は問題に遭遇しましたが。私はプログラミング、特に c# に比較的慣れていないことに注意してください。

私が持っている一連の文字列の単語スコアを考え出す必要があります。これには、a=1、b=2、c=3 など、単語の各文字のスコアを合計することが含まれます。これを行うために、アルファベットの 26 文字すべてを、関連するスコアを持つ変数として割り当てました。次に、単語内の各文字を同じ名前の関連する変数と比較したいと思います。ただし、残っているのは char データ型です。文字を関連する変数と比較し、整数計算で変数値を使用するための最良の方法は何ですか。これまでのコードを以下に含めましたが、中かっこを除く最後の 2 行で問題が発生しています。(ちょっと調べてみたところ、c# についてはわかりませんが、これは c++ ではサポートされていないようです)。どんな助けでも大歓迎です。

string[] lines = File.ReadAllLines(@"C:\Users\john\Downloads\names.txt");
//Console.WriteLine(lines[1]);

char[] delimiterChars = { ',', '\t' };

string text = lines[0];

string[] names = text.Split(delimiterChars);
Console.WriteLine("{0} words in text:", names.Length);
Array.Sort(names);

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int h = 8;
int i = 9;
int j = 10;
int k = 11;
int l = 12;
int m = 13;
int n = 14;
int o = 15;
int p = 16;
int q = 17;
int r = 18;
int s = 19;
int t = 20;
int u = 21;
int v = 22;
int w = 23;
int x = 24;
int y = 25;
int z = 26;

int[] nameTotal;

for (int count = 0; count < names.Length; count++)
{
    string name = names[count];
    int total = 0;
    for (int count2 = 0; count2 < name.Length; count2++)
    {             
        nameTotal[count] = name.Substring(count2) + total;
        total = total + nameTotal[count];
    }
}
4

4 に答える 4

2

これは、標準のASCII テーブルのレイアウトを利用して行うことができます。

ASCII では、文字「a」の 10 進値は 97 です。小文字は 122 まで続きます。

したがって、次を使用して、「a」文字値を必要な値に簡単に変換できます。

char charToConvert = 'a';
int requiredValue = (int)charToConvert - 96;
于 2012-04-22T21:47:46.863 に答える
1

文字ごとに26個の変数を割り当てる代わりに、を作成します。IDictionary<TKey, TValue>ここで、TKeyは文字であり、TValueは割り当てた値です。次に、文字をはるかに簡単に渡すことで値にアクセスできます。

于 2012-04-22T21:34:51.643 に答える
1

名前の文字の合計を計算する場合は、Linqを使用することもできます(単なる例)。

string name = "ABCD";
int sum = name.Select(letter => letter - 'A' + 1).Sum();  

C#の整数と同じように、文字を使用して計算を実行できます。Selectメソッド(Linqの拡張メソッド)は、文字列の各文字を対応する値に射影します。これらの値は、拡張メソッドSum()によって合計されます。

編集:jlafayが指摘したように、Select呼び出しを省略して、Sumメソッドに射影を入れることができます。

name.Sum(letter => letter - 'A' + 1)

そして、あなたの元の質問に関して:リフレクションがあっても、ローカル変数の名前にアクセスすることはできません。その情報は、コンパイルされたコードのメタデータには含まれていません。

于 2012-04-22T21:35:02.563 に答える
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SO
{
    static class Program
    {
        static void Main()
        {
            WebClient wc = new WebClient();
            var text = wc.DownloadString("http://projecteuler.net/project/names.txt");

            var names = Regex.Matches(text, "[A-Z]+").Cast<Match>()
                .Select(x => x.Value)
                .OrderBy(x => x)
                .Select((name, inx) => new
                {
                    Name = name,
                    Score = name.Sum(c => c - 'A' + 1) * (inx + 1)
                });

            foreach (var n in names)
            {
                Console.WriteLine("{0}: {1}", n.Name, n.Score);
            }
        }
    }
}
于 2012-04-22T22:53:08.610 に答える