4

ネストされた if ステートメントを反復ごとに新しい値で反復することは可能ですか? 私は1次元のセルオートマトンを構築しようとしています(宿題のために、私はそれを否定できません).次のコードが間違いなく保証するので、私はC#に完全に慣れていません. 私は、利用可能な最も簡単で基本的な DIY の方法を使用してこのプログラムを作成しようとしましたが、わだち掘れに陥りました。

長さ 8 の 1 と 0 の文字列があるとします。

string y;
y = "11110000";

この設定を 3 つの 8 つの部分文字列セットに分割したいと思います。各セットは y の値とその両側の単一の値で構成されます。したがって、0 から数えると、3 番目のセットは 110 になり、7 番目は 001 になります。ただし、部分文字列は 1 番目から 6 番目のセットのみを提供します。これは、y の周りで好きなようにループできないため、次のように定義しました-

y1=y.Substring(7,1)+y+y.Substring(0,1);

y1 を使用して、必要なすべての部分文字列を取得できました。これらは、基本的に次のように定義されていました-

string a0, a1, a2, a3, a4, a5, a6, a7;
                    a0 = y1.Substring(0, 3);
                    a1 = y1.Substring(1, 3);
                    a2 = y1.Substring(2, 3);
                    a3 = y1.Substring(3, 3);
                    a4 = y1.Substring(4, 3);
                    a5 = y1.Substring(5, 3);
                    a6 = y1.Substring(6, 3);
                    a7 = y1.Substring(7, 3);

次世代のセル オートマトンのルールは、このプログラムのユーザー次第です。つまり、ユーザーは部分文字列かどうか、たとえば 111->0 か 1 のいずれかをすべての反復で選択できます。各部分文字列に対して次の方法でifテーブルを(非常に多く)使用しました

                     {
                        if (a0=="000")
                    {
                        Console.Write(a);
                        }
                        else if (a0=="001")
                        {
                            Console.Write(b);
                        }
                        else if (a0 =="010")
                        {
                            Console.Write(c);
                        }
                        else if (a0 == "011")
                        {
                            Console.Write(d);
                        }
                        else if (a0 == "100")
                        {
                            Console.Write(e);
                        }
                        else if (a0 == "101")
                        {
                            Console.Write(f);
                        }
                        else if (a0 == "110")
                        {
                            Console.Write(g);
                        }
                        else if (a0 == "111")
                        {
                            Console.Write(h);
                        }
                    }

ここで、a、b、c、d、e、f、g、h は int であり、ユーザーが選択したルールです。たとえば、ユーザーが各セット 000 が 1 の値になるように決定したとします。その場合、a=1 になります。b は {0,0,1} に対応し、c は {0,1,0} に対応します。ただし、この方法のかなり明白な問題は、取得できない int の世代が 1 つしかないことです。y1 をこの新しい世代 (文字列に変換されたもの) に置き換えたいと思います。これが不可能な場合はお知らせください。

このリンクは、物事を少しクリアするかもしれません

4

1 に答える 1

0

そして、これがあなたがA +を獲得した方法です:D

  private static int[,] HipPriestsHomework()
    {
        string y = "11110000";
        Console.WriteLine(y);
        var rules = new[]
        {
            new {pattern = 0, result = 0},
            new {pattern = 1, result = 1},
            new {pattern = 2, result = 1},
            new {pattern = 3, result = 1},
            new {pattern = 4, result = 1},
            new {pattern = 5, result = 0},
            new {pattern = 6, result = 0},
            new {pattern = 7, result = 0},
        };
        Dictionary<int, int> rulesLookup = new Dictionary<int, int>();
        foreach(var rule in rules)
        {
            rulesLookup.Add(rule.pattern, rule.result);
        }

        int numGenerations = 10;
        int inputSize = y.Length;
        int[,] output = new int[numGenerations, inputSize];

        int[] items = new int[y.Length];
        for(int inputIndex = 0; inputIndex< y.Length; inputIndex++)
        {
            string token = y.Substring(inputIndex, 1);
            int item = Convert.ToInt32(token);
            items[inputIndex] = item;
        }

        int[] working = new int[items.Length];
        items.CopyTo(working, 0);
        for (int generation = 0; generation < numGenerations; generation++)
        {
            for (uint y_scan = 0; y_scan < items.Length; y_scan++)
            {
                int a = items[(y_scan - 1) % items.Length];
                int b = items[y_scan % items.Length];
                int c = items[(y_scan + 1) % items.Length];
                int pattern = a << 2 | b << 1 | c;
                var match = rules[pattern];
                output[generation, y_scan] = match.result;
                working[y_scan] = match.result;
                Console.Write(match.result);
            }
            working.CopyTo(items, 0);
            Console.WriteLine();
        }

        return output;
    }
于 2014-10-22T17:10:14.177 に答える