Din egen chattbot - Marvin - steg 1
Programmering och problemlösning i Python, du skall bygga en chattbot Marvin som kan svara på “alla” dina frågor.
#Förkunskaper
Du har jobbat igenom artikeln “Villkor och loopar” och gjort labben Python med villkor och loopar.
#Introduktion
Kopiera grundkoden för din Marvin enligt följande.
# Ställ dig i kurskatalogen
cp -i example/marvin/marvin.py me/kmom02/marvin1/
Gå till katalogen och testkör Marvin.
cd me/kmom02/marvin1/
./marvin.py
Öppna koden i en texteditor och titta igenom hur marvin.py
fungerar.
Nu kan du börja jobba.
#Krav
Ni får inte använda listor eller skapa egna funktioner för att lösa uppgifterna.
Taggarna för varje uppgift motsvarar själva menyvalet. För att testa Menyval 1 och 2 kan man då använda --tags=1,2
, för Menyval a1 --tags=a1
osv.
Sök på bilder på Asciiart (eller motsvarande) och hitta din egen bild på “Marvin”. Lägg in din bild i programmet och ersätt den med bilden på Marvin.
Organisera din kod i
if
-satsen inutiwhile
-loopen. Samla all kod i filenmarvin.py
. Se till att dina menyval har samma siffra som det står i kraven.Uppdatera menyval 1 för att berätta vad du heter. Byt ut hälsningsfrasen mot en annan. Du kan även byta namnet på din “Marvin”, om du vill.
Menyval 2: Celsius till Fahrenheit. Marvin ska fråga efter en temperatur i Celsius och sedan skriva ut en sträng som skall innehålla motsvarande i Fahrenheit. Värdet skall avrundas till två decimaler.
input: 135.205 output: "275.37"
- Menyval 3: Poäng till betyg, Marvin ska fråga efter maxpoäng samt dina poäng och sedan ska Marvin skriva ut vilket betyg dina poäng motsvarade. Använd betygsskalan:
Score Grade
>= 90% A
>= 80% B
>= 70% C
>= 60% D
< 60% F
Formatera output enligt score: <betyg>
.
input: "100"
input: "59" output: "score: F"
input: "70"
input: "50" output: "score: C"
- Menyval 4: Summa och medel: Marvin ska fråga efter tal tills du skriver “done” och sedan ska Marvin skriva ut en sträng som skall innehålla summan och medelvärdet för dessa tal. Avrunda dina värden till två decimaler. Exempel:
input: 1
input: 2
input: 3
input "done" output: "The sum of all numbers are 6 and the average is 2"
- Menyval 5: Marvin ska fråga efter en sträng och skriva ut en ny sträng där varje karaktär har ökat med +1 och är separerad med “-“. Exempel:
input: "apa" output: "a-pp-aaa"
input: "kassler" output: "k-aa-sss-ssss-lllll-eeeeee-rrrrrrr"
Menyval 6: Lägg till så att Marvin frågar efter tal och för varje tal angivet så ska Marvin skriva ut “larger!” om det nya talet är större, “smaller!” om det var mindre eller “same!” om talet som skrev in hade samma värde som det föregående talet. Första gången man startar menyvalet kommer Marvin inte ha något tal att jämföra med, då skall den be användaren att mata in två tal. Detta ska göras tills användaren skriver “done”. Använd try-except för att hantera om användaren skriver in något som inte är en siffra. Om användaren gör det ska programmet inte krascha. Istället ska det skriva ut
"not a number!"
och sen fortsätta med loopen så att användaren kan fortsätta skriva in siffror.Exempel:
input: 1 input: 2 output: "larger!" input: 2 output: "same!" input: 1 output: "smaller!" input: "hej" output: "not a number!" input: 3 output: "larger!" input "done"
Menyval 7: Gör så att Marvin kan validera personnummer med hjälp av Luhnalgoritmen. Algoritmen funkar på så sätt att varannan siffra multipliceras med 2 och 1, med start på första siffran i personnumret. Om något tal vid multiplikationen blir större än 9 ersätts det talet med dess siffersumma. Därefter summeras alla tal och om summan är jämt delbar med 10 så är kontrollsiffran korrekt. Om personnumret validerar ska Marvin skriva ut
Valid
annarsNot valid
. Koden ska klara av personnummer med och utan-
innan de fyra sista siffrorna och om för får eller för många siffror skickas med ska det bliNot valid
.8 1 1 2 1 8 9 8 7 6 * 2 1 2 1 2 1 2 1 2 1 --------------------------- ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 16 1 2 2 2 8 18 8 14 6
Vilket blir
1 + 6 + 1 + 2 + 2 + 2 + 8 + 1 + 8 + 8 + 1 + 4 + 6 = 50
som är delbart med 10.Exempel:
input: "811218-9876" output: "Valid" input: "231218-9874" output: "Not valid" input: "8181818181" output: "Valid"
Menyval 8: Gör så Marvin kan tala rövarspråket. Marvin ska använda ett input anrop för att ta emot ett ord och sen skriva ut ordet översatt till rövarspråket. Följande bokstäver är vokaler: “A, E, I, O, U, Y, Å, Ä, Ö”
Exempel:
input: "b" output: "bob" input: "apa" output: "apopa"
Testa, validera och publicera din kod enligt följande.
# Ställ dig i kurskatalogen
dbwebb test marvin1
dbwebb publish marvin1
Rätta eventuella fel som dyker upp och publicera igen. När det ser grönt ut så är du klar.
#Extrauppgift
För att inkludera dina extrauppgifter i testerna behöver du skicka med -e
eller --extra
i test kommandot.
- Menyval a1: Gör ett val där Marvin tar emot två
input()
i from av strängar. Den skall sedan kolla om alla bokstäver i den andra strängen finns i den första. Om en bokstav i den andra strängen förekommer flera gånger måste den finnas minst samma antal gånger i den första. Exempel:
input: "Python", "phno" output: "Match!"
input: "Programming", "gram" output: "Match!"
input: "kassler", "kusl" output: "No match!"
input: "mister", "misse" output: "No match!"
- Menyval a2: Dubblera tills det innehåller alla siffror, gör ett menyval där Marvin räknar ut hur många gånger ett tal behöver multipliceras med två för att talet ska innehålla alla siffror mellan 0 och 9 minst en gång. Menyvalet ska ta två inputs, ett som är talet som ska multipliceras och ett input som är hur många gånger den ska försöka multiplicera innan den ger upp. Om den inte lyckas innan den ska ge upp returnera -1. Exempel:
input: 1, 1000 output: "Answer: 68 times" (295147905179352825856)
input: 1234567890, 1000 output: "Answer: 0 times"
input: 555, 10 output: "Answer: -1 times"
- Menyval a3: Slå ihop namn, gör ett menyval där Marvin tar emot två namn, du kan räkna med att båda namnen bara innehåller små bokstäver. Slå ihop namnen till ett, ex. “brad” och “angelina” blir “brangelina”. I det första namnet hitta ska du hitta första vokalen och spara alla konsonanter framför den, ex. “brad” blir “br” och “ben” blir “b”. I det andra namnet ta bort alla konsonanter från början till första vokalen, ex. “brad” blir “ad”, “angelina blir “angelina” och “sheldon” blir “eldon”. Konkatenera sen den sparade delen från det första namnet med den sparade delen från det andra namnet. Vokalerna är
"a e i o u y"
, vi räknar inte med"å ä ö"
. Exempel:
input: "brad", "angelina" output: "brangelina"
input: "sheldon", "amy" output: "shamy"
input: "ross", "rachel" output: "rachel"
input: "britain", "exit" output: "brexit"
- Menyval a4: Räkna poäng, gör ett menyval där Marvin tar emot en input som ska vara en lång sträng med där varannan karaktär är en bokstav och varannan är en siffra, ex
"a2b4A5s3B1"
. En bokstav representerar en spelare och efterföljande siffra är dess poäng. Om bokstaven är liten, får spelaren poäng, om det är en stor bokstav förlorar spelaren poäng. Räkna ut och skriv ut varje spelares totala poäng.
I exemplet ovanför finns tre spelare, A,B och S. A’s poäng blir 2 - 5, B’s poäng är 4 - 1 och för S blir uträkningen 3.
Notera att utskriften ska vara formaterad som i exemplet nedanför, inget mellanrum före första bokstaven och inget komma efter sista siffran. Exempel:
input: "a2b4A5s3B1" output: "a -3, b 3, s 3"
input: "g3l1H5l2G3l1" output: "g 0, l 4, h -5"
Tip, nästla två for-loopar.
#Tips från coachen
Använd dbwebb test marvin1 --tags <menyval>
för att bara köra testerna för menyvalet du jobbar med. Du kan använda dbwebb test marvin1 -s
för att se alla taggar som finns och vilka tester de kör.
Lycka till och hojta till i forumet om du behöver hjälp!
#Revision history
- 2023-06-16: (A, aar) Ny version för v5.