Functioneel programmeren

Vergelijkbare documenten
Functioneel programmeren

Practicumopdracht 1: Elektronische agenda s

BEGINNER JAVA Inhoudsopgave

extra oefening algoritmiek - antwoorden

DOMjudge teamhandleiding

College I/O

Practicumopgave 3: SAT-solver

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

PROS1E1 Gestructureerd programmeren in C Dd/Kf/Bd

Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?

Programmeermethoden NA. Week 5: Functies (vervolg)

RAAD HET GETAL. Hoofdstuk 4. Het spelletje 'Raad het getal' Voorbeeld van uitvoering van 'Raad het getal' Hoofdstuk 4 Raad het getal 21

oefening JavaScript - antwoorden

Programmeermethoden NA. Week 5: Functies (vervolg)

Verzamelingen, Lijsten, Functioneel Programmeren

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

Controle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2

Een inleiding in de Unified Modeling Language 67

Disclaimer Het bestand dat voor u ligt, is nog in ontwikkeling. Op verzoek is deze versie digitaal gedeeld. Wij willen de lezer er dan ook op wijzen

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Het warmteverlies van het lichaamsoppervlak aan de wordt gegeven door de volgende formule:

Modelleren en Programmeren

Inleiding programmeren

WORKSHOP ORANGE PI & PYTHON v september 2017

Haskell: programmeren in een luie, puur functionele taal

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Verzamelingen, Lijsten, Functioneel Programmeren

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

Verzamelingen, Lijsten, Functioneel Programmeren

Hoofdstuk 5: Functies voor getallen en teksten

Datum. Vraag het bedrag in BEF. Reken om naar EURO. Toon het bedrag in EURO. --- Vraag het bedrag in BEF Reken om naar EURO---

Een spoedcursus python

Het programma in dit hoofdstuk vertelt een paar moppen aan de gebruiker.

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding:

Algoritmisch Denken: Dodo s Bit Parity

Online c++ leren programmeren:

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur

Een typisch programma in C en C++ bestaat uit een aantal onderdelen:

II. ZELFGEDEFINIEERDE FUNCTIES

Cursus Algoritmiek najaar 2005

GEDETAILLEERDE INHOUD

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.


Babel fish. Opgave. Invoer. Uitvoer

Uitleg: In de bovenstaande oefening zie je in het eerste blokje een LEES en een SCHRIJF opdracht. Dit is nog lesstof uit het tweede trimester.

De Sense HAT heeft een temperatuursensor waarmee je de temperatuur. #lees de temperatuur van de sensor en sla op als temp

De Sense HAT heeft een temperatuursensor waarmee je de temperatuur. #lees de temperatuur van de sensor en sla op als temp

Labo 2 Programmeren II

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

Opgave 2. Binaire informatie

Variabelen en statements in ActionScript

Personal tag. Personal tag. Drukknop of bewegingsdetector. TABEL 2 Samenvatting van de Programmeerfuncties

Labo IDP. In dit labo gaan we IDP gebruiken voor het analyseren van logische circuits. XOR Q AND. Figuur 1: Een logisch circuit.

DOMjudge teamhandleiding

Practicum Ox intro. Practicum Ox intro. VU Numeriek Programmeren 2.5. Charles Bos. Vrije Universiteit Amsterdam. 3 april /18

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

Toetsvoorbereiding Informatica HAVO/VWO 5 (T51) Programmeren met Python II. Duur: 70 minuten Datum: sept 2018

De eerste ronde Nederlandse Informatica Olympiade

Informatica: C# WPO 2

Oefeningenexamen Informatica: juni 2015

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

JavaScript. 0 - Wat is JavaScript? JavaScript toevoegen

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Constanten. Variabelen. Expressies. Variabelen. Constanten. Voorbeeld : varid.py. een symbolische naam voor een object.

VOORBLAD SCHRIFTELIJKE TOETSEN

Programmeeropdracht 1 Mastermind Algoritmiek, voorjaar 2019

Mastermind met acht kleuren

Uitwerking tentamen Analyse van Algoritmen, 29 januari

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Wedstrijdverloop. warmup: 13u00-14u55

Opgave 1. (4 punten) Inleiding: Vraag: Hints: (maximaal 2 bonuspunten) Herkansingstentamen Algoritmiek voor Biologen

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Mechanical Doll. doll

De eerste ronde Nederlandse Informatica Olympiade

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Programmeren (1) Examen NAAM:

Modelleren en Programmeren

Informatica: C# WPO 11

Objectgeoriënteerd Programmeren: WPO 1

Netchange. Concurrency Opgave 2, December

inleiding theoretische informatica practicum 1 deadline woensdag 20 februari 2008 om uur

Modelleren en Programmeren

ChainWise Factuur Export Functionele documentatie Twinfield API Koppeling

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

4 Invoer en uitvoer. 4.1 Toegang tot de standaardbibliotheek

[13] Rondjes draaien (loops)

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Modelleren en Programmeren

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Bijlage Inlezen nieuwe tarieven per verzekeraar

Oefententamen 2. Tijd: 2 uur. Maximaal aantal punten: 30. Naam: Studentnummer:

