Generala.java 10.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.io.File;
import java.util.Scanner;
public class Generala
{
    // ESTA ES LA FUNCIÓN QUE HAY QUE IMPLEMENTAR
    // TAMBIÉN PUEDEN AGREGAR OTRAS FUNCIONES y/o CLASES
    // QUE NECESITEN PARA RESOLVER EL EJERCICIO DE LA
    // MANERA MÁS ORDENADA POSIBLE
    String jugada(String dados){
        try{
            //Comprueba si se recibio un numero y si el numero es negativo o igual a cero
            if(Integer.parseInt(dados)<=0){
                return "INVALIDO";
            }
            //Comprobamos si tiene el tamano de caracteres correspondientes
            if(dados.length()!=5){
                return "INVALIDO";
            }
            //Comprobamos si cada digito de la cadena es entre 1 y 6
            if(!comprobarDigitos(dados)){
                return "INVALIDO";
            }
            //Convertimos a array de enteros para facilitar el proceso
            int[] convertido = convertirAArray(dados);
            //Ordenamos los dados para facilitar el resultado
            convertido = ordenar(convertido);
            //Analizamos la jugada
            if(generala(convertido)){
                return "GENERALA";
            }else if(poker(convertido)){
                return "POKER";
            }else if(full(convertido)){
                return "FULL";
            }else if(escalera(convertido)){
                return "ESCALERA";
            }
        }catch(Exception e){
            return "INVALIDO";
        }
        return "NADA";
    }

    boolean comprobarDigitos(String dados){
        for(int i = 0;i<dados.length();i++){
            if(Integer.parseInt("" + dados.charAt(i))>6 || Integer.parseInt("" + dados.charAt(i))==0){
                return false;
            }
        }
        return true;
    }

    //Convierte la cadena de dados en un array para asi trabajar mejor
    int[] convertirAArray(String dados){
        int[] resultado = new int[5];
        for(int i = 0;i<dados.length();i++){
            resultado[i] = Integer.parseInt("" + dados.charAt(i));
        }
        return resultado;
    }

    //Ordena la secuencia de dados para facilitar el proceso del resultado
    int[] ordenar(int[] dados){
        int menor = 0;
        int pos_menor = 0;
        //Realizamos el ordenamiento
        for(int i=0;i<dados.length-1;i++){
            menor = dados[i];
            pos_menor = i;
            for(int j = i+1;j<dados.length;j++){
                if(dados[j]<menor){
                    menor = dados[j];
                    pos_menor = j;
                }
            }
            if(menor!=dados[i]){
                int aux = dados[i];
                dados[i] = dados[pos_menor];
                dados[pos_menor] = aux;
            }
        }
        return dados;
    }

    boolean generala(int[] dados){
        int comparar = dados[0];
        for(int i = 1;i<dados.length;i++){
            if(comparar != dados[i]){
                return false;
            }
        }
        return true;
    }

    boolean poker(int[] dados){
        boolean oportunidad1 = true;
        boolean oportunidad2 = true;
        //Esto es si el unico numero está en el extremo izquierdo
        for(int i = 1;i<dados.length-1;i++){
            if(dados[i]!=dados[i+1]){
                oportunidad1 = false;
                break;
            }
        }
        //Esto es si el unico numero está en el extremo derecho
        for(int i = 0;i<dados.length-2;i++){
            if(dados[i]!=dados[i+1]){
                oportunidad2 = false;
                break;
            }
        }
        if(oportunidad1 || oportunidad2){
            return true;
        }else{
            return false;
        }
    }

    boolean full(int[] dados){
        //Esto es si los dos numeros iguales están en el extremo derecho
        boolean parte1 = dados[0] == dados[1];
        boolean parte2 = dados[2] == dados[3] && dados[3] == dados[4];
        if(parte1 && parte2){
            return true;
        }
        //Esto es si los dos numeros iguales están en el extremo izquierdo
        parte1 = dados[0] == dados[1] && dados[1] == dados[2];
        parte2 = dados[3] == dados[4];
        if(parte1 && parte2){
            return true;
        }
        return false;
    }

    boolean escalera(int[] dados){
        boolean oportunidad1 = true;
        boolean oportunidad2 = true;
        boolean suboportunidad2 = true;
        //Hallar si es escalera sin el comodin
        for(int i = 0;i<dados.length-1;i++){
            if(dados[i]!=dados[i+1]-1){
                oportunidad1 = false;
                break;
            }
        }
        //Hallar si es escalera con el comodin
        //Si el valor uno está en el extremo izquierdo
        for(int i = 1;i<dados.length-1;i++){
            if(dados[i]!=dados[i+1]-1){
                oportunidad2 = false;
                break;
            }
        }
        //Si el valor uno está en el extremo izquierdo
        for(int i = 0;i<dados.length-2;i++){
            if(dados[i]!=dados[i+1]-1){
                suboportunidad2 = false;
                break;
            }
        }
        //Analizamos si ocurrio uno de los siguientes casos
        if(oportunidad1 || oportunidad2 || suboportunidad2){
            return true;
        }else{
            return false;
        }
    }

