3. 解密碼演算法

好難...

# 解題祕訣: Console.WriteLine 比對順序

const uint K = 0x5a82;
uint[] H =  {
    0xabcd, 0xcdef, 0x2266, 0xceed, 0xaccd
};

//{
//    uint[] A = new uint[5];
//    Array.Copy(H, A, 5);

//    string word = Console.ReadLine();
//    for (int i = 0; i < 5; i++)
//    {
//        uint tmp = 4 * A[0] + A[1] + A[2] + A[4] + K + word[i] - ' ';
//        for (int j = 4; j > 0; j--)
//        { // A[1] = A[0]
//            A[j] = A[j - 1];
//        }
//        // A[1] => A[2]
//        A[0] = tmp;
//        Console.WriteLine(String.Join(" ", A.Select(e => $"{e:x}")));
//    }

//    for (int i = 0; i < 5; i++)
//    {
//        A[i] += H[i];
//        Console.Write($"{A[i]:x} ");
//    }
//    Console.WriteLine("\n");
//}

while(true){
    uint[] A = Console.ReadLine().Split(" ").Select((e, i) => Convert.ToUInt32(e, 16) - H[i]).ToArray();
    //Console.WriteLine(String.Join(" ", A.Select(e => $"{e:x}")));
    char[] word = new char[5];
    for (int i = 4; i >= 0; i--)
    {
        uint tmp = A[0];
        for (int j = 1; j < 5; j++)
        { // A[0] = A[1]
            A[j - 1] = A[j];
        }
        word[i] = (char)(tmp - 4 * A[0] - A[1] - A[2] - H[4 - i] - K + ' ');
        A[4] = H[4 - i];
    }
    Console.WriteLine(new string(word));
}

Last updated