Saturday, July 07, 2012

Solución al Problema 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org] con Java

Solución al Problema 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org] con Java
El link del Problema se encuentra en el siguiente enlace
import java.util.Scanner;

/**
 * 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org]
 * 190 - Circle Through Three Points [http://uva.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.1 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        double Ax, Ay, Bx, By, Cx, Cy; // para las coordenadas de los puntos
        double h = 0, k = 0, r = 0, c = 0, d = 0, e = 0; // para los datos que
                                                         // se mostraran
        double[][] C = new double[3][3]; // para sacar el determinante
        double[][] D = new double[3][3];
        double[][] E = new double[3][3];
        double[][] dis = new double[3][3];
        double aux; // un auxiliar para ahorrar operaciones
        String linea; // para la linea que se mostrara al final

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        while(Lee.hasNext()){
            Ax = Double.parseDouble(Lee.next());
            Ay = Double.parseDouble(Lee.next());
            Bx = Double.parseDouble(Lee.next());
            By = Double.parseDouble(Lee.next());
            Cx = Double.parseDouble(Lee.next());
            Cy = Double.parseDouble(Lee.next());
            // creamos las matriz discriminante
            dis[0][0] = Ax;
            dis[0][1] = Ay;
            dis[0][2] = 1;
            dis[1][0] = Bx;
            dis[1][1] = By;
            dis[1][2] = 1;
            dis[2][0] = Cx;
            dis[2][1] = Cy;
            dis[2][2] = 1;
            // copiamos antes de modificar las matrices
            C = copia(dis);
            D = copia(dis);
            E = copia(dis);
            // creamos la matriz D
            C[0][0] = -(Ax * Ax + Ay * Ay);
            C[1][0] = -(Bx * Bx + By * By);
            C[2][0] = -(Cx * Cx + Cy * Cy);
            // creamos la matriz E
            D[0][1] = -(Ax * Ax + Ay * Ay);
            D[1][1] = -(Bx * Bx + By * By);
            D[2][1] = -(Cx * Cx + Cy * Cy);
            // creamos la matriz F
            E[0][2] = -(Ax * Ax + Ay * Ay);
            E[1][2] = -(Bx * Bx + By * By);
            E[2][2] = -(Cx * Cx + Cy * Cy);
            // hallamos las soluciones
            aux = det(dis);
            c = det(C) / aux;
            d = det(D) / aux;
            e = det(E) / aux;
            h = c / 2;// -c/2;
            k = d / 2;// -d/2;
            r = Math.sqrt(h * h + k * k - e);
            // aqui mostramos el resultado
            // formato 1
            // para h
            linea = "(x ";
            if(h >= 0)
                linea += String.format("+ %.3f", h);
            else
                linea += String.format("- %.3f", Math.abs(h));
            linea += ")^2 + (y ";
            // para k
            if(k >= 0)
                linea += String.format("+ %.3f", k);
            else
                linea += String.format("- %.3f", Math.abs(k));
            linea += ")^2 = ";
            // para r
            linea += String.format("%.3f^2\n", r);
            System.out.print(linea.replace(',', '.'));
            // formato 2
            linea = "x^2 + y^2 ";
            // para c
            if(c >= 0)
                linea += String.format("+ %.3fx ", c);
            else
                linea += String.format("- %.3fx ", Math.abs(c));
            // para d
            if(d >= 0)
                linea += String.format("+ %.3fy ", d);
            else
                linea += String.format("- %.3fy ", Math.abs(d));
            // para e
            if(e >= 0)
                linea += String.format("+ %.3f = 0\n", e);
            else
                linea += String.format("- %.3f = 0\n", Math.abs(e));
            System.out.print(linea.replace(',', '.'));
            // if(Lee.hasNext())
            System.out.println();
        }
    }
    /**
     * Realiza una copia de la matriz mat de 3 por 3
     * 
     * @author BreakDark
     * @param mat
     *            matriz a copiar
     * @return matriz con los mismos elementos de mat
     */
    private static double[][] copia(double[][] mat) {
        double[][] res = new double[3][3];
        byte i, j;
        for(i = 0; i < 3; i++)
            for(j = 0; j < 3; j++)
                res[i][j] = mat[i][j];
        return res;
    }
    /**
     * Funcion que halla el determinante de una matriz de 3 por 3
     * 
     * @author BreakDark
     * @param mat
     *            Es una matriz de 3 por 3
     * @return el determinante de mat
     */
    private static double det(double[][] mat) {
        return (mat[0][0] * mat[1][1] * mat[2][2] + mat[0][1] * mat[1][2] * mat[2][0] + mat[0][2] * mat[1][0] * mat[2][1] - mat[0][0] * mat[1][2]
                * mat[2][1] - mat[0][1] * mat[1][0] * mat[2][2] - mat[0][2] * mat[1][1] * mat[2][0]);
    }
}

Solución al Problema 5356 - Exponentiation [http://livearchive.onlinejudge.org] con Java

Solución al Problema 5356 - Exponentiation [http://livearchive.onlinejudge.org] con Java
El link del Problema se encuentra en el siguiente enlace
import java.math.BigDecimal;
import java.util.Scanner;

/**
 * 5356 - Exponentiation [http://livearchive.onlinejudge.org] 748 -
 * 748 - Exponentiation [http://uva.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        BigDecimal num; // para leer la base

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        while(Lee.hasNext()){
            num = new BigDecimal(Lee.next());
            num = num.pow(Lee.nextByte());
            System.out.println(sinCerosInsignificantes(num.toPlainString()));
        }
    }
    /**
     * Esta funcion elimina los ceros insignificantes
     * 
     * @author BreakDark
     * @param numero
     *            El numero que al que se desea eliminar los ceros
     *            insignificantes
     * @return una cadena que representa el numero sin ceros insignificantes
     * */
    private static String sinCerosInsignificantes(String numero) {
        int i, j;
        // buscamos desde el principio
        for(i = 0; i < numero.length(); i++)
            if(numero.charAt(i) != '0')
                break;
        // buscamos desde el final
        for(j = numero.length() - 1; j >= 0; j--)
            if(numero.charAt(j) != '0')
                break;
        return numero.substring(i, j + 1);
    }
}

Solución al Problema 5355 - Baudot Data Communication Code [http://livearchive.onlinejudge.org] con Java

Solución al Problema 5355 - Baudot Data Communication Code [http://livearchive.onlinejudge.org] con Java
El link del Problema se encuentra en el siguiente enlace
import java.util.Scanner;

/**
 * 5355 - Baudot Data Communication Code [http://livearchive.onlinejudge.org]
 * 740 - Baudot Data Communication Code [http://uva.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        char[][] codigo = new char[2][32]; // para los codigos
        String mensajeCod, mensajeRecod; // para recodificar el mensaje
        byte i; // para los bucles
        byte shift; // para saber si es down_shift o up_shift

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        // leemos down-shift y up-shift
        codigo[0] = Lee.nextLine().toCharArray();
        codigo[1] = Lee.nextLine().toCharArray();
        while(Lee.hasNextLine()){
            mensajeCod = Lee.nextLine();
            mensajeRecod = "";
            shift = 0;
            for(i = 0; i < mensajeCod.length(); i += 5){
                if(Byte.parseByte(mensajeCod.substring(i, i + 5), 2) == 27)
                    shift = 0;
                else
                    if(Byte.parseByte(mensajeCod.substring(i, i + 5), 2) == 31)
                        shift = 1;
                    else
                        mensajeRecod += (codigo[shift][Byte.parseByte(mensajeCod.substring(i, i + 5), 2)]);
            }
            // mostramos el texto decodificado
            System.out.println(mensajeRecod);
        }
    }
}

Wednesday, July 04, 2012

Solución al problema T9 Spelling [http://code.google.com/codejam] con Java

Solución al problema T9 Spelling [http://code.google.com/codejam] con Java, el link del problema es el siguiente enlace
import java.util.Scanner;

/**
 * T9 Spelling [http://code.google.com/codejam]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        byte N; // para el numero total de casos de prueba
        char[] linea; // para la cadena a procesar
        byte n; // para los bucles de N
        String lineaFinal; // para la linea final
        short i; // para contar los caracteres de la linea
        String digito = ""; // para mostrar el digito a imprimir

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        N = Byte.parseByte(Lee.nextLine());
        for(n = 1; n <= N; n++){
            System.out.print("Case #" + n + ": ");
            linea = Lee.nextLine().toCharArray();
            lineaFinal = "";
            for(i = 0; i < linea.length; i++){
                switch(linea[i]){
                    case 'a':
                        digito = "2";
                        break;
                    case 'b':
                        digito = "22";
                        break;
                    case 'c':
                        digito = "222";
                        break;
                    case 'd':
                        digito = "3";
                        break;
                    case 'e':
                        digito = "33";
                        break;
                    case 'f':
                        digito = "333";
                        break;
                    case 'g':
                        digito = "4";
                        break;
                    case 'h':
                        digito = "44";
                        break;
                    case 'i':
                        digito = "444";
                        break;
                    case 'j':
                        digito = "5";
                        break;
                    case 'k':
                        digito = "55";
                        break;
                    case 'l':
                        digito = "555";
                        break;
                    case 'm':
                        digito = "6";
                        break;
                    case 'n':
                        digito = "66";
                        break;
                    case 'o':
                        digito = "666";
                        break;
                    case 'p':
                        digito = "7";
                        break;
                    case 'q':
                        digito = "77";
                        break;
                    case 'r':
                        digito = "777";
                        break;
                    case 's':
                        digito = "7777";
                        break;
                    case 't':
                        digito = "8";
                        break;
                    case 'u':
                        digito = "88";
                        break;
                    case 'v':
                        digito = "888";
                        break;
                    case 'w':
                        digito = "9";
                        break;
                    case 'x':
                        digito = "99";
                        break;
                    case 'y':
                        digito = "999";
                        break;
                    case 'z':
                        digito = "9999";
                        break;
                    case ' ':
                        digito = "0";
                        break;
                }
                if(lineaFinal.length() > 0){
                    if(lineaFinal.charAt(lineaFinal.length() - 1) != digito.charAt(0))
                        lineaFinal += digito;
                    else
                        lineaFinal += (" " + digito);
                }
                else
                    lineaFinal += digito;
            }
            System.out.println(lineaFinal);
        }
    }
}

Solución al problema Store Credit [http://code.google.com/codejam] con Java

Solución al problema Store Credit [http://code.google.com/codejam] con Java, el link del problema es el siguiente enlace
import java.util.Scanner;

/**
 * Store Credit [http://code.google.com/codejam]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de
        byte N; // numero de casos de prueba
        short C; // total de credito
        short I; // numero de items en el store
        short[] P = new short[2000]; // lista de precios de cada articulo
        byte n; // para el bucle N
        short i, j; // para los bucles I
        boolean sw; // para informar si ya se encontro el par

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        N = Lee.nextByte();
        for(n = 1; n <= N; n++){
            System.out.print("Case #" + n + ": ");
            // leemos los datos
            C = Lee.nextShort();
            I = Lee.nextShort();
            for(i = 0; i < I; i++)
                P[i] = Lee.nextShort();
            // resolvemos el problema
            sw = false;
            for(i = 0; i < I - 1 && !sw; i++)
                for(j = (short) (i + 1); j < I; j++)
                    if(P[i] + P[j] == C){
                        System.out.println((i + 1) + " " + (j + 1));
                        sw = true;
                        break;
                    }
        }
    }
}

Solución al problema Reverse Words [http://code.google.com/codejam] con Java

Solución al problema Reverse Words [http://code.google.com/codejam] con Java el link del problema es el siguiente enlace
import java.util.Scanner;
import java.util.StringTokenizer;

/**
 * Reverse Words [http://code.google.com/codejam]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        byte N; // para el numero de casos de prueba
        String lineaFinal; // para el texto al reves
        byte n; // para el bucle N
        StringTokenizer LeerLinea; // para leer las palabras de la linea

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        N = Byte.parseByte(Lee.nextLine());
        for(n = 1; n <= N; n++){
            System.out.print("Case #" + n + ": ");
            LeerLinea = new StringTokenizer(Lee.nextLine());
            lineaFinal = "";
            while(LeerLinea.hasMoreTokens()){
                lineaFinal = LeerLinea.nextToken() + lineaFinal;
                if(LeerLinea.hasMoreTokens())
                    lineaFinal = ' ' + lineaFinal;
            }
            System.out.println(lineaFinal);
        }
    }
}