Project 2: LOTTO simulatie Programmeren I

Programmeren PYTHON OEFENTENTAMEN 2. Schrijf jouw antwoorden op dit tentamen. Tijd: 2 uur. Maximaal aantal punten: 32. Naam: Studentnummer:

Vereiste kennis. 1 Java-editor. 2 Het compileren van een programma

Small Basic Programmeren Text Console 2

Vakgroep CW KAHO Sint-Lieven

INHOUDSOPGAVE. Over de auteur, de illustrator en de technische redacteuren 13

PRAKTICUMOPGAVE 1. De eerste prakticumopgave is het maken van een applet om een "Mandelbrotfiguur" te tekenen, zoals hieronder omschreven.

Transcriptie:

Functioneel programmeren Practicumopgave 2: Mastermind Het doel van deze opgave is het implementeren van het spel Mastermind; zie http://nl.wikipedia.org/wiki/mastermind voor een uitleg. Het spel is klein genoeg om in een enkele Haskell-module ingepast te worden. Het spel Mastermind is een spel voor twee spelers: een codemaker en een codebreker. De rol van codemaker wordt in ons geval vervuld door de computer. Aan het begin van het spel stelt de codemaker een code samen van vier getallen tussen 1 en 6 (inclusief). De codebreker (gespeeld door de gebruiker van ons programma) probeert in zo weinig mogelijk beurten de code te raden. Na elke poging worden er twee scores bepaald. De zwarte score geeft aan hoeveel posities in de geprobeerde code exact overeenkomen met de code van de codemaker; de witte score komt overeen met het aantal getallen in de geprobeerde code die weliswaar overeenkomen met een getal in de gezochte code, maar nog in de verkeerde positie staan. Zodra de zwarte score 4 bedraagt, is de code gebroken en het spel over. De volgende tabel toont een mogelijk spelverloop: code poging score 3466 1122 zwart 0, wit 0 3466 3344 zwart 1, wit 1 3466 3536 zwart 2, wit 0 3466 3466 zwart 4, wit 0. Een tweede voorbeeld is code poging score 5114 1234 zwart 1, wit 1 5114 1356 zwart 0, wit 2 5114 5215 zwart 2, wit 0 5114 5241 zwart 1, wit 2 5114 5411 zwart 2, wit 2 5114 5114 zwart 4, wit 0. Als het spel gespeeld wordt met het te schrijven Haskell-programma, zou een en ander er als volgt uitzien: 1

? 1 1 2 2 zwart 0, wit 0? 3 3 4 4 zwart 1, wit 1? 3 5 3 6 zwart 2, wit 0? 3 4 6 6 zwart 4, wit 0 gefeliciteerd! Het programma vraagt de speler met een naar het scherm geschreven vraagteken (?) om een poging te wagen. De speler typt dan een reeks van vier cijfers tussen 1 en 6, gescheiden door spaties. Het spel antwoordt met het weergeven van de score. Als de zwarte score 4 bedraagt, wordt de speler gefeliciteerd en is het spel afgelopen; als de zwarte score lager is wordt de speler om een volgende poging gevraagd enzovoort. We implementeren het spel door een aantal kleine hulpfuncties te schrijven en die vervolgens te verweven tot een heus interactief programma. We zullen codes representeren met lijsten van gehele getallen: type Code = [Int ]. Opgave 1 black :: Code Code Int die voor een gegeven code (het eerste argument) en een gegeven poging (het tweede argument) de zwarte score bepaalt. Bijvoorbeeld: black [3, 4, 6, 6] [3, 5, 3, 6] 2 black [5, 1, 1, 4] [1, 2, 3, 4] 1. Opgave 2 white :: Code Code Int die voor een gegeven code (het eerste argument) en een gegeven poging (het tweede argument) de witte score bepaalt. Bijvoorbeeld: white [3, 4, 6, 6] [3, 5, 3, 6] 0 white [5, 1, 1, 4] [1, 2, 3, 4] 1. Opgave 3 score :: Code Code (Int, Int, Bool) 2

die voor een gegeven code (het eerste argument) en een gegeven poging (het tweede argument) een drietupel oplevert waarvan de eerste component de zwarte score voor de poging bevat, de tweede component de witte score voor de poging en de derde component een Boolse waarde (True of False) die aangeeft of de poging exact overeenkomt met de gezochte code. Bijvoorbeeld: score [3, 4, 6, 6] [3, 5, 3, 6] (2, 0, False) score [5, 1, 1, 4] [1, 2, 3, 4] (1, 1, False) score [5, 1, 1, 4] [5, 1, 1, 4] (4, 0, True ). Opgave 4 report :: (Int, Int, Bool) String die op basis van een door de functie score (zie opgave 3) geproduceerd drietupel een tekst samenstelt die aan de speler gepresenteerd kan worden als feedback op een poging. Bijvoorbeeld: report (score [3, 4, 6, 6] [3, 5, 3, 6]) "zwart 2, wit 0" report (score [5, 1, 1, 4] [1, 2, 3, 4]) "zwart 1, wit 1" report (score [5, 1, 1, 4] [5, 1, 1, 4]) "zwart 4, wit 0\ngefeliciteerd!". Opgave 5 readint :: String Maybe Int die voor een gegeven tekenreeks het door die tekenreeks weergegeven natuurlijke getal oplevert in de Maybe-monad. Als de tekenreeks geen natuurlijk getal weergeeft, dan levert de functie Nothing op. (Een natuurlijk getal is een geheel getal groter dan of gelijk aan 0.) Bijvoorbeeld: readint "3" Just 3 readint "42" Just 42 readint "hallo" Nothing readint "-3" Nothing. Opgave 6 Definineer een actie getcode :: IO Code die de invoer van een speler inleest en de bijbehorende code oplevert. Bijvoorbeeld: 3 5 3 6 [3,5,3,6] 3

