#include #define LOADI 53 #define LOAD 92 #define ADD 56 #define JEQ 90 #define HALT 69 #define MUL 77 #define JNEQ 15 #define EQ 44 #define JMP 22 #define STORE 89 int I[] = { 53, 3, 1, 53, 4, 0, 53, 5, 17, 53, 6, 17, 53, 7, 33, 53, 8, 0, 92, 0, 4, 77, 0, 4, 92, 2, 5, 44, 0, 2, 56, 4, 3, 56, 5, 3, 15, 48, 0, 44, 4, 6, 90, 54, 0, 22, 18, 0, 89, 7, 8, 69, 0, 0, 89, 7, 3, 69, 0, 0, }; int E = 0; int R[10]; int M[100]; int V[] = {0, 4, 6, 0, 6, 0, 0, 5, 6, 3, 0, 5, 6, 9, 2, 5}; int C(char *serial) { int i, j; for (i = 0; i < 10; i++) { R[i] = 0; } for (i = 0; i < 16; i++) { M[i] = (serial[i] - '0') % 48; } for (i = 17, j = 0; i < 33; i++, j++) { M[i] = V[j]; } M[33] = 0; i = 0; for (;;) { //printf("%d ", i); switch (I[i]) { case LOADI: //printf("LOADI R[%d] <- %d\n", I[i+1], I[i+2]); R[I[i+1]] = I[i+2]; i += 3; break; case LOAD: //printf("LOAD R[%d] <- M[%d]=(%d)\n", I[i+1], R[I[i+2]], M[R[I[i+2]]]); R[I[i+1]] = M[R[I[i+2]]]; i += 3; break; case STORE: //printf("STORE M[%d] <- R[%d]=%d\n", R[I[i+1]], I[i+2], R[I[i+2]]); M[R[I[i+1]]] = R[I[i+2]]; i += 3; break; case ADD: //printf("ADD R[%d] <- R[%d]=%d\n", I[i+1], I[i+2], R[I[i+2]]); R[I[i+1]] = R[I[i+1]] + R[I[i+2]]; i += 3; break; case MUL: //printf("MUL R[%d] <- R[%d]=%d\n", I[i+1], I[i+2], R[I[i+2]]); R[I[i+1]] = (R[I[i+1]] * R[I[i+2]]) % 10; i += 3; break; case EQ: //printf("EQ R[%d]=%d R[%d]=%d\n", I[i+1], R[I[i+1]], I[i+2], R[I[i+2]]); if (R[I[i+1]] == R[I[i+2]]) { E = 1; } else { E = 0; } i += 3; break; case JEQ: //printf("JEQ %d E=%d\n", I[i+1], E); if (E) { i = I[i+1]; } else { i += 3; } break; case JNEQ: //printf("JNEQ %d E=%d\n", I[i+1], E); if (!E) { i = I[i+1]; } else { i += 3; } break; case JMP: //printf("JMP %d\n", I[i+1]); i = I[i+1]; break; case HALT: //printf("HALT\n"); goto end; break; } } end: if (M[33] == 1) return 1; return 0; } int main(int argc, char **argv) { if (argc != 2) { return 1; } if (C(argv[1])) { printf("Numero de serie valido / Valid serial number :-)\n"); return 0; } else { printf("Numero de serie no valido / Invalid serial number :-(\n"); return 1; } }