Spaces:
Build error
Build error
| # Load our data | |
| import os | |
| def load_raw_text(corpus_directory: str, file_names=None) -> str: | |
| """Loads all the text files in a directory into one large string""" | |
| corpus = "" | |
| for file_name in os.listdir(corpus_directory): | |
| # Read the file as a string | |
| file_path = os.path.join(corpus_directory, file_name) | |
| if os.path.isdir(file_path): | |
| continue | |
| # Make sure we only read text files | |
| if ".txt" not in file_name: | |
| continue | |
| with open(file_path, 'r') as file: | |
| file_contents = file.read() | |
| corpus += (file_contents + "\n") | |
| return corpus | |
| # REPLACE WITH YOUR CORPUS DIRECTORY | |
| corpus = load_raw_text(corpus_directory="./corpus") | |
| import re | |
| import util | |
| # TODO: Strip accents using util.strip_accents | |
| # TODO: Make corpus lowercase | |
| corpus = corpus.lower() | |
| # TODO: Split corpus into tokens using the following function | |
| word_regex = r"[a-zïëñ]+" | |
| def tokenize(text: str): | |
| return re.findall(word_regex, text) | |
| s_tok = tokenize(corpus) | |
| # TODO: Create a set named "lexicon" with all of the unique words | |
| lexicon = set() | |
| for word in s_tok: | |
| lexicon.add(word) | |
| filtered_lexicon = set() | |
| for word in lexicon: | |
| if 3 <= len(word) <= 7: | |
| filtered_lexicon.add(word) | |
| import random | |
| def random_scramble(lexicon: set): | |
| lexicon = list(lexicon) | |
| word = random.choice(lexicon) | |
| # Turn the word into a list of characters | |
| word_chars = list(word) | |
| # Shuffle those characters | |
| random.shuffle(word_chars) | |
| # Re-join the characters into a string | |
| shuffled = ''.join(word_chars) | |
| return {'shuffled': shuffled, 'original': word} | |
| import gradio as gr | |
| from typing import Tuple | |
| def create_hangman_clue(word, guessed_letters): | |
| """ | |
| Given a word and a list of letters, create the correct clue. | |
| For instance, if the word is 'apple' and the guessed letters are 'a' and 'l', the clue should be 'a _ _ l _' | |
| """ | |
| clue = '' | |
| for letter in word: | |
| if letter in guessed_letters: | |
| clue += letter + ' ' | |
| else: | |
| clue += '_ ' | |
| return clue | |
| def pick_new_word(lexicon): | |
| lexicon = list(lexicon) | |
| return { | |
| 'word': random.choice(lexicon), | |
| 'guessed_letters': set(), | |
| 'remaining_chances': 6 | |
| } | |
| def hangman_game(current_state, guess): | |
| """Update the current state based on the guess.""" | |
| if guess in current_state['guessed_letters'] or len(guess) > 1: | |
| # Illegal guess, do nothing | |
| return (current_state, 'Invalid guess') | |
| current_state['guessed_letters'].add(guess) | |
| if guess not in current_state['word']: | |
| # Wrong guess | |
| current_state['remaining_chances'] -= 1 | |
| if current_state['remaining_chances'] == 0: | |
| # No more chances! New word | |
| current_state = pick_new_word(filtered_lexicon) | |
| return (current_state, 'You lose!') | |
| else: | |
| return (current_state, 'Wrong guess :(') | |
| else: | |
| # Right guess, check if there's any letters left | |
| for letter in current_state['word']: | |
| if letter not in current_state['guessed_letters']: | |
| # Still letters remaining | |
| return (current_state, 'Correct guess!') | |
| # If we made it here, there's no letters left. | |
| current_state = pick_new_word(filtered_lexicon) | |
| return (current_state, 'You win!') | |
| def state_changed(current_state): | |
| clue = create_hangman_clue(current_state['word'], current_state['guessed_letters']) | |
| guessed_letters = current_state['guessed_letters'] | |
| remaining_chances = current_state['remaining_chances'] | |
| return (clue, guessed_letters, remaining_chances) | |
| with gr.Blocks(theme=gr.themes.Soft(), title="karijona Hangman") as hangman: | |
| current_word = gr.State(pick_new_word(filtered_lexicon)) | |
| gr.Markdown("# karijona Hangman") | |
| with gr.Row(): | |
| current_word_textbox = gr.Textbox(label="Clue", interactive=False, value=create_hangman_clue(current_word.value['word'], current_word.value['guessed_letters'])) | |
| guessed_letters_textbox = gr.Textbox(label="Guessed letters", interactive=False) | |
| remaining_chances_textbox = gr.Textbox(label="Remaining chances", interactive=False, value=6) | |
| guess_textbox = gr.Textbox(label="Guess") | |
| guess_button = gr.Button(value="Submit") | |
| output_textbox = gr.Textbox(label="Result", interactive=False) | |
| guess_button.click(fn=hangman_game, inputs=[current_word, guess_textbox], outputs=[current_word, output_textbox])\ | |
| .then(fn=state_changed, inputs=[current_word], outputs=[current_word_textbox, guessed_letters_textbox, remaining_chances_textbox]) | |
| hangman.launch() | |