Uppgift 1 --------- Hämta ut vartannat element ur en array på ett så kort sätt som möjligt. Följande körexempel illustrerar upplägget: >> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >> b = [] => [] >> ??? ??? >> b [1, 3, 5, 7, 9] Vi utgår från en godtycklig array a som i exemplet ovan innehåller talen 1 till 10. Vi har också en tom array b. På den tredje raden ska du fylla i Ruby-kod som gör så att arrayen b efteråt kommer att innehålla vartannat element från arrayen a (elementen med jämna index). Lösningen ska bestå av en rad, dvs ett enda Ruby-uttryck som gärna får vara sammansatt, men det får inte vara flera på varandra följande uttryck kombinerade med semikolon (;). Returvärdet från Ruby-uttrycket är inte intressant utan endast sidoeffekten på b. För full poäng ska du ange två sätt att göra detta som använder helt olika funktioner. Uppgift 2 --------- I den bifogade filen myclass.rb finns en klass MyClass. Här är ett exempel på hur den kan användas: >> foo = MyClass.new { rand(10) } => #, @a=0.0> >> 25.times { foo.call } => 25 >> foo.a => 3.72 Förklara vad klassen MyClass gör (dvs vad poängen är med en sådan klass) samt föreslå bättre namn på klassen och dess instansvariabler. Utforma därefter en uppsättning lämpliga enhetstester för klassen MyClass. Uppgift 3 --------- Vi vill ha en ny typ av arrayer som alltid har 1 som första index istället för 0, så länge man använder [] för elementåtkomst. I övrigt ska denna nya arraytyp funka precis som vanliga arrayer. Man vill alltså kunna göra ungefär så här: >> b = BaseOneArray.new ["one", "two", "three", "four"] => ["one", "two", "three", "four"] >> b[1] => "one" >> b[1..2] => ["one", "two"] Redovisa programkod som löser problemet på lämpligt sätt. Uppgift 4 --------- Ett webbföretag vill försöka validera indataformulär där folk ska skriva in sin gatuadress. De har en array med några typiska fall: adresser = [ "Storgatan 14", "Rydsvägen 246 A:45", "Hertig Karls torg 3B", "Nygatan 13B", "Götgatan 5, 2tr", "Luddgatan 2, lgh 459", "Hornstäve Skattegård" ] Din uppgift är att konstruera ett reguljärt uttryck som kan matcha dessa adresser, samtidigt som det självklart inte ska matcha andra textsträngar som inte ser ut som adresser. Placera det reguljära uttrycket i en lämplig matchningsfunktion så att du kan testa det. Konstruera också ett enhetstest som, med hjälp av dessa exempel, testar att din kod funkar. Uppgift 5 --------- Du ska skriva ett program som beräknar värdet av ett matematiskt uttryck som är lagrat i XML-format. Du bör använda någon form av XML-parser, t.ex. det inbyggda REXML-paketet, för att uppgiften ska vara rimlig att lösa inom duggans begränsade tid. De matematiska uttrycken kan vara godtyckligt stora och innehåller de fyra räknesätten samt vanliga heltal. Det enklast möjliga uttrycket är enbart ett tal och det ser i vårt XML-format ut så här: I den bifogade filen expression.dtd finns definitionen av formatet för de matematiska uttrycken. Ovanstående exempel finns i filen expr1.xml. Ett större exempel finns i filen expr2.xml. I slutändan vill vi alltså ha en funktion (uppdelad i flera under- funktioner om det känns motiverat) som funkar så här: >> calculate("expr1.xml") => 8 >> calculate("expr2.xml") => 25