    // Ustedes pueden ignorar esto
    String[] jugadas(String[] losdados){
        String[] ret = new String[losdados.length];
        int i = 0;
        for (String dados : losdados)
        {
            ret[i] = this.jugada(dados);
            i++;
        }
        return ret;
    }
    // Ustedes pueden ignorar esto
    static String[] processBatch(String fileName) throws Exception{
        Scanner sc = new Scanner(new File(fileName));
        List<String> lines = new ArrayList<String>();
        while (sc.hasNextLine()) {
            lines.add(sc.nextLine());
        }
        return lines.toArray(new String[0]);
    }
    public static void main(String[] args) throws Exception{
        Generala g = new Generala();
        Scanner teclado = new Scanner(System.in);
        /* IGNORAR PORQUE ESTO NO SE VA A EJECUTAR PARA USTEDES */
        if (args.length > 0) {
            String[] jugadas = processBatch(args[0]);
            String resultados[] = g.jugadas(jugadas);
            for(String res : resultados) {
                System.out.println(res);
            }
            return;
        }
        System.out.println("Ingrese la secuencia");
        String secuencia = teclado.nextLine();
        // ESTO SI SE EJECUTA PARA USTEDES
        System.out.println(g.jugada(secuencia));
    }
}

/*

2. Responder a las siguientes preguntas (30 puntos)
2.1. Cuál es la probabilidad de sacar generala en un tiro
    Utilizando la regla de laplace
    La probabilidad es 6 / (6^5). Es decir, 6 aciertos de (6^5) combinaciones posibles.
    El numero 6 del 6^5 es la cantidad de valores que soporta el dado.
    El numero 5 del 6^5 es la cantidad de dados que existe.
2.2. Cuál es la probabilidad de sacar poker en un tiro
    Utilizando la regla de laplace
    La probabilidad es (6*6)/(6^5).
    El mismo concepto que el anterior para el 6^5.
    Para el 6*6, existen 6 valores posibles para que exista 4 dados de mismo valor, sin tomar en cuenta el 5to dado.
    Para el 5to dado, hay 6 valores posibles.
    Por lo tanto, cada valor del 5to dado hay seis valores posibles.
    Multiplicando la cantidad de valores posibles del 5to dado con la cantidad de valores posibles para 4 dados iguales
    se obtiene el número de aciertos posibles.
2.3. Cuál es la probabilidad de sacar full en un tiro
    Utilizando la regla de laplace
    La probabilidad es (6*6)/(6^5).
    Lo mismo que el de sacar poker, con diferencia que hacemos que, en vez de 4 dados iguales, sean 3 dados iguales,
    y, en vez de un 5to dado, hacemos que sea 2 dados iguales.
    La cantidad de valores del 5to dado y a la cantidad de valores de 2 dados iguales tienen la misma cantidad en este caso.
    La cantidad de valores de 4 dados iguales y a la cantidad de 3 dados iguales tienen la misma cantidad en este caso.
2.4. Cuál es la probabilidad de sacar escalera en un tiro
    Para el resultado 12345, podemos obtener 4 * 4 combinaciones posibles.
    Para el resultado 23456, podemos obtener 4 * 4 combinaciones posibles.
    Para el resultado 23451, podemos obtener 4 * 4 combinaciones posibles.
    Para el resultado 34561, podemos obtener 4 * 4 combinaciones posibles.
    Para el resultado 12341, podemos obtener 4 * 4 combinaciones posibles.
    4 * 4 significa 4 numeros que se pueden ubicar en 4 lugares distintos.
    Por ejemplo, 12345, 21345, 23145, ....
    En total son: 5 * (4 * 4) aciertos, donde el 5 es la cantidad de combinaciones base.
    Utilizando la regla de laplace, la probabilidad es: 
    Probalidad_escalera = (5*(4*4)) / (6^5).
2.5. Cuál es la probabilidad de sacar nada en un tiro
    Hallando la probabilidad del complemento, en donde el complemento es "no quitar una combinación", se tiene.
    La probabilidad de sacar nada es: 
    Probabilidad_Nada = 1 - Probabilidad_Generala - Probabilidad_Poker - Probabilidad_Full - Probabilidad_Escalera.

3. BONUS: (hasta 10 puntos)
3.1. Cuál es la probabilidad de sacar generala en dos tiros 
    Utilizando la probabilidad condicionada, se obtiene:
    Probabilidad_dos_tiros = [6 / (6^5)] * [6 / (6^5)].
    Donde la cantidad de valores que se multiplica (en este caso son dos) es igual a la cantidad de tiros.
    Que significa esto? Significa que para cada acierto de una generala, puede o no puede haber de nuevo una generala, y 
    de este esta nueva generala, puede o no haber una generala, asi sicesivamente.
3.2. Cuál es la probabilidad de sacar generala en tres tiros:
    Utilizando la probabilidad condicionada, se obtiene:
    Donde la cantidad de valores que se multiplica (en este caso son tres) es igual a la cantidad de tiros.
    Probabilidad_tres_tiros = [6 / (6^5)] * [6 / (6^5)] * [6 / (6^5)].
    Que significa esto? Significa que para cada acierto de una generala, puede o no puede haber de nuevo una generala, y 
    de este esta nueva generala, puede o no haber una generala, asi sicesivamente.

*/