Skip to content

Instantly share code, notes, and snippets.

@AndreasArne
Last active September 15, 2020 13:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreasArne/f43c0fff0f814527f5324f102908cc48 to your computer and use it in GitHub Desktop.
Save AndreasArne/f43c0fff0f814527f5324f102908cc48 to your computer and use it in GitHub Desktop.
Feedback på kmom02 marvin1 menyval A5
En student ville ha hjälp med/feedback på sin kod för menyval A5. Nedanför kan ni se studentens kod och
nedanför det finns min kommentar på koden.
Koden funkar inte och jag tyckte att koden var väldigt rörig och för avancerad för att fokusera på koden i sig.
Jag la istället fokus på att förklara hur man kan tänka för att lösa uppgiften. Utifrån studentens struktur.
Min kommentar innehåller några stycken där jag förklar hur man skriver koden, jag skrev mitt svar i discord och där kan man
spoiler taggar för att dölja de delarna. På så sätt kunde jag låta studenten försöka lösa det själv först och sen se hur jag
tycker man kan lösa det. Tyvärr funkar det inte här.
gamer = input("Enter a string with a letter then a number, you may enter as many letter-number pairs as wanted: ")
result_add = ""
for i, letter in enumerate(gamer):
lower = gamer.lower()
for ind, low in enumerate(lower):
if low == letter:
x = gamer[i].isupper()
y = gamer[ind].isupper()
if i == ind:
if x == False:
score = int(gamer[(i+1):(i+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
else:
score = int(-gamer[(i+1):(i+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
else:
if x == False:
score = int(gamer[(i+1):(i+2)])
if y == True:
score = int(score) - int(gamer[(ind+1):(ind+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
else:
score = int(score) + int(gamer[(ind+1):(ind+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
else:
score = int(-gamer[(i+1):(i+2)])
if y == True:
score = int(score) - int(gamer[(ind+1):(ind+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
else:
score = int(score) + int(gamer[(ind+1):(ind+2)])
result = (f"{gamer[i:(i+2)]} {score}, ")
result_add += result_add[(len(result_add)):] + result
print(result_add)
Hej
Du gör det svårare än det behöver vara men du är på rätt väg.
Det är en bra lösning med dubbla for-loopar. I den inre har du du gjort om alla bokstäver till små bokstäver,
vilket är bra, och i den yttre har du kvar original strängen. Det betyder att vi kan använda loopen med små bokstäver
för att välja spelare att räkna poäng för och använda loopen med original strängen för att räkna poängen.
Det blir lättare om vi byter plats på looparna, så den yttre loopen är små bokstäver och den inre är original loopen.
Då bryr vi oss inte om index från första loopen, den används bara för att välja ut spelare.
Vi bryr oss heller inte om poäng i den loopen.
I den inre loopen vill vi då räkna poäng för varje spelare, en åt gången.
```
result_add = ""
lower = gamer.lower()
for low in lower:
for i, letter in enumerate(gamer):
```
Vi utgår från "a2b4A5s3B1". I den yttre loopen har vi första gången värdet "a". I den inre loopen vill du nu kolla om
`low` är samma bokstav som `letter`. Men du får inte glömma att göra om letter till liten bokstav vid jämförelsen.
Du behöver en score variabel, som du har, men det är bättre om du initierar den i den yttre loopen,
så den hela tiden blir nollställd när du har räknat ut poäng för en spelare.
```
result_add = ""
lower = gamer.lower()
for low in lower:
score = 0
for i, letter in enumerate(gamer):
if low == letter.lower():
```
För själva uträkningarna gör du väldigt mycket och har många if-satser. Jag skulle säga att det ända som är
relevant är om `letter` är stor eller liten bokstav. Om den är liten, ge poäng annars dra poäng från score.
Du lägger till saker i `result_add` inne i den inre loopen för varje if-case. Det gör saker svårare.
Resultat strängen ska bara innehålla bokstav och total poäng, och du vet inte total poängen fören hela inre loopen är klar.
Därför vill vi bara lägga till i `result_add` efter den inre loopen. För då är du klar för en spelare och har all
info du behöver.
Det är grunden, sen kan vi göra koden lite smartare. T.ex. när den yttre loopen kommer till "A" som blivit omgjort till "a".
Då har vi redan räknat ut poäng för den spelaren och vill inte göra det igen. Då kan vi ha en if-sats runt den
inre loopen som kollar om `low` inte redan finns i `result_add`.
Vi vet också att efter en bokstav kommer en siffra och i den yttre loopen är vi inte intresserade av siffer värden.
Vi är bara intresserade av bokstäverna. Med den kunskapen kan vi använda `continue` för att hoppa över vartannat varv
i loopen.
Skapa en flagga (variabel med boolean värde) ovanför den yttre loopen. Om den är True tänker vi att
förra varvet var en bokstav och nu kommer en siffra, ändra den då till False och anropa `continue` för att hoppa över
denna iterationen. Efter den inre loopen sätter du flaggan till `True`, för vi kommer bara dit i koden om vi är på
en bokstav och då kommer nästa vara siffra.
Jag hoppas detta hjälper, det blev väldigt mycket text. Fråga på om du har fler frågor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment