Korsordlösare Sara Hedbrandh Strömberg Programkonstruktion VT 10 Inlämninsguppgift

Relevanta dokument
Kryptokorsordslösare Programmeringsmetodik DV (period 2) Inlämningsuppgift 1

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Programkonstruktion. Tentamen,

Programkonstruktion. Tentamen,

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Programkonstruktion. Tentamen,

kl Tentaupplägg

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Uppgift 1 (grundläggande konstruktioner)

SI-möte #10, Programkonstruktion och Datastrukturer

Programkonstruktion och Datastrukturer

Gör så här för att rapportera:

Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen,

Fältnamn /Rubrik Fältnamn /Rubrik Fältnamn /Rubrik Fältnamn /Rubrik Data Data Data Data Data Data Data Data

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Tentamen TEN1 HI

Men först: Några funktioner ur preluden. Introduktion till programmering. Uppgiften. Variationer av uppgiften. Föreläsning 4

kl Tentaupplägg

Tentamen TEN1 HI

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Övningsuppgifter kapitel 8

Föreläsning 13. Rekursion

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Tentamen, Algoritmer och datastrukturer

Övningsuppgifter. TDIU04 Programmering i C++, standardbibliotek. Innehåll. Vt Lektion Lektion Lektion Lektion 4...

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Funktionell programmering DD1361

Datalogi, grundkurs 1

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Programmering II (ID1019) :00-11:00

Uppgift 1 ( Betyg 3 uppgift )

TDDC74 Programmering, abstraktion och modellering. Tentamen

Objektorienterad Programkonstruktion

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

I ett program hantera man ofta samlingar av objekt av samma typ.

HI1024 Programmering, grundkurs TEN

TDIU01 - Programmering i C++, grundkurs

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Polymorfi. Objektorienterad och komponentbaserad programmering

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Objektorientering: Lagring och livstid

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Föreläsning 1 Datastrukturer (DAT037)

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Objektorientering: Lagring, räckvidd och livstid

TDDI16: Datastrukturer och algoritmer

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Projektdokumentation för Othello

Problemlösning och funktioner Grundkurs i programmering med Python

TDDD78 Objektorientering: Lagring och livstid

Kungl. Tekniska högskolan NADA Grundformer med Stava

TDDC74 Programmering, abstraktion och modellering. Tentamen

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Grundläggande programmering med C# 7,5 högskolepoäng

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Sätt att skriva ut binärträd

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Objektorienterad programmering Föreläsning 10. Copyright Mahmud Al Hakim Sorteringsalgoritmer

AssiML. Användarbeskrivning

Föreläsning 3-4 Innehåll

Programmering II (ID1019) :00-11:00

Rekursiva algoritmer sortering sökning mönstermatchning

Övning 1 - Abstrakta datatyper

Pär Sundbäck OrdKnuten. Programversion VAD ÄR ORDKNUTEN?... 2

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

I en matchning ligger varje hörn i högst en kant. I en stig ligger varje hörn i högst två kanter.

729G04 Programmering och diskret matematik

Algoritmer, datastrukturer och komplexitet

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Introduktion till programmering SMD180. Föreläsning 9: Tupler

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tentamen EDAF30 Programmering i C++

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

kl Tentaupplägg

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Transkript:

Sara Hedbrandh Strömberg Programkonstruktion VT 10 Inlämninsguppgift 1.Inledning 1.2 Sammanfattning 1.3 Programmet Användarbeskrivning 2.1 Lösa korsordet 2.2 Körexempel Programdokumentation 3.1 Abstrakta datatypen 3.2 Algoritmer 3.3 Delfunktioner 3.4 Inläsning av korsordet 3.4.1 Algoritm 3.4.2 Funktionsspecifikation 3.4.3 Programflödet 3.5 Inläsning av ordlista 3.5.1 Algoritm 3.5.2 Funktionsspecifikation 3.5.3 Programflödet 3.6 Lösning av kryptokorsord 3.6.1 Algoritm 3.6.2 Funktionsspecifikation 3.6.3 Programflödet 3.7 Presentation av lösningarna 3.7.1 Algoritm 3.7.2 Funktionsspecifikation 3.7.3 Programflödet 4. Brister

1. Inledning 1.2 Programmet Programmets uppgift är att med hjälp av en ordlista och ett kryptokorsord få ut alla möjliga kombinationer av tal-bokstavspar så att alla kryptoord i kryptokorsordet bildar befintliga ord i ordlistan. Alla möjliga matchningar binds i den abstrakta datatypen match som tal-bokstavspar. 2. Användarbeskrivning 2.1 Lösa korsordet För att kryptokorsordslösaren ska fungera korrekt måste kryptokorsordet upfylla typen int list list och ordlistan typen string list list. En dellista i ordlistan består av ord med samma storlek och tillsammans med fler dellistor med ord av samma storlek i respektive lista bildar en ordlista. Kryptolistan består av en lista med ord som i sig representeras av tal i olika kombinationer. Ett tal kan bara bindas till en bokstav och omvänt. 2.1.1 I Moscow ML: Genom solve(kryptolista,ordlistor); körs programmet och kryptokorsodet löses. Det som returneras är den abstrakta datatypen match som ligger i listan. För att få fram alla matchningar skrivs frommatch(hd(it)); in i terminalen och första matchningen skrivs ut i läslig form. 2.1.2 På hemsidan Krypto-korsordslösaren Skriv talen från korsordet du vill lösa i rätt rutor i tabellen. De svarta rutorna lämnas tomma i tabellen, klicka därefter på Lös och de tio första matchningarna visas på en ny sida. För att lösa ännu ett nytt korsord klickar du på Lös ett nytt korsord. För att rensa det påbörjade korsordet och börja om klicka på Rensa. 2.2 Körexempel Ett körexempel i Moscow ML är : solve([[1,2],[2,1,3]],[["i"],["is","ni"],["nix","sil","sav"],["tomt"]]); Vilket ger : [<match>] Eftersom innehållet inte kan visas i match måste match skrivas om i läslig form. Det görs genom att anropa: frommatch(hd(it));

Matchningen skrivs ut: [(3, #"L"), (1, #"I"), (2, #"S")] 3. Programdokumentation 3.1 Abstrakta datatypen Matchningarna har jag representerat med en abstype match = M of (int*char) list. Funktionerna i gränssnittet som används är: - taurb: (int* match -> string) taurb returnerar bokstaven, som är bunden till det inmatade talet, skrivet som en sträng. - taurt: (char * match -> string) taurt returnerar talet, som är bundet till den inmatade bokstaven, skrivet som en sträng. - finns: ((int*char) * match -> bool) finns undersöker om tal-bokstavsparet finns i match - ettkrypto: (int list * string * match -> match) alla tal i kryptot binds till bokstäverna med hänsyn till match - frommatch: (match -> (int * char) list ) frommatch skriver ut en matchning i läslig form - tom: (match -> bool) tom undersöker om match är tom. Sant om listan är tom. 3.2 Algoritmer 3.2.1 Funktioner hittaolist: (int list * string list list -> string list) Den anropar sig själv rekursivt för att hitta ordlista som har element med samma längd som kryptoordet. Returnerar en ordlista. helaolist: (int list * string list list * match -> match list) helaolist returnerar alla möjliga matchningar av hela ordlistan på ett kryptoord med hänsyn till match match2: (int list * string list list * match list -> match list) alla möjliga utvecklingar på matchningarna med hänsyn till kryptoordet match1: (int list list * string list list * match list -> match list) alla möjliga matchningar med hänsyn till mat

3.3 Delfunktioner 3.4 Inläsning av korsordet 3.4.1 Algoritm 1. Alla fält läggs i en lista (l) där en rad i tabellen blir en dellista, och en kolumn också blir en dellista. 2. Fösta dellistan i listan (l) tas ur. Nya listor bildas där talet 0 bildar en tom lista och bryter av till nya listor. Om listan är tom så tom lista. 3. De tomma listorna och listor som har längden mindre än 2 tas bort. Detta sätts ihop med 3) med resten av listan (l). 3.4.2 Funktionsspecifikation (* tolist2(l) TYPE : int list list-> int list list POST : alla element i listan l omgjorda till dellistor där 0:orna bryter av till en dellista. EXAMPLES: tolist2([[1,2,3,4,2,4],[1,2,0,7,4]]) -> [[1,2,3,4,2,4],[1,2],[7,4]] (* variant: lenth l 3.4.3 Programflödet (1) a är bundet till all rutorna från hemsidan som ligger i en lista. En rad ger en dellista och en kolumn ger också en dellista i listan. (2) words binds till funktionsanropet tolist2(a). (3) Denne anropar tokrypto3 på första elementet i listan, där dellistan görs om till kryptoord med hänsyn på talet 0, som sätts ihop med anropet av tolist2 med resten av listan. 3.5 Inläsning av ordlista 3.5.1 Algoritm 1. Strömmen öppnas. 2. Alla rader läggs som element i en lista. 3. Listan sorteras med hänsyn till elementens storlek. 4. Fösta elementet läggs i en dellista. 5) med resten av listan 5. Är listan tom så tom lista och avsluta funktionen. Är första elementet lika långt som dellistan som precis bildats läggs elementet i samma lista annars läggs den i en ny dellista. 5) med resten av listan. 3.5.2 Funktionsspecifikation (* wordlist(l) TYPE : string list -> string list list PRE : (l är en sorterad lista i stigande ordning) POST : alla i element i listan l som är lika långa läggs i en och samma lista EXAMPLES: wordlist(["hej","haj","hopp","hejsan"]) -> [["hej","haj"],["hopp"],["hejsan"]] (* Variant:!y

3.5.3 Programflödet sorteradordlista: (1) fgrep( long.txt ) hämtar alla ord och lägger dem i en lista. (2) Med mergesort av det listan sorteras alla orden med kortaste först. (3) alla element som är mindre än 2 tas bort. (4) words: wordlist(sorteradordlista) som lägger alla ord i dellistor. Ord som är lika långa ligger i samma dellista. 3.6 Lösning av kryptokorsord 3.6.1 Algoritm 1. Ta ur ett kryptoord i taget. 2. Ta rätt dellista ur ordlistan där orden har samma längd som det tagna kryptoordet. Hitta alla matchningar som finns av talen och bokstäverna för alla ord och kryptoordet. 3. Upprepa steg 2 på nästa kryptoord i listan, dessutom med hänsyn till dem nya matchningarna. Uppstår det en tom matchning tas den bort. 4. Upprepa steg 2 och 3 med nästa kryptoord och alla nya matchningar. 5. Returnera alla fungerande matchningar och skriv ut i läslig form. 3.6.2 Funktionsspecifikationer De viktigaste specifikationerna till funktionerna: (* hittaolist ( a,b) TYPE : int list * string list list -> string list PRE : ordlistan i b måste innehålla element som alla har samma längd POST : ordlistan i b som innehåller element med samma längd som kryptot a. EXAMPLES : hittaolist([1,2],[["h"],["ho","hi"]]) -> ["ho","hi"] (* variant: length b (* helaolist(krypto,ordlista,match) TYPE : int list * string list list * match -> match list POST : alla möjliga matchningar av hela ordlistan på kryptoordet med hänsyn till match EXAMPLES: helaolist([1,2,3,1,1],[["aj"],["?nska","sluss","kloss"]],empty) = [[(3, #"U"), (2, #"L"), (1, #"S")]] helaolist([1,2,3,1,1],[["aj"],["?nska","sluss","kloss"]],m[(1,#"b")]) = [] helaolist([1,2,3],[["aj"],["hej","haj","apa"]],[]) = [M[(3, #"J"), (2, #"E"), (1, #"H")], M[(3, #"J"), (2, #"A"), (1, #"H")]] (* solve(crypto,words) TYPE : int list list * string list list -> match list PRE : words uppfyller kraven på en ordlista POST : En lista med alla lösningar till kryptokorsordet crypto med ord tagna från ordlistan words EXAMPLE : solve([[1,2],[2,1,3]],[["i"],["is","ni"],["nix","sil","sav"],["tomt"]]) = [matchningen 1-I 2-S 3-L]

3.6.3 Programflödet (1) solve anropar match1 med en tom matchning som i sin tur anropar (2) match2 på alla kryptoord, (3) hittaolist (av respektive kryptoord och hela ordlistan) och nya matchningar som bildas. (3) match2 tar bort alla tomma matchningar på anropet av (4) helaolist, som anropas med ett kryptoord, hela ordlistan på alla matchningarna. (5) helaolist tar bort alla tomma matchningar av anropet av ettkrypto med kryptoordet på alla ord i ordlistan och en matchning. (6) ettkrypto undersöker om alla tal i kryptoordet finns i matchningen med hjälp av funktionen (7) taurb och alla bokstäver i ordet med hjälp av funktionen (8) taurt. Den undersöker också om bindningen redan finns mellan alla tal och bokstäver som finns i matchingen med hjälp av (9) finns. 3.7 Presentation av lösningarna 3.7.1 Algoritm 1. Första elementet ur det första elementet i matchlistan skrivs ut med ett likhetstecken mellan. Därefter skrivs nästa element ut på nästa rad. 2. När matchlistan är tom returneras en rad med bindestreck under. 3.7.2 Funktionsspecifikation (* frommatch(l) TYPE : match -> (int * char) list POST : en lista med matchningarna i läslig form EXAMPLES: frommatch(empty) = [] För hemsidan används funktionen write som skriver ut matchningar som en sträng. (* write'(l) TYPE : (int * char) list POST : l som en sträng EXAMPLES: write'([(1,#"h"),(2,#"a")]) -> "1 = h, 2 = a, <br>----------<br>" (*variant: length l 3.7.3 Programflödet På hemsidan: (1) write anropar ((2) frommatch på dem 10 första matchningarna från anropet av solve) och dem matchningarna skrivs ut som en sträng. I terminalen: (1) frommatch(hd(it)) tar första matchningen och skriver ut den i läslig form.

4. Brister Med lösningar med flera ord tar det för lång tid. Där skulle jag vilja förbättra koden så det går snabbare att lösa. Just nu har jag löst det genom att förkorta ordlistan. Detta är inte optimalt utan jag skulle vilja använda hela ordlistan för att lösa korsordet men eftersom tio lösningar max ska visas, ansåg jag detta var ett alternativ.