marcelogarberoglio / PI

Para realizar consultas
5 stars 0 forks source link

Ejercicio 3 - 1P-1C-2023 #287

Open urielsv opened 1 year ago

urielsv commented 1 year ago

Hola! Me gustaria saber si el ejercicio de Worlde de esta forma estaria bien resuelto.

/*
Ejercicio 3
Implementar una función wordle que resuelva un tablero del juego Wordle
(también conocido como palabra del día). La función recibe:
● Una palabra secreta de COLS caracteres (no es necesario validarlo)
● Una matriz de caracteres de tamaño FILS x COLS donde cada fila es un
intento del usuario para resolver la palabra secreta
● La cantidad de intentos del usuario (un entero menor o igual a FILS)
La función debe dejar en otra matriz una marca V, A o G para cada letra de
cada intento del usuario donde:
● V: VERDE significa que la letra está en la palabra y en la posición
CORRECTA.
● A: AMARILLO significa que la letra está presente en la palabra pero en la
posición INCORRECTA.
● G: GRIS significa que la letra NO está presente en la palabra.
hasta que se marque el primer intento correcto (todas las letras verdes) o se
hayan analizado todos los intentos.
La función debe retornar un entero con el número del primer intento correcto
(todas las letras verdes) o -1 si ningún intento es correcto.
Notar que tanto la palabra oculta como las palabras de los intentos pueden
contener letras repetidas. En ese caso, las pistas son independientes para cada letra
y tienen prioridad: verde tiene mayor prioridad al amarillo
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>

#define COLS 5
#define FILS 6

char belongs(char letter, int idx, char secret[COLS])
{
    // ans es 'G', asumo que no esta
    char ans = 'G';
    for (int i = 0; i < COLS; i++) {
        // Me fijo que sean la misma letra y la misma posicion
        if (letter == secret[i] && idx == i)
            ans = 'V'; // VERDE (== pos)
        // Si son iguales pero distinta posicion (y no se habia
        // marcado como 'V' anteriormente en el ciclo)
        else if (letter == secret[i] && idx != i && ans != 'V')
            ans = 'A'; // AMARILLO (!= pos)
    }
    return ans;
}

// Asumo que siempre trabajo con mayusculas, sino hago todo toupper
int wordle(const char secret[COLS], char m[FILS][COLS], size_t tries)
{
    if (tries > FILS) return -1;

    char mTries[FILS][COLS];

    int allGreen;
    for (int i = 0; i < FILS && tries; i++) {
        allGreen = 1;
        for (int j = 0; j < COLS && tries; j++) {
            // pongo la letra que corresponde en cada posicion.
            mTries[i][j] = belongs(m[i][j], j, secret); 
            // Si alguna no es 'V' entonces ya no puede ser un
            // intento correcto
            if (mTries[i][j] != 'V')
                allGreen = 0;

            // Me sirve para ver que la funcion mTries es como la
            // del parcial (ignorar)
            // printf("%c", mTries[i][j]);
        }
        // puts("");

        // allGreen es equivalente a pal correcta -> devuelve la pos+1
        // pues por testeo el primer intento es 1.
        if (allGreen)
            return i+1;

        tries--;
    }
    // No se encontro la palabra secreta
    return -1;
}

int main() 
{
    char secret[COLS] = "ROSAS";
    char m[FILS][COLS] = 
    {"FAROL", "SACOS", "RATOS", "ROSAS", "COSAS", "TECLA"};

    assert(wordle(secret, m, 7) == -1);
    assert(wordle(secret, m, 3) == -1);
    assert(wordle(secret, m, 6) == 4);
    puts("OK!");
    return 0;
}