Generala.java 10.4 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
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
220
    La probabilidad es (5 * 6 * 6)/(6^5).
221
    El mismo concepto que el anterior para el 6^5.
222 223 224 225 226
    Para el 6*6, existen 6 valores posibles para que exista 4 dados de mismo valor, sin tomar en cuenta el dado restante.
    Para el dado restante, hay 6 valores posibles.
    Por lo tanto, cada valor del dado restante hay seis valores posibles.
    Pero ocurre lo siguiente: el dado con el valor distinto puede colocarse en 5 lugares distintos.
    Por lo tanto, son (5 * 6 * 6) de aciertos posibles.
227 228
2.3. Cuál es la probabilidad de sacar full en un tiro
    Utilizando la regla de laplace
229
    La probabilidad es ((5 - 1) * (5 - 1) * (6 * 6))/(6^5).
230 231
    Para el 6 * 6, existen 6 valores posibles para que exista 3 dados de mismo valor, sin tomar en cuenta los dos dados restantes.
    Existen 6 valores para que ambos ultimos dos dados tengan el mismo valor.
232
    Pero ocurre que: los dos dados restantes va a recorrer (5 - 1) lugares posibles, porque el otro dado tiene el
233
    mismo valor.
234
    Por lo tanta, se tiene ((5 - 1) * (5 - 1)) * (6 * 6) aciertos
235
2.4. Cuál es la probabilidad de sacar escalera en un tiro
236 237 238 239 240 241
    Para el resultado 12345, podemos obtener 5 * 5 combinaciones posibles.
    Para el resultado 23456, podemos obtener 5 * 5 combinaciones posibles.
    Para el resultado 23451, podemos obtener 5 * 5 combinaciones posibles.
    Para el resultado 34561, podemos obtener 5 * 5 combinaciones posibles.
    Para el resultado 12341, podemos obtener 5 * 5 combinaciones posibles.
    5 * 5 significa 5 dados que se pueden ubicar en 5 lugares distintos.
242
    Por ejemplo, 12345, 21345, 23145, ....
243
    En total son: 5 * (5 * 5) aciertos, donde el 5 fuera del parentesis es la cantidad de combinaciones base.
244
    Utilizando la regla de laplace, la probabilidad es: 
245
    Probalidad_escalera = (5*(5*5)) / (6^5).
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
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.

*/