• kth.se
  • Studentwebben
  • Intranät
  • kth.se
  • Studentwebben
  • Intranät
Logga in
DD1366 VT24 (progp24)
Gammalt Ommästarprov Funktionell Programmering
Hoppa över till innehåll
Översikt
  • Logga in
  • Översikt
  • Kalender
  • Inkorg
  • Historik
  • Hjälp
Stäng
  • Min översikt
  • DD1366 VT24 (progp24)
  • Uppgifter
  • Gammalt Ommästarprov Funktionell Programmering
2024 VT
  • Startsida
  • Kursöversikt
  • Moduler
  • Uppgifter
  • Course Evaluation

Gammalt Ommästarprov Funktionell Programmering

  • Inlämningsdatum 19 maj 2023 av 18:00
  • Poäng 1
  • Lämnar in en filuppladdning
  • Tillgänglig 12 maj 2023 kl 17:00–30 jun 2023 kl 17:00
Den här uppgiften låstes 30 jun 2023 kl 17:00.

Mästarprovet ska lösas individuellt och redovisas både skriftligt och muntligt. Inget samarbete är tillåtet, se vidare hederskodexen. Du ska alltså inte diskutera lösningar med någon annan fram till dess att alla muntliga redovisningar är avklarade. Inlämningarna plagiatgranskas. Nytt för 2023 är att det inte är tillåtet att använda verktyg baserade på AI/maskininlärning i arbetet med lösningarna. Exempel på förbjudna verktyg är Github Copilot och ChatGPT.

Skriftliga lösningar ska lämnas in i Canvas.
Det bästa formatet för inlämningar är litterär programmering (literate programming) i en stil som liknar Physically Based Rendering. Bokens tredje utgåva finns gratis på nätet här . Skriv i så fall koden och texten som en akademisk uppsats och illustrera elegant och begripligt. Använd till exempel noweb . Lämna in resultatet som pdf.
Det näst bästa formatet (och fortfarande kanonbra) är att använda LaTeX för att skapa texten. De flesta som använder LaTeX gör det via ett webbgränssnitt som till exempel Overleaf . Om du bygger lokalt, tänk på att använda pdflatex så att resultatet blir en pdf-fil. Assistenterna ska inte behöva bygga LaTeXfiler själva och framför allt inte installera externa bibliotek.
Det tredje bästa är att använda Markdown

Links to an external site. som är enklare än LaTeX och ger nästan lika bra resultat.
Resterande: Om ni använder Microsoft Word eller liknande - tänk på att spara som pdf så att alla kan läsa texten som det är tänkt utan att ha Word installerat.
Skicka inte in nedpackade arkivfiler utan använd Ctrl-klick för att lägga till var och en av filerna i inlämningen.

Krav på koden:

  1. I varje uppgift krävs typsignaturer. Detta gäller även på hjälpfunktioner som du skriver till stöd för huvuduppgiften. De automatiskt genererade räcker inte för godkänt. Undantag ges för anonyma funktioner som skrivits med lambdanotation. Här är typsignaturer valfria om ej annat anges.
  2. Vissa uppgifter kräver en viss metodik, till exempel svansrekursion eller högre ordningens funktioner.
  3. Det är alltid tillåtet att använda Haskells standardbibliotek bortsett från när det strider mot regel nummer 2.

Skriv ditt namn och KTH-mailadress överst på framsidan av varje pdf, markdownfil och/eller kodfil i lösningarna. Läs på dina lösningar inför den individuella muntliga redovisningen som kommer att ske kort efter deadline i Zoom för någon i lärarlaget. Tidsbokningen kommer att komma upp nära uppgiftens deadline och det kommer att anslås på Canvas när de har kommit upp. Den muntliga redovisningen tar 10 minuter för dig, men de som bedömer dig har 5 minuters paus mellan varje par av redovisningar.

Det är viktigt att du förbereder dig inför den muntliga redovisningen. För att en uppgift ska godkännas ska du kunna förklara och motivera din implementation och de delar av Haskell och paradigmet funktionell programmering som du har använt. Alla programmeringsuppgifter ska lösas i Haskell. Det är alltid tillåtet att använda hjälpfunktioner. Det är alltid tillåtet att använda nästlade typer.

Läs uppgifterna mycket noga så att du inte råkar basera dina lösningar på en missuppfattning. Fråga en lärare på kursen om någon formulering är oklar.

Generella regler för mästarprov såsom vad som krävs för godkänt finns på mästarprovssidan i Canvas. Tänk på att mästarprovet bedöms efter sin sämst lösta uppgift så överarbeta inte en uppgift förräns alla är OK.

Som exempel på hur kod-delen av en inlämningsuppgift kan se ut, se facit och rättningsmallar från Tentaarkivet i DD1361, till exempel 2017-09-18. Det finns också lösningsförslag på gamla mästarprov. Titta under uppgifter i vänstermarginalen och längst ner finns en länk till ett Gitubrepo. Som exempel på hur en teorifråga kan besvaras, se facit och rättningsmallar från tentaarkivet i DD1362 till exempel juni 2021.

Mästarproven behöver redovisas både skriftligt och muntligt. Om du har lämnat in den skriftliga biten i tid så behöver du för att få godkänt även boka in dig på en muntlig redovisning med hjälp av REMORES. Välj en anonym assistent, välj först inom vilket 2h-intervall som du vill redovisa och välj sist en 10-minuterstid då du faktiskt redovisar. Det finns 4 tider per timme eftersom assistenterna behöver ställtid mellan redovisningarna. Lycka till.

Uppgift 1:
Vi är intresserade av namn, art och bevattningsnivå för en krukväxt. Här är exempel på hur en klass för detta ser ut i Java och Python:

