UBS-Server / routes /wordle.py
m-abdur2024's picture
Upload 40 files
0d3476b verified
raw
history blame
No virus
7.66 kB
# import json
# import logging
# from collections import defaultdict, Counter
# from flask import Flask, request, jsonify
# from routes import app
# import nltk
# from nltk.corpus import words
# # Initialize NLTK word list
# try:
# nltk.data.find('corpora/words')
# except LookupError:
# nltk.download('words')
# # Configure logging
# logging.basicConfig(level=logging.INFO)
# logger = logging.getLogger(__name__)
# def load_word_list():
# """
# Load and return a list of valid 5-letter English words using NLTK's corpus.
# """
# word_list = [word.lower() for word in words.words() if len(word) == 5 and word.isalpha()]
# return word_list
# WORD_LIST = load_word_list()
# def filter_words(guess_history, evaluation_history, word_list):
# """
# Filters the word list based on the guess history and their evaluations.
# Parameters:
# - guess_history: List of previous guesses.
# - evaluation_history: List of evaluations corresponding to the guesses.
# - word_list: List of possible valid words.
# Returns:
# - A list of possible words that match all constraints.
# """
# required_positions = dict() # Positions with correct letters ('O')
# excluded_positions = defaultdict(set) # Positions with excluded letters ('X')
# required_letters = defaultdict(int) # Letters that must be present with minimum counts
# excluded_letters_max = dict() # Letters that must not exceed certain counts
# for guess, evaluation in zip(guess_history, evaluation_history):
# per_guess_letter_count = defaultdict(int)
# # First pass to count 'O's and 'X's for each letter in the guess
# for i in range(len(guess)):
# letter = guess[i]
# eval_symbol = evaluation[i]
# if eval_symbol in ['O', 'X']:
# per_guess_letter_count[letter] += 1
# # Second pass to set constraints based on evaluation
# for i in range(len(guess)):
# letter = guess[i]
# eval_symbol = evaluation[i]
# if eval_symbol == 'O':
# # Letter must be in this exact position
# required_positions[i] = letter
# # Update required letter count
# if per_guess_letter_count[letter] > required_letters[letter]:
# required_letters[letter] = per_guess_letter_count[letter]
# elif eval_symbol == 'X':
# # Letter must be in the word but not in this position
# excluded_positions[i].add(letter)
# # Update required letter count
# if per_guess_letter_count[letter] > required_letters[letter]:
# required_letters[letter] = per_guess_letter_count[letter]
# elif eval_symbol == '-':
# if letter in per_guess_letter_count:
# # The total count of the letter in the word is exactly the number of 'O's and 'X's
# excluded_letters_max[letter] = per_guess_letter_count[letter]
# else:
# # The letter is not in the word at all
# excluded_letters_max[letter] = 0
# elif eval_symbol == '?':
# # Masked feedback; no constraints applied
# continue
# else:
# # Invalid symbol; you can choose to handle this differently
# continue
# possible_words = []
# for word in word_list:
# word = word.lower()
# # Skip words that are not 5 letters (redundant since word_list is already filtered)
# if len(word) != 5:
# continue
# # Flag to determine if the word satisfies all constraints
# valid = True
# # Check for required letters in specific positions ('O')
# for pos, char in required_positions.items():
# if word[pos] != char:
# valid = False
# break
# if not valid:
# continue
# # Check for excluded letters in specific positions ('X')
# for pos, chars in excluded_positions.items():
# if word[pos] in chars:
# valid = False
# break
# if not valid:
# continue
# # Count letters in the current word
# word_letter_count = Counter(word)
# # Check for required letters with minimum counts
# for letter, count in required_letters.items():
# if word_letter_count.get(letter, 0) < count:
# valid = False
# break
# if not valid:
# continue
# # Check for excluded letters with maximum counts
# for letter, max_count in excluded_letters_max.items():
# if word_letter_count.get(letter, 0) > max_count:
# valid = False
# break
# if not valid:
# continue
# # If all checks pass, add the word to possible words
# possible_words.append(word)
# return possible_words
# def suggest_next_guess(guess_history, evaluation_history, word_list):
# """
# Suggests the next best guess based on the current guess and evaluation history.
# Parameters:
# - guess_history: List of previous guesses.
# - evaluation_history: List of evaluations corresponding to the guesses.
# - word_list: List of possible valid words.
# Returns:
# - The next guess as a string.
# """
# possible_words = filter_words(guess_history, evaluation_history, word_list)
# if not possible_words:
# return "No valid words found"
# # Strategy for selecting the next guess:
# # Here, we'll simply return the first possible word.
# # You can implement more sophisticated strategies like frequency analysis.
# return possible_words[0]
# @app.route('/wordle-game', methods=['POST'])
# def wordle_game():
# """
# Endpoint to generate the next Wordle guess based on the history.
# Expects a JSON payload with:
# - guessHistory: List of previous guesses.
# - evaluationHistory: List of evaluations corresponding to each guess.
# Returns a JSON response with:
# - guess: The suggested next guess.
# """
# try:
# # Parse JSON input
# data = request.get_json()
# logger.info("Data received for evaluation: %s", data)
# if not data:
# logger.error("No JSON data received")
# return jsonify({"error": "No input data provided"}), 400
# guess_history = data.get("guessHistory", [])
# evaluation_history = data.get("evaluationHistory", [])
# # Validate input lengths
# if len(guess_history) != len(evaluation_history):
# logger.error("Mismatch between guessHistory and evaluationHistory lengths")
# return jsonify({"error": "guessHistory and evaluationHistory must be of the same length"}), 400
# # Suggest the next guess
# next_guess = suggest_next_guess(guess_history, evaluation_history, WORD_LIST)
# logger.info("Suggested next guess: %s", next_guess)
# # Return the response
# return jsonify({"guess": next_guess}), 200
# except Exception as e:
# logger.exception("An error occurred while processing the guess")
# return jsonify({"error": str(e)}), 500