2013-08-11 16:18:38Morris

[UVA] 377 - Cowculations


 Cowculations 

A primitive cow culture was discovered by noted anthropologist Dr. Bo Vine. Hundreds of computation tablets were unearthed in a pasture somewhere near Dallas. Dr. Vine managed to decipher the mystery of the tablets when he realized they represented mathematical calculations. He says ``I've always suspected that cows are smarter than they lead us to believe and here's the proof. The big breakthrough was realizing that they are not able to do math by cownting on their fingers, but they are able to think on their feet. But now I have hundreds of these tablets and I need help in verifying my hypothesis."

Write a program that helps Dr. Vine verify his hypothesis. This problem statement describes how he thinks the tablets should be interpreted. Each tablet contains six lines and each line contains a sequence of cow symbols. The first two lines represent cow numbers, the next three represent operations on those numbers and the sixth represents the result. Cow numbers make use of four symbols: V U C and D most closely represent the marks made by the cow hooves, so we will use them to represent the symbols. The numbers on the first two lines of a tablet are always a sequence of 5 of these symbols, and the number on the sixth line of a tablet is always a sequence of 8 of these symbols.

To interpret the cow calculations one must keep track of two numbers, hereafter referred to as Num1 and Num2. Originally Num1 is equal to the number on line 1 of a tablet and Num2 is equal to the number on line 2 of a tablet. However the value of Num2 can change as a result of the operations. There are four possible operations, represented by the symbols A, R, L, and N.

Operation A causes Num2 to become the ``sum" of Num1 and Num2, using this addition table:

tabular34

The first symbol in a result box represents the result of the addition. The second symbol in a box represents a carry symbol.

For example: U A V = U and C A C = V with a carry of U

Examples of cow addition are:

VUCDV A VUCDV = VDUCV

DVVCU A CVUCU = UUVCVC

Operation R causes Num2 to have its symbols shifted right one position, with the rightmost symbol being lost and a V being placed into the leftmost position. For example VVCDU would become VVVCD. Operation L causes Num2 to have its symbols shifted left one position, with the leftmost symbol being kept and a V placed into the rightmost position. For example VVCDU would become VVCDUV. N is the null operation. It has no effect on Num2.

After the operations have been performed on Num1 and Num2 the final value of Num2 is hopefully the value marked on the sixth line of the tablet. If the final value of Num2 does not make use of 8 symbols then it is padded with V's on the left (VDCCC becomes VVVVDCCC).

Dr. Vine says ``I have already verified that all the tablets conform to the hypothesis in terms of the format of the tablets, number of lines and symbols, types of symbols, etc. But I need to verify that the result of the mathematical operation described on lines 1 through 5 is indeed on line 6."

Input

The first line contains an integer N between 1 and 10 describing how many tablets are represented. The next tex2html_wrap_inline63 lines represent the N tablets as described in the problem statement.

Output

There should be N+2 lines of output. The first line of output should read COWCULATIONS OUTPUT. There will then be one line of output for each tablet that states either YES (the tablet follows Dr. Vine's hypothesis) or NO (the tablet does not follow Dr. Vine's hypothesis). The final line of output should read END OF OUTPUT.

Sample Input

5
VVVVU
VVVVU
A
A
A
VVVVVVUV
VVCCV
VVDCC
L
R
A
VVVVUCVC
VVCCV
VVDCC
R
L
A
VVVVUCVV
VVUUU
VVVVU
A
N
N
VVVVVUCU
DDDDD
VVVVU
A
L
L
UVVVVVVV

Sample Output

COWCULATIONS OUTPUT
YES
YES
YES
NO
YES
END OF OUTPUT

被題目的特殊字元騙了,事實上只是個四進制!
那麼把所有輸入轉成一個數字,直接進行加法即可。


#include <stdio.h>
int trans(char s[]) {
//V 00, U 01, C 10, D 11
int ret = 0;
int i;
for(i = 0; s[i]; i++) {
ret <<= 2;
if(s[i] == 'V') {}
if(s[i] == 'U') {ret |= 1;}
if(s[i] == 'C') {ret |= 2;}
if(s[i] == 'D') {ret |= 3;}
}
return ret;
}
int main() {
puts("COWCULATIONS OUTPUT");
int testcase, i;
char s[1005];
scanf("%d", &testcase);
while(testcase--) {
int num1, num2, result;
scanf("%s", s);
num1 = trans(s);
scanf("%s", s);
num2 = trans(s);
for(i = 0; i < 3; i++) {
scanf("%s", s);
if(s[0] == 'A')
num2 = num1+num2;
else if(s[0] == 'L')
num2 <<= 2;
else if(s[0] == 'R')
num2 >>= 2;
else {}
}
scanf("%s", s);
result = trans(s);
puts(num2 == result ? "YES" : "NO");

}
puts("END OF OUTPUT");
return 0;
}