1

入力と出力が与えられた場合:

Input     Output
10011100  10010100
10000100  00000000
11111100  10000100
10000011  00000011
10100010  10100010

結果を得るために行/列に対して実行できる操作はありますか? たとえば、私の最善の試みは

((Y AND NOT Y-1) XOR (Y AND NOT Y+1)) OR ((X AND NOT X-1) XOR (X AND NOT X+1))

行/列が存在しない場合は false と見なされます。私の試みのデモンストレーション:

Yについて:

(Y AND NOT Y-1) XOR (Y AND NOT Y+1) =
10011100            00011000         10000100
00000000            00000000         00000000
01111000            01111100         00000100
00000011            00000001         00000010
00100000            10100010         10000010

X の場合:

(X AND NOT X-1) XOR (X AND NOT X+1) =
10010000            10000100         00010100
10000100            10000100         00000000
10000000            00000100         10000100
10000010            10000001         00000011
10100010            10100010         00000000

これら 2 つの結果を OR します。

((Y AND NOT Y-1) XOR (Y AND NOT Y+1)) OR ((X AND NOT X-1) XOR (X AND NOT X+1))
10010100
00000000
10000100
00000011
10000010

ご覧のとおり、出力とほぼ同じですが、COL 3、ROW 5 は 1 ではなく 0 です。そのビットを考慮して他の操作を行う方法はありますか?

前もって感謝します。

4

1 に答える 1

1

ビットの位置には次の表記を使用します。

 B
CAD
 E

これは私に2^5の可能性(32)を与え、それを書き留めます。Aが1で、出力は0でなければならないすべての可能性から3つのケースを見つけました。カルノーテーブルを書き留めることはできましたが、3つしかないため、直接関数を実行します。

IsZero =(!A |((B&A&E&!C&!D)|(C&A&D&!E&!B)|(A&B&C&D&E)))

IsOneが必要な場合は、単に!IsZeroです。

これを確認するためのC#コードは次のとおりです。

class Program
{
    static void PrintFunction(int[,] myArray, int yMax, int xMax)
    {
        for (int y = 0; y < yMax; y++)
        {
            for (int x = 0; x < xMax; x++)
            {
                Console.Write(myArray[y, x]);
            }
            Console.WriteLine();
        }
    }

    static bool A(int x, int y) { if (Input[y, x] == 1) return true; else return false; }
    static bool B(int x, int y) { try { if (Input[y - 1, x] == 1) return true; else return false; } catch { return false; } }
    static bool C(int x, int y) { try { if (Input[y, x - 1] == 1) return true; else return false; } catch { return false; } }
    static bool D(int x, int y) { try { if (Input[y, x + 1] == 1) return true; else return false; } catch { return false; } }
    static bool E(int x, int y) { try { if (Input[y + 1, x] == 1) return true; else return false; } catch { return false; } }

    static int[,] Input = { { 1,0,0,1,1,1,0,0 }, {1,0,0,0,0,1,0,0}, { 1,1,1,1,1,1,0,0  }, {1,0,0,0,0,0,1,1} , {1,0,1,0,0,0,1,0} };
    static int[,] OutputVH = new int[5, 8];
    static int[,] Solution = { { 1,0,0,1,0,1,0,0}, { 0,0,0,0,0,0,0,0}, { 1,0,0,0,0,1,0,0}, { 0,0,0,0,0,0,1,1} , {1,0,1,0,0,0,1,0} };
    static int xMax = 8;
    static int yMax = 5;

    static void Main(string[] args)
    {
        Console.WriteLine("Both Filterings");
        for (int y = 0; y < yMax; y++)
        {
            for (int x = 0; x < xMax; x++)
            {
                bool isZero = (!A(x, y) | ((B(x, y) & A(x, y) & E(x, y) & !C(x,y) & !D(x,y)) | (C(x, y) & A(x, y) & D(x, y) & !E(x,y) & !B(x,y)) | (A(x, y) & B(x, y) & C(x, y) & D(x, y) & E(x, y))));
                OutputVH[y, x] = (isZero ? 0 : 1); 
            }
        }
        PrintFunction(OutputVH, yMax, xMax);
        bool SolutionFound = true;
        for (int y = 0; y < yMax; y++)
            for (int x = 0; x < xMax; x++)
                if (OutputVH[y, x] != Solution[y, x]) SolutionFound = false;
        if (SolutionFound) Console.WriteLine("Found solution!");
    }
}

必要に応じて、ブール論理を使用してこれをさらに単純化するのはあなたに任せます。

于 2011-08-05T13:51:55.537 に答える