Jurisdiccional 2019 Nivel 3: Jugando generala

Hago este post para que discutamos ideas sobre “Jugando generala”.

Generala.pdf (58,4 KB)

2 Me gusta

La parte más complicada de comprobar era la de Escalera, pero como son solo 5 elementos se puede mandar fors a lo loco (basta con 3) e incluso next_permutation (aunque esto sería una locura).
Dejo más o menos lo que hice:

Código
bool escalera = false;
int dados[] = {a, b, c, d, e};
sort(dados, dados + 5);
if(dados[0] == 1){
    escalera = true;
    for(int i = 0; i < 5; i++){
        if(dados[i] != i + 1){
            escalera = false;
            break;
        }
    }
    if(!escalera){
        escalera = true;
        for(int i = 1; i < 5; i++){
            if(dados[i] != i + 2){
                escalera = false;
                break;
            }
        }
    }
} else if(dados[0] == 2){
    escalera = true;
    for(int i = 0; i < 5; i++){
        if(dados[i] != i + 2){
            escalera = false;
            break;
        }
    }
}
res[6] = (escalera)? 20 : 0;
2 Me gusta

¡Está muy bien tu idea! Particularmente me gusta mucho la observación de ordenar, y entonces al ya estar ordenados quedan solamente 3 casos posibles.

Lo que podés aprovechar es que en C++, los vector ya tienen un == que se fija si tienen los mismos elementos en el mismo orden (y tambien tienen un < que compara lexicográficamente). Con eso se puede escribir la misma idea pero mucho más corta y clara más o menos así:

vector<int> dados = {a,b,c,d,e};
sort(dados.begin(), dados.end());
vector<int> escalera1 = {1,2,3,4,5};
vector<int> escalera2 = {2,3,4,5,6};
vector<int> escalera3 = {1,3,4,5,6};

if (dados == escalera1 || dados == escalera2 || dados == escalera3)
    return 20;
else
    return 0;
4 Me gusta

Dentro de la competencia me enfrasque con una función que no me salía (para calcular los 2 más repetidos, para el full y poker).
Ayer pensándolo mejor me dí cuenta que todo se soluciona facil con un set, le cargo los parámetros y no se cargan los repetidos, entonces si el tamaño del set es 5 hay escalera, si el tamaño es uno es generala y si el tamaño es 2 al haber solo 2 números la cantidad del otro se ve por descarte, así que solo tengo que contar cuantas veces se repite a, en vez de todo el vector.
Dejó el código que arme en base a esto

vector<int> generala(int a, int b, int c, int d, int e){
	vector<int> resultado(10,0);
	vector<int> dado={a,b,c,d,e};
	set<int> dados;
	for(int x:dado){
		resultado[x-1]+=x;
		dados.insert(x);
	}
	if (dados.size()==5) resultado[6]=20;
	if (dados.size()==2){
		int cont=0;
		for(int val : dado) if (a==val) cont++;
		if(cont==3||cont==2) resultado[7]=30;
		else resultado[8]=40;
	}
	if (dados.size()==1) resultado[9]=50;
	return resultado;
}
3 Me gusta

Está buena la idea. Igual hay que verlo con cuidado.

¿Seguro? ¿Qué pasa con entradas como 1 2 3 5 6?

3 Me gusta