0

キャラクターを別のキャラクターに置き換えるプログラムを作成しようとしています。次のように、奇数と偶数の2つの配列を作成しました。

char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
char[] even ={ 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };

ここで、入力がa」の場合は「b」を入力し、入力が「b」の場合は「 a 」を出力する必要があります。

ですから、両方の配列の数が等しいので、両方の配列のインデックスを一致させるのが最善だと思いました。基本的な考え方はこれです:

入力は'a'であるため、コンパイラは' a'-0のインデックス考慮に入れ、値を0- 'b'のインデックスに置き換えます。

そこで、予備の文字'j'を割り当てることを考えました。これにより、入力のインデックスが検索され、配列から対応する文字が出力されます- even[]

何度か試しましたが、解決できませんでした。親切にこれで私を助けてください...

これは私が試したことです。

必要な入力は次のようになります:Hello必要な出力は次のようになります:Gfkkp

これはおそらく私に望ましい結果を与えるでしょう。

private void superSecretFormula(string myName)  
{
    string read = myName;
    int count = read.Length;

    char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
    //char[] j;

    char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < 13 ; j++)
        {
            if (read[i]==odd[j])
            {
                int k = j;
                textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(even[k]));
            }
            if (read[i] == even[j])
            {
                int k = j;
                textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(odd[k]));
            }
        }
    }
}

私は初心者であり、コードを学び始めたばかりなので、この問題を解決するための品質とアプローチについてコメントしてください。ありがとう

4

4 に答える 4

4

すべての置換が一意であると仮定すると、使用を容易にするために、構造をこのようなものに変更することを検討します。

class Program
{
    static void Main(string[] args)
    {
        var subs = new Substitutes {{'a', 'b'}, {'c', 'd'}};

        Console.WriteLine(subs['a']); //Prints b
        Console.WriteLine(subs['b']); //Prints a
    }

    class Substitutes : Dictionary<char, char>
    {
         public new void Add(char item, char substitute)
         {
             base.Add(item, substitute);
             base.Add(substitute, item);
         }
    }
}

これで、文字列内のすべての文字を置き換えるのは、キーが存在するかどうかを確認するだけで簡単になります。

于 2012-06-24T16:16:08.687 に答える
0

どこで助けが必要か正確にはわかりません。oddに含まれる文字列のすべての文字をそれぞれの文字に置き換えevenたり、その逆を行ったりする小さな関数は、次のようになります。

static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };

static string Substitute(string input)
{
    char[] result = new char[input.Length];
    int i = 0;
    bool found = false;
    foreach (char c in input.ToCharArray())
    {
        found = false;
        result[i] = c;
        for (int j = 0; j < odd.Length; j++)
        {
            if (odd[j] == c)
            {
                result[i] = even[j];
                found = true;
                break;
            }
        }

        if (!found)
        {
            for (int j = 0; j < even.Length; j++)
            {
                if (even[j] == c)
                {
                    result[i] = odd[j];
                    break;
                }
            }
        }
        i++;
    }
    return new string(result);
}

また、すべての入力文字から出力文字へのある種のマッピングを作成することにより、これを最適化することもできます。これは、一度作成するだけで、その後キャッシュされます。

static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
static int[] mapping = null;

static string Substitute(string input)
{
    if (mapping == null)
    {
        mapping = new int[Math.Max(odd.Select(x => (int)x).Max(), even.Select(x => (int)x).Max()) + 1];

        for (int i = 0; i < mapping.Length; i++) mapping[i] = i;

        // Note: Make sure 'odd' and 'even' are arrays of the same length
        for (int i = 0; i < odd.Length; i++) mapping[(int)odd[i]] = (int)even[i];
        for (int i = 0; i < even.Length; i++) mapping[(int)even[i]] = (int)odd[i];
    }

    char[] result = new char[input.Length];
    int j = 0;
    foreach (char c in input.ToCharArray())
    {
        int charcode = (int)c;
        result[j] = charcode >= mapping.Length ? c : (char)mapping[charcode];
        j++;
    }
    return new string(result);
}
于 2012-06-24T16:03:15.093 に答える
0

最小限の変更で元のアイデアに固執します。

Array.IndexOf(odd, 'a'); //will return 0
Array.IndexOf(odd, 'b')' //will return -1

それで....

if(Array.IndexOf(odd, inputChar) > -1 )
{
    Console.WriteLine(even[Array.IndexOf(odd, inputChar)]);
}
else
{
    Console.WriteLine(odd[Array.IndexOf(even, inputChar)]);
}

ドキュメント: http: //msdn.microsoft.com/en-us/library/eha9t187.aspx

于 2012-06-24T16:28:16.550 に答える
0

1つのアプローチは、転置する必要のある文字を含む2つの辞書への参照を保持するクラスを作成することです。OPの元の2つのアレイに似ています。次に、入力文字列を変換するメソッドを作成します。

public class TransposeLetters
{
    public Dictionary<char, char> Odd { get; private set; }
    public Dictionary<char, char> Even { get; private set; }

    public TransposeLetters()
    {
        Odd = new Dictionary<char, char>();

        // capital leters
        for( int i = 65; i <= 90; i += 2 )
        {
            Odd.Add( (char)i, (char)( i + 1 ) );
        }

        // small letters
        for( int i = 97; i <= 122; i += 2 )
        {
            Odd.Add( (char)i, (char)( i + 1 ) );
        }

        Even = Odd.ToDictionary( x => x.Value, x => x.Key );
    }

    public string Convert( string str )
    {
        // ensure only letters are passed into the method
        var cleansed = str.Where( char.IsLetter );

        var transposed = cleansed.Select( x => Odd.ContainsKey( x ) ? Odd[x] : Even[x] );

        var result = new string( transposed.ToArray() );

        return result;
    }
}
于 2012-06-24T18:13:24.170 に答える