Representeer niet-numerieke invoer met de constante 1. Bijvoorbeeld: 3 5 hallo 6 [3,5,-1,6] De actie moet probleemloos overweg kunnen met invoer die niet uit precies vier getallen bestaat en met getallen die kleiner zijn dan 0 of groter dan 6. Bijvoorbeeld: 3 5 7 6 [3,5,7,6] 3 5 3 [3,5,3] 3 5 3 6 6 [3,5,3,6,6] Opgave 7 valid :: Code Bool die bepaalt of een gegeven code geldig is, dat wil zeggen uit precies vier getallen tussen 1 en 6 bestaat. Bijvoorbeeld: valid [3, 5, 3, 6] True valid [3, 5, 1, 6] False valid [3, 5, 7, 6] False valid [3, 5, 3] False valid [3, 5, 3, 6, 6] False. Opgave 8 Definieer een actie input :: IO Code die een vraagteken (?) naar het scherm schrijft en vervolgens invoer van de speler inleest en controleert of deze overeenkomt met een geldige code. Als de invoer inderdaad overeenkomt met een geldige code, dan wordt deze code opgeleverd. Komt de invoer niet overeen met een geldige code dan wordt een foutmelding naar het scherm geschreven en wordt de speler nogmaals om invoer gevraagd enzovoort. Bijvoorbeeld: *Main> do { code <- input ; print code }? 3 5 hello 6 ongeldige invoer? 3 5 3 ongeldige invoer? 3 5 3 6 [3,5,3,6] 4

Opgave 9 loop :: Code IO () die voor een gegeven code een actie produceert die de speler herhaaldelijk om invoer vraagt en telkens feedback geeft, totdat de speler de code gebroken heeft. Bijvoorbeeld: *Main> loop [3, 4, 6, 6]? 1 1 2 2 zwart 0, wit 0? 3 3 4 4 zwart 1, wit 1? 3 5 hallo 6 ongeldige invoer? 3 5 3 6 zwart 2, wit 0? 3 4 6 6 zwart 4, wit 0 gefeliciteerd! Opgave 10 Importeer de module Random door boven in je programma, direct onder de module-header, de declaratie import Random op te nemen. De module Random bevat, onder andere, de actie newstdgen :: IO StdGen die een zogenaamde random-number generator oplevert en een functie randomrs :: (Int, Int) StdGen [Int ] die gegeven een onder- en bovengrens en een random-number generator een oneindige lijst van willekeurig gekozen getallen binnen de onder- en bovengrens oplevert. Schrijf nu (gebruikmakend van newstdgen en randomrs) een actie generatecode :: IO Code die een willekeurig gekozen code oplevert. Het hoofdprogramma Importeer de module System.IO door de declaratie import System.IO. in je programma op te nemen. Als alle hierboven beschreven functies en acties correct geïmplementeerd zijn, dan laat het hoofdprogramma zich schrijven als 5

main :: IO () main = do hsetbuffering stdout NoBuffering code generatecode loop code. Je kunt het programma testen vanuit de GHCi door de actie main aan te roepen: *Main> main Inleveren Rangschik alle geschreven functies en acties (dus zowel de gevraagde functies en acties als eventuale hulpfuncties en -acties én het hoofdprogramma main) in een module Main en plaats deze module in een bestand Mastermind.hs. Begin het bestand met commentaarregels waarin je naam, login en studentnummer vermeld worden. Als je de opdracht met zijn tweeën gemaakt hebt, vermeld dan de gegevens van beide teamleden. Lever dit bestand, met behulp van Submit, vóór dinsdag 25 maart 2008, 9:00 uur in via http://www.cs.uu.nl/docs/submit/. Zorg ervoor dat je code correct functioneert met de GHC (versie 6.4 of hoger). Als je module niet door de vertaler geaccepteerd wordt, komt je uitwerking niet in aanmerking voor een cijfer. Het overnemen van uitwerkingen, bijvoorbeeld van medestudenten of van het internet, is niet toegestaan. Een uitvoerbaar programma Als je je code wilt omzetten naar een uitvoerbaar programma (een zogenaamde executable), dan kan dat door je module vanaf de prompt van het besturingssysteem te compileren met ghc --make Mastermind Deze aanroep resulteert onder Windows in een uitvoerbaar bestand met de naam Mastermind.exe en onder Mac OS X en Linux in een uitvoerbaar bestand met de naam mastermind. 6