Wednesday, March 28, 2012

Solución a 2017 - Hey, You're Not Marion Jones! [http://livearchive.onlinejudge.org]

Solución a 2017 - Hey, You're Not Marion Jones! [http://livearchive.onlinejudge.org]
El enunciado esta en el siguiente link enunciado

import java.util.Scanner;

/**
 * 2017 - Hey, You're Not Marion Jones! [http://livearchive.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
 static byte funcionG[] = {1, 5, 7, 6, 2, 8, 3, 0, 9, 4};
 public static void main(String[] args) {
  Scanner Lee; // para ller los datos de entrada
  int n; // para el numero de casos
  String barcode; // para el codigo a leer
  String numBase10; // para el numero base 10
  String[] cifraSignificativa = {"athlete", "athlete", "reserve", "reserve", "judge", "judge", "staff", "staff", "press", "press"};

  // AQUI INICIA EL PROGRAMA!!!
  Lee = new Scanner(System.in);
  n = Lee.nextInt();
  while(n-- > 0){
   barcode = Lee.next();
   numBase10 = convertir(barcode);
   System.out.print(barcode + "/" + numBase10 + " is ");
   // verificamos si numBase10 es un ID valido
   if(esValido(numBase10))
    System.out.println("valid " + cifraSignificativa[numBase10.charAt(0) - '0'] + " id number");
   else
    System.out.println("invalid id number");
  }
 }
 /** Verifica si un ID es valido */
 private static boolean esValido(String numero) {
  // sacamos las funciones F
  int[] F = new int[8];
  byte i, j;
  for(i = 0, j = 7; i < 8; i++, j--)
   F[i] = funcionF(i, numero.charAt(j) - '0');
  // realizamos la funcionIporJ
  int producto = funcionIporJ(F[0], F[1]);
  for(i = 2; i < 8; i++)
   producto = funcionIporJ(producto, F[i]);
  if(producto == 0)
   return true;
  return false;
 }
 /** realiza la funcionIporJ */
 private static int funcionIporJ(int i, int j) {
  if(i < 5 && j < 5)
   return (i + j) % 5;
  if(i < 5 && j >= 5){
   if(i + (j - 5) < 0)
    return ((i + (j - 5)) + 5) % 5 + 5;
   return (i + (j - 5)) % 5 + 5;
  }
  if(i >= 5 && j < 5){
   if(((i - 5) - j) < 0)
    return (((i - 5) - j) + 5) % 5 + 5;
   return ((i - 5) - j) % 5 + 5;
  }
  if((i - j) < 0)
   return ((i - j) + 5) % 5;
  return (i - j) % 5;
 }
 /** realiza la funcionF */
 private static int funcionF(int i, int j) {
  if(i == 0)
   return j;
  else
   if(i == 1)
    return funcionG[j];
   else
    return funcionF(i - 1, funcionG[j]);
 }
 /** Convierte el numero base 5 a base 10 */
 private static String convertir(String cadena) {
  long r = 0;
  String r2;
  int i, j = 0;
  for(i = cadena.length() - 1; i >= 0; i--, j++){
   switch(cadena.charAt(i)){
    case 'V':
     r += (4 * Math.pow(5, j));
     break;
    case 'W':
     r += (3 * Math.pow(5, j));
     break;
    case 'X':
     r += (2 * Math.pow(5, j));
     break;
    case 'Y':
     r += (1 * Math.pow(5, j));
     break;
    default:
     r += 0;
     break;
   }
  }
  r2 = Long.toString(r);
  // completamos con ceros si es necesario
  while(r2.length() < 8)
   r2 = '0' + r2;
  return r2;
 }
}

No comments: