Sunday, March 06, 2011

110106 Intérprete

import java.util.*;
/**
* 110106 - Intérprete
*
* @author BreakDark
* @version 1.5 beta
* --- RESUELTO --- :)
*/
public class Main {

static int[] reg = new int[20]; // 10 registros
static int[] ram = new int[1010]; // 1000 de memoria ram

public static void main(String[] args) {
int casos; // # de casos
int i; // para contar las posiciones de la ram;
long c; // cantidad de instrucciones ejecutadas hasta terminar
int dig1; // para el primer digito
int dig2, dig3;
int aux; // digito auxiliar
Scanner Lee; // para leer los datos
String linea; // para leer una linea
Scanner texto; // para leer una linea

// EL PROGRAMA SE INICIA AQUI
Lee = new Scanner(System.in);
linea = Lee.nextLine();
texto = new Scanner(linea);
casos = texto.nextInt();
// System.out.println("Casos=" + casos);
linea = Lee.nextLine(); // para leer la linea en blanco
while ((casos > 0)&& (Lee.hasNextLine())) {
// System.out.println("Caso="+casos);
// System.out.println("linea="+linea);
// leemos la ram
Main.inicializa();
i = 0;
linea = Lee.nextLine();
while (!(linea.equals("")) && (i < 1000)) {
texto = new Scanner(linea);
Main.ram[i] = texto.nextInt();
i++;
if(Lee.hasNextLine())
linea=Lee.nextLine();
else
linea="";
}
// System.out.println("linea2=" + linea);
// // //////////
// System.out.println("Contenido de la ram");
// i = 0;
// while (i < 20) {
// System.out.println("Pos " + i + ": " + Main.ram[i]);
// i++;
// }
// leemos la ram
c = 1;
i = 0;
dig1 = Main.ram[i] / 100;
//System.out.println("Dig1= "+dig1);
while ((dig1 != 1) && (i < 1000)) {
//System.out.println("Se lee la pos= "+Main.ram[i]);
aux = Main.ram[i] % 100;
dig2 = aux/10;
dig3 = aux % 10;
switch (dig1) {
case 2 :
Main.reg[dig2] = dig3;
i++;
break;
case 3 :
Main.reg[dig2] += dig3;
if (Main.reg[dig2] > 999)
Main.reg[dig2] %= 1000;
i++;
break;
case 4 :
Main.reg[dig2] *= dig3;
if (Main.reg[dig2] > 999)
Main.reg[dig2] %= 1000;
i++;
break;
case 5 :
Main.reg[dig2] = Main.reg[dig3];
i++;
break;
case 6 :
Main.reg[dig2] += Main.reg[dig3];
if (Main.reg[dig2] > 999)
Main.reg[dig2] %= 1000;
i++;
break;
case 7 :
Main.reg[dig2] *= Main.reg[dig3];
if (Main.reg[dig2] > 999)
Main.reg[dig2] %= 1000;
i++;
break;
case 8 :
Main.reg[dig2] = Main.ram[Main.reg[dig3]];
i++;
break;
case 9 :
Main.ram[Main.reg[dig3]] = Main.reg[dig2];
i++;
break;
case 0 :
if (Main.reg[dig3] != 0)
i = Main.reg[dig2];
else
i++;
break;
}
c++;
//
//System.out.println(c);
//
dig1 = Main.ram[i] / 100;
}
System.out.println(c);
casos--;
if (casos > 0)
System.out.println();
}
}

/** Inicializa reg y ram con 000 */
static void inicializa() {
int i;
for (i = 0; i < 10; i++)
Main.reg[i] = 000;
for (i = 0; i < 1000; i++)
Main.ram[i] = 000;
}
}

No comments: