Mostrando entradas con la etiqueta Validador de Entrada. Mostrar todas las entradas
Mostrando entradas con la etiqueta Validador de Entrada. Mostrar todas las entradas

jueves, 22 de diciembre de 2011

Problema C: Validador de Entrada UNMSM-FISI 2011

Concurso de Programación UNMSM-FISI 2011

Problema C: Validador de Entrada

Descargar problema: UNMSM-FISI 2011 Problema C

public class ProblemaC
{
    // Indica si se termino de leer la linea
    static boolean termino;

    public static void main( String args[] ) throws Exception
    {
        int numCasos[]; // Numero de casos que se analizaran
        int a[], b[];   // Limite inferior y superior del intervalo
        int[] valoresA; // Almacena los prefijos de 1, 2, ... digitos de a
        int[] valoresB; // Almacena los prefijos de 1, 2, ... digitos de b
        int[] numero;   // Numero que se analizara
        int pos;
        long temp;
 
        numCasos = leer();

        for( int i = 0; i < numCasos[ 0 ]; i ++ )
        {
            termino = false;

            a = leer();
            b = leer();

            // Creamos los prefijos de 1, 2, ... digitos de a y b
            valoresA = new int[ a[1] ];
            valoresB = new int[ a[1] ];
   
            // Hacemos una copia de los valores de a y b
            int copiaA = a[ 0 ], copiaB = b[ 0 ];
 
            for( int j = valoresA.length - 1; j >= 0; j -- )
            {
                // Guardamos los prefijos
                valoresA[ j ] = copiaA;
                valoresB[ j ] = copiaB;

                // Generamos los siguientes prefijos
                copiaA /= 10;
                copiaB /= 10;
            } 

            System.out.print( "Caso #" + (i+1) + ":" );

            // Leemos los numeros a comparar
            while( !termino )
            {
                numero = leer();
                temp = 10l * numero[ 0 ];
    
                if( numero[ 1 ] >= a[ 1 ] )
                    pos = a[ 1 ] - 1;
                else
                    pos = numero[ 1 ] - 1;
                
                // Si el numero leido es mayor que el limite inferior, debera 
                // estar dentro de los valores del intervalo
                if( numero[ 0 ] >= valoresA[ pos ] )
                {
                    if( numero[ 0 ] <= valoresB[ pos ] )
                        System.out.print( " 1" );
                    else
                        System.out.print( " 0" );
                } 
   
                // Si el numero leido es menor que el limite inferior, el mismo
                // numero multiplicado por 10 debera estar dentro del intervalo
                else if( temp  >= valoresA[ pos ] && temp <= valoresB[ pos ] )
                    System.out.print( " 1" );
                else
                    System.out.print( " 0" ); 
            }
   
            System.out.println();
        } 
    }
    
    // Retorna el siguiente numero de la entrada, ademas de su longitud
    public static int[] leer() throws Exception
    {
        int[] numero = new int[ 2 ];
        int car = System.in.read();
  
        while( car > 47 && car < 58 )
        {
            numero[ 0 ] = 10 * numero[ 0 ] + car - 48;
            numero[ 1 ] ++;

            car = System.in.read();
        }
  
        // Si se encontro el fin de linea, indicamos que se termino la linea
        if( car == '\n' )
            termino = true;

        // Si encontramos una coma nos saltamos el espacio en blanco
        else if( car == ',' )
            System.in.read();
  
        return numero;
    }
}