this post was submitted on 07 Sep 2023
31 points (89.7% liked)

Programming

17008 readers
442 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 1 year ago
MODERATORS
 

so ill post a few of my failed examples below along with what I came up with as a fix, and then the actual correct code. I feel like im so close to grasping this, but missing some logic. this is for a hangman game.

one of the failed attempts:

import random
word_list = ["aardvark", "baboon", "camel"]
chosen_word = random.choice(word_list)

#Testing code
print(f'Pssst, the solution is {chosen_word}.')

#Create an empty List called display.
#For each letter in the chosen_word, add a "_" to 'display'.
#So if the chosen_word was "apple", display should be ["_", "_", "_", "_", "_"] with 5 "_" representing each letter to guess.


display = ["_"] * len(chosen_word)


guess = input("Guess a letter: ").lower()

#If the letter at that position matches 'guess' then reveal that letter in the display at that position.
#e.g. If the user guessed "p" and the chosen word was "apple", then display should be ["_", "p", "p", "_", "_"].

for letter in chosen_word:
if guess == letter:
for i in range(len(chosen_word)):
display.insert(i, guess)

print(display)

second:

for letter in chosen_word:
  if guess == letter:
    for i in range(len(chosen_word[letter])):
      display.insert(i, guess)

I ended up just saying screw it and went to this:

display = []
for char in chosen_word:
    if guess == letter:
        display += letter
   else:
    display += "_"

correct way of doing it:

import random
word_list = ["aardvark", "baboon", "camel"]
chosen_word = random.choice(word_list)

print(f'Pssst, the solution is {chosen_word}.')

display = []
word_length = len(chosen_word)
for _ in range(word_length):
  display += "_"
print(display)
  
guess = input("Guess a letter: ").lower()


for position in range(word_length):
  letter = chosen_word[position]
  if letter == guess:
    display[position] = letter

print(display)

so as you can see, i get that I can grab specific parts of a list using indices or slices, but somewhere in my brain my logic is wrong. if you guys have struggled with this before or if you have a good youtube video to help me break it down id be beyond thankful!

you are viewing a single comment's thread
view the rest of the comments
[–] Osnapitsjoey@lemmy.one 1 points 1 year ago (1 children)

Yeah I've actually been using chatgpt as well as a few other resources! My biggest gripe is that chatgpt can't really teach without showing. I want to understand where my logic was flawed, and be guided towards the correct answer, instead chatgpt will do a good job at explaining what I did wrong, and then showing me the correct code.

So c is a good starter language? Cuz I'm at the point now that I can just stackoverflow my way into making a smaller project, but I really want to learn how this all works and learn the fundamentals so I'm fluent

[–] mo_ztt@lemmy.world 1 points 1 year ago (1 children)

In my opinion, C is a difficult starter language, but one that sets you up for very good abilities in the future, because a lot of other languages' core concepts are built on C concepts. It's all bytes, and if you're comfortable with bytes then that'll put you ahead of someone who only knows the general concepts. It's similar to working construction before you go into architecture -- your buildings will be better even if you're thinking at a higher level than nails and shingles when you do most of your design.

So, ChatGPT is tuned to sort of do things for you, but you can still have it do the troubleshooting with the right prompting instead of just rewriting:

GPT-4 Prompt

I'm trying to understand what's going wrong with my code -- can you point me to the line that's causing the issue and quickly explain what might be wrong?

import random
word_list = ["aardvark", "baboon", "camel"]
chosen_word = random.choice(word_list)

#Testing code
print(f'Pssst, the solution is {chosen_word}.')

#Create an empty List called display.
#For each letter in the chosen_word, add a "_" to 'display'.
#So if the chosen_word was "apple", display should be ["_", "_", "_", "_", "_"] with 5 "_" representing each letter to guess.


display = ["_"] * len(chosen_word)


guess = input("Guess a letter: ").lower()

#If the letter at that position matches 'guess' then reveal that letter in the display at that position.
#e.g. If the user guessed "p" and the chosen word was "apple", then display should be ["_", "p", "p", "_", "_"].

for letter in chosen_word:
    if guess == letter:
        for i in range(len(chosen_word)):
            display.insert(i, guess)

print(display)

GPT-4's response

The problem with your code is in this segment:

for letter in chosen_word:
    if guess == letter:
        for i in range(len(chosen_word)):
            display.insert(i, guess)

The logic you're using here is:

  • For each letter in chosen_word,
  • If guess matches the letter,
  • Insert the guessed letter at every index of the chosen_word.

This will make the display list longer than it should be, and the letters will not replace the underscores but instead will be added alongside them.

Instead, you should check if the guessed letter matches a letter in the chosen word at a specific position, and if it does, replace the underscore at that position in the display list.

Here's the corrected segment of code:

for i in range(len(chosen_word)):
    if chosen_word[i] == guess:
        display[i] = guess

With this, the guessed letter will replace the corresponding underscore in the display list.

[–] Osnapitsjoey@lemmy.one 1 points 1 year ago