Skip to content

Marvin - steg 3

Programmering och problemlösning i Python. Jobba vidare med Marvin och implementera ny funktionalitet som använder listor.

Du har jobbat allt material i “kmom04” och gjort klart Marvin - steg 2.

Du skall bygga en ryggsäck till Marvin med hjälp av listor.

Du skall kommunicera med Marvin via text och inte via ett menyval.

Se hur det kan se ut när uppgiften är klar:

Play

Lösningar som använder konstruktionerna list/dict comprehension eller lambda funktioner godkänns inte i denna kurs.

Varje uppgift ska lösas med grundläggande Python konstruktioner som vi går igenom i kursen.

  1. Kopiera din Marvin från föregående kursmoment och utgå från den koden.

    Terminal window
    # Flytta till kurskatalogen
    cd src
    cp -ri kmom03/marvin2/* kmom04/marvin3/
    cd kmom04/marvin3
  2. Skapa en ny fil inventory.py där du lägger alla nya funktioner för inventory kommandona. Importera inventory.py i main.py. Skapa en lista i main.py som ska fungera som en ryggsäck.

  3. Lär Marvin att hantera listor. Skapa funktionen pick som tar emot tre argument, den första skall vara ryggsäcken, den andra skall vara saken man skall plocka upp och den tredje skall vara en optionell parameter som säger vilken position (index) saken skall lägga sig i (som en string). Funktionen ska lägga till saken i listan, om position skickas med ska saken tryckas in på den platsen (du ska inte ersätta det som redan ligger på den platsen, de sakerna ska flyttas ett index åt höger). Om position inte skickas med ska saken läggas till sist i ryggsäcken. Funktionen skall returnera den uppdaterade ryggsäcken.

    I main.py skall du lägga till stöd för kommandot “inv pick” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller vad som lades till i ryggsäcken och på vilken position om ett index är givet. Meddelandet skall skivas ut i funktionen och inte main programmet.

    • Tags: pick
  4. Skapa funktionen inventory som tar emot ett argument, ryggsäcken. Funktionen skall inte returnera någonting. Den skall skriva ut ett meddelande som innehåller hur antalet saker som befinner sig i ryggsäcken och alla saker som ligger där inne. I main.py lägger du till stöd för kommandot inv som exekverar funktionen.

    • Tags: inv
  5. Skapa funktionen drop som skall kasta bort en sak från ryggsäcken. Den skall ta emot två argument, första är ryggsäcken och den andra är saken som skall slängas. Funktionen skall returnera den uppdaterade ryggsäcken. I main.py skall du lägga till stöd för kommandot “inv drop” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller saken som kastades. Meddelandet skall skivas ut i funktionen och inte main programmet.

    • Tags: drop
  6. Skapa funktionen swap som skall ta emot tre argument, den första är ryggsäcken, den andra och tredje är själva sakerna som skall byta plats. Funktionen skall returnera den uppdaterade ryggsäcken. I main.py skall du lägga till stöd för kommandot “inv swap” enligt tabellen nedan. Om allt gick bra skall du skriva ut ett passande meddelande som innehåller sakerna som bytte plats. Meddelandet skall skivas ut i funktionen och inte main programmet.

    • Tags: swap
  7. Felhantering. Lägg till felhantering för kommandona “inv drop”, “inv swap” och “inv pick” som ändrar utskriften. Om en sak man vill kasta eller byta plats på inte finns i ryggsäcken skall du skriva ett passande felmeddelande som innehåller ordet “Error” och saken som inte existerar i ryggsäcken. Tips Använd dig av try-except.

    Om man anger ett för högt index i pick kommandot skall den inte plocka upp något. Du skall istället skriva ut ett passande meddelande som innehåller ordet “Error” och den givna positionen.

    När ett av dessa fel uppstår skall funktionerna returnera den originella ryggsäcken.

    • Tags: error
  8. Koden ska validera med Ruff.

    Terminal window
    # Kommandot funkar oavsett var du står i ditt repo
    uv run ruff check
  9. Testerna som finns ska passera.

  10. Ladda upp din kod till ditt repo på GitHub. Gör flera små commits när du jobbar med uppgiften!

Rätta eventuella fel som dyker upp och ladda upp igen. När det ser grönt ut så är du klar.

Följande kommandon skall fungera. Notera att Marvin ska kunna plocka upp vad som helst. Nedan visas flower, book och 0 enbart som exempel, bag motsvarar Marvins ryggsäck.

KommandoVad händerKallar påListans innehåll efter
invMarvin skall skriva ut hur många saker om finns i listan samt skriva ut deminventory(bag)[]
inv pick flowerPlocka upp en “flower” och lägg den på slutet av listanpick(bag, "flower")[“flower”]
inv pick book 0Plocka upp en “book” och den lägg på index “0”pick(bag, "book", 0)[“book”, “flower”]
inv swap flower bookByter plats på “flower” och “book”swap(bag, "flower", "book")[“flower”, “book”]
inv drop flowerKasta bort “flower”drop(bag, "flower")[“book”]
  • Utöka menyval inv med stöd för en sekvens. Utöver att fungera som tidigare ska det också gå att skriva inv <start> <stop>, där <start> och <stop> är heltal. Ändra inventory(bag) så du kan skicka med start och stop, inventory(bag, start, stop). I funktionen använd dig av slice på din lista för att hämta ut alla element från start till stop. Om man inte skickar med start och stop ska inv fungera som vanligt.

    # med inventory ["ko", "lo", "apa"]
    input: "inv 1 3" output: "lo, apa"
    input: "inv -1 3" output: "apa"
    • Tags: inv, range
  • Utöka menyval pick med stöd för en sekvens. Utöver att fungera som tidigare ska det också gå att skriva inv pick <sak>,<sak>,<sak> <position>, där sekvensen med saker är ord med komma i mellan och <position> är heltal. Ändra pick(bag, what, where) så du kan kan ta emot en sträng med flera saker. Precis som med vanliga pick så ska position vara optionellt. Om man inte skickar med en position ska alla saker läggas till sist i ryggsäcken. Om man skickar med position ska de läggas in på det index, utan att ta bort sakerna som redan finns där. pick ska fortfarande funka som vanlig om man inte skicka en en sträng med kommatecken i.

    # med inventory ["ko", "lo", "apa"]
    input: "inv pick mus,tjur" returnerar: ["ko", "lo", "apa", "mus", "tjur"]
    input: "inv pick mus,tjur 1" returnerar: ["ko", "mus", "tjur", "lo", "apa"]
    • Tags: pick