Här är exempel på hur du kan skapa en klass för en krukväxt i både Python och Java.

Python:

class Plant:
    def __init__(self, name, species, watering_level):
        self.name = name
        self.species = species
        self.watering_level = watering_level

    def water_plant(self):
        self.watering_level += 1

Du kan sedan skapa en instans av Plant på följande sätt:

python
my_plant = Plant("My Green Plant", "Ficus", 5)

Och du kan öka bevattningsnivån med följande kommando:

python
my_plant.water_plant()

Java:

public class Plant {
    private String name;
    private String species;
    private int wateringLevel;

    public Plant(String name, String species, int wateringLevel) {
        this.name = name;
        this.species = species;
        this.wateringLevel = wateringLevel;
    }

    public void waterPlant() {
        this.wateringLevel++;
    }

    // getters and setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public String getSpecies() { return species; }
    public void setSpecies(String species) { this.species = species; }
    
    public int getWateringLevel() { return wateringLevel; }
    public void setWateringLevel(int wateringLevel) { this.wateringLevel = wateringLevel; }
}

Du kan sedan skapa en instans av Plant på följande sätt:

Plant myPlant = new Plant("My Green Plant", "Ficus", 5);

Och du kan öka bevattningsnivån med följande kommando:

myPlant.waterPlant();

Bevattningsnivå för jord har ingen särskilt storhet eller enhet utan är bara ett tal. Dels för att det oftast fungerar så på jordfuktmätare för plantor, dels för att det gör uppgiften enklare.

1a) Implementera motsvarigheten till Plant med Record Syntax i Haskell. Följ denna guide Links to an external site..
1b) Om du implementerat en planta i likhet med guiden så kommer dina plantor att vara Immutable (oföränderlig). Vad innebär det för skillnad när man vattnar en planta i Haskell jämfört med Java eller Python (välj Java eller Python, beroende på vilket du kan bäst, inte båda!)
1c) Skriv en funktion som tar in en lista med instanser av Plant och bevattnar dem alla. Använd en högre ordningens funktion för att göra detta. Välj mellan map, foldl, foldr och filter. Kom ihåg att skriva funktionens typsignatur i din kod.

Uppgift 2:
Implementera en Haskellfunktion som tar in (i) en lista med strängar och (ii) en begynnelsebokstav för att sedan producera en ny lista som innehåller strängarna i ursprungslistan som (a) har den angivna begynnelsebokstaven och dessutom (b) är av udda längd. Din implementation behöver uppfylla följande krav:
(1) Du får inte använda högre ordningens funktioner, specifikt inte map, foldl, foldr eller filter.
(2) Du måste på en central plats i din lösning använda svansrekursion och i dokumentationen beskriva hur svansrekursion skiljer sig från vanlig rekursion.
(3) Funktionen ska inte krascha om listan innehåller tomma strängen.
...och som så ofta gäller på mästarprov i funktionell programmering så skriver vi detta igen så att ni inte behöver kolla på två ställen:
(4) Du måste ange typsignatur på funktionerna.
(5) Det är tillåtet att använda en eller flera hjälpfunktioner. Även denna/dessa behöver ha typsignatur utskriven/utskrivna.

Exempelindata. av dessa strängar med begynnelsebokstav 'a':


arm
huvud
nästa
antihistamin
allergi
astma
acne


...så ska dessa väljas ut:


arm
allergi
astma


Uppgift 3:
Vilken eller vilka av dessa funktioner eller uttryck kan vara referenstransparenta? Motivera ditt svar!
A) En funktion som tar in en url och returnerar den webbsida som återfinns där.
B) En slumptalsfunktion som returnerar en Double mellan 0.0 och 1.0.
C) Ett aritmetiskt uttryck som endast innehåller (1) oföränderliga variabler, (2) de fyra räknesätten (addition, subtraktion, multiplikation och division)  och (3) anrop till rena funktioner.

Uppgift 4:
Skriv en anonym funktion med lambdanotation som tar in två heltal och ger ifrån sig summan av deras respektive kuber, dvs om indata är a och b så ska den ge ifrån sig a^3 + b^3. Kom ihåg typsignaturen.

Exempelkörningar där vi har bundit f till den anonyma funktionen:

ghci> f 1 2
9
ghci> f 3 4
91
ghci> f 0 0 
0
1684512000 05/19/2023 06:00pm
Inkludera en beskrivning
Ytterligare kommentarer:
Maxresultat för gradering till > poäng
Inkludera en bedömningstitel

Matris

Hitta matris
Inkludera en titel
Hitta en matris
Titel
Du har redan bedömt studenter med den här matrisen. Större ändringar kan påverka resultaten för deras uppgifter.
 
 
 
 
 
 
 
     
Det går inte att ändra en matris efter att du börjat använda den.  
Titel
Kriterier Bedömningar Poäng
Det här kriteriet är länkat till ett lärandemål Beskrivning av kriterium
tröskel: 5 poäng
Redigera beskrivning av kriterium Ta bort kriterium rad
5 till >0 poäng Full poäng blank
0 till >0 poäng Inga poäng blank_2
Det här området kommer användas av utvärderaren för kommentarer relaterade till det här kriteriet.
poäng
  / 5 poäng
--
Ytterligare kommentarer
Det här kriteriet är länkat till ett lärandemål Beskrivning av kriterium
tröskel: 5 poäng
Redigera beskrivning av kriterium Ta bort kriterium rad
5 till >0 poäng Full poäng blank
0 till >0 poäng Inga poäng blank_2
Det här området kommer användas av utvärderaren för kommentarer relaterade till det här kriteriet.
poäng
  / 5 poäng
--
Ytterligare kommentarer
Poängsumma: 5 av 5