Göm menyn

Seminarium 7 - Experimentering

Kapitel som ska ha lästs

Uppgift: Longest Sequence

Skriv i pseudokod en funktion longest_sequence(seq, elem) som beräknar den längsta följden av det givna elementet i en lista. Skriv en rekursiv version och en iterativ version.

Körexempel:

Pseudokod man skrivas på nästan vilket sätt som helst så långe andra förstår koden Det går bra att använda satser, tex: if x is equal to y, for each x in y (kom ihåg end if, end for etc) Man kan också skriva i ren text: remove lowest element from x, Eller använda matimatiska termer: 2 * 5 mod 3 Tänk på att inte använda saker som är specifika till python (som att intentering påverkar koden)

Uppgift: Pseudokod

Översätt följande pseudokod till python-kod

Uppgift: Listmultiplikation

Multiplikation av listor fungerar precis som multiplikation av strängar, men det faktum att listor är muterbara ställer till problem då multiplikation används.

Till skillnad från en lista uppbyggd med hjälp av listbyggare så kommer en multiplicerad lista innehålla flera referenser till samma element.

Givet är fem funktioner som alla skapar en 2d-lista. 1. Vad är skillnaden i hur listorna är lagrade? Rita gärna en bild. 2. Vilken av funktionerna anser du är snyggast? Vilken är tydligast?

Listmultiplikation fortsättning

List-multiplikation är något vi inte uppmuntrar er till att använda då det kan leda till problematiskt beteende. Varför då?

Visa ett exempel på en operation på en lista skapad av create_grid3 som ger oönskat beteende.

Sammanfatta när list-multiplikation är säkert att använda och när det inte är det. Finns det någon av funktionerna ovan som inte bör användas?

Uppgift: Cellulär Automata

Denna kod är en 1-dimensionell cellulär automata som i nuläget ej fungerar. next_state är en funktion som tar in listan som representerar automatan, och returnerar hur den ska se ut efter nästa uppdatering baserat på en predikatsfunktion. I sitt nuvarande tillstånd uppdateras inte automatan då next_state returnerar samma lista som den får in.

Start-tillståndet är en lista där alla celler utom den mittersta är 0a.

Er uppgift är att utöka next_state så att den, med hjälp av predikatsfunktionen, returnerar nästa generation av automatan. Hur funktionen hanterar hörnfall är upp till er, ni bör dock kunna förklara hur kanter hanteras, varför ni valt att hantera dem så, samt vilka problem eran lösning kan orsaka.

Predikatsfunktionen tar tre argument a, b och c, där a och c är grannar till b. Med hjälp av dessa ska predikatsfunktionen avgöra om b ska leva nästa generation eller inte. Om b ska leva ska predikatsfunktionen returnera True, annars False.

Ett exempel på en predikatsfunktion är pred1, som säger att b ska leva nästa tillstånd om och endast om a lever nu.

För mer information om endimensionella automator, se studiematerialet för cellulär automata.

Cellulär automata forts.

Skriv en predikatsfunktion som uppfyller följande:

a b c b i nästa generation
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 0

där 0 är död och 1 är levande.

Det snyggaste sättet att göra detta på är att beskriva det med ett booleskt uttryck.

När funktionen är klar, testa att skicka in den till next_state och se vilket mönster som bildas.

Bonusfråga: Vad är det matematiska namnet på mönstret som bildas?

Extrauppgift: Cellulär automata

I en 1-dimensionell cellulär automata finns det totalt 256 olika regler (försäkra er om att så är fallet). Reglerna är namngivna så att de i binär kod ger en etta om resultatet lever och annars en nolla. Det översta fallet i tabellen ovan representeras av den minst signifikanta biten, medan det sista fallet representeras av den mest signifikanta biten.

Vilken regel uppfyllde predikatfunktionen given i exempelkoden?

Ni ska nu skriva en funktion, predicate_factory, som tar in en parameter n och returnerar en predikatfunktion som implementerar regel nr. n.

Tips: För att få ut den n-te biten (0-indexerat) ur ett tal x, beräkna x mod 2**(n+1) // 2**n eller använd funktionen bin() för att få en strängrepresentation.

För att kontrollera att den fungerar kan ni testa att generera en funktion baserat på regel 126 och 129. Detta är den regel som vi gick igenom i uppgift 2 samt negationen av den.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2016-08-19