Dugga 1 i TDP007 torsdag 10 mars 2016 kl 13.15-15.15 -------------------------------------------------------- Duggan startar kl. 13.15 och pågår till 15:15. Ni kommer att få köra på i vår begränsade datortentamiljö, som ni säkert redan känner till. Instruktioner för att logga in lämnas i salen. Alla filer som ni behöver för att lösa uppgifterna finns i hemkatalogen, under given_files, när ni har loggat in. Där finns också en PDF-version av en tidig utgåva av kursboken som ni gärna får använda er av. Öppna den med kommandot xpdf. Svar på frågor skrivs i vanliga textfiler och programkod skrivs i rb-filer. En fil per huvuduppgift ska produceras, totalt alltså fyra filer. Ingen särskild inlämning behöver göras. När man är färdig loggar man ut och lämnar salen. Duggan består av fyra uppgifter (några indelade i deluppgifter) som totalt kan ge 25 poäng. Dessa poäng summeras ihop med poängen från den första duggan. Uppgift 1: Teorifrågor (7p) --------------------------- a) Vad är en lexer och hur fungerar den i grova drag? (1p) b) Välj ett (någorlunda välkänt) datorspråk och argumentera för att det är ett domänspecifikt språk! (2p) c) Under en av föreläsningarna tittade vi på icke-deterministisk programmering. Då implementerade vi en problemlösare med hjälp av s.k. continuations. Vad är en continuation och vilken information finns gömd i den? Ge ett enkelt kodexempel som visar hur en continuation skapas och används! (2p) d) Beskriv åtminstone två olika faktorer som kan bidra till att ett datorspråk blir populärt och motivera varför. (2p) Uppgift 2: Icke-deterministisk programmering (6p) ------------------------------------------------- Detta problem ska lösas med hjälp av problemlösaren som finns i filen amb_test.rb som vi tittade på under näst sista föreläsningen. Det problem som ska lösas är som följer: Kalle, Anders och Eva-Lotta har tillsammans gått runt under Halloween och samlat på sig godis. När kvällen är slut har de samlat ihop 57 klubbor som de vill dela på. Anders var inte med från början av turen, så alla är överens om att han ska få färre klubbor än de andra. Eva-Lotta har bidragit mest till deras fina kostymer, så de är också överens om att hon ska ha fler än de andra. Alla måste få minst tio klubbor och dessutom vill de fördela klubborna så att alla får ett udda antal. Ställ upp detta problem med hjälp av problemlösaren i amb_test.rb och skriv ut alla möjliga sätt som de tre vännerna kan fördela klubborna mellan sig. Uppgift 3: DSL (6p) ------------------- Valerie's Pizza är en restaurang med ett toppmodernt datorsystem som håller reda på hur mycket alla anställda jobbar och vad de ska ha i lön. De har skapat ett litet domänspecifikt språk för detta ändamål och det återfinns i två olika filer. Filen valeries.rb innehåller information om alla anställda: namn, position och lönenivå. Varje person har en specifik lönenivå och därmed en specifik timlön. Filen february.rb innehåller en rapport på hur mycket folk har jobbat en specifik månad. Först i rapporten står hur många timmar varje person har jobbat. Detta ger en grundlön. För serveringspersonal tillkommer därefter dricks och bonus. I den andra delen av den här rapporten finns en lista över alla arbetsskift och vilka som har jobbat respektive skift. Tanken är att alla de som jobbat under ett visst skift delar lika på dricksen. Dessutom får de dela på 1% av alla intäkterna från det skiftet. Din uppgift är nu att med hjälp av de DSL-tekniker i Ruby som vi har studerat skriva kod som kan köra koden i de här två filerna för att räkna ut vad en viss person ska ha i lön. Vi vill ha något som funkar ungefär så här: >> StaffReader.calc("val", "valeries.rb", "february.rb") => 6080.0 >> StaffReader.calc("wsue", "valeries.rb", "february.rb") => 1652.2345 Chefen, med koden 'val', tjänar $40 i timmen och jobbade 152 timmar under februari, vilket innebär en lön på $6080. Servitrisen Sue, med koden 'wsue', tjänar bara $4 i timmen och jobbade 145 timmar, vilket ger en grundlön på $580. Till detta tillkommer dock dricks och bonus, vilket ingår i beräkningen ovan. Läs igenom de två filerna för att förstå hur de är uppbyggda. Vissa tips finns i kommentarerna. OBS! Det andra körexemplet ovan borde ha varit så här istället: >> StaffReader.calc("wsue", "valeries.rb", "february.rb") => 1971.8293800000004 Uppgift 4: Parsning (6p) ------------------------ En grupp av arkeologer har just upptäckt lämningar efter en utdöd civilisation som man kallar för Cromare. De verkade ha ett annorlunda talsystem, baserat på fyra symboler: Symbol Värde -------------- i 1 x 10 c 100 m 1000 På gamla lertavlor har man funnit matematiska uträkningar med detta konstiga talsystem. Uppenbarligen kunde man blanda dessa "siffror" hur man ville. Ordningen spelade ingen roll, så som det gör i vårt talsystem. Vi tycker ju att 123 inte är samma tal som 321, men för Cromarna var ixi, xii och iix samma tal (tolv enligt vårt sätt att räkna). Istället för att använda våra symboler för de fyra räknesätten har man använt symbolerna P (plus), M (minus), G (multiplikation) och D (division). Deras uträkning "micPcix" betyder alltså 1101 plus 111, vilket borde bli 1212 om man räknar som vi gör. De verkade också kunna kombinera dessa operatorer så att "xiGiiPi" skulle motsvara (11*2)+1 = 23. Din uppgift är att hjälpa arkeologerna genom att skriva en parser som kan tolka matematiska uttryck som är skrivna som Cromarna gjorde. Utgå från parsern som finns i rdparse.rb. Följande är ett exempel på hur det skulle kunna se ut: >> CromanParser.new.start [Croman Calculator] xPiPiPi => 13 [Croman Calculator] iiGxPiii => 23 [Croman Calculator] iiGcDxxxxx => 4