/home/mikael/activity-phd/teaching/10DD1344/Exersice5/strykord.py November 25, 2010 1 1 STRYKORD 0 # coding : iso -8859 -10 Ordet orkan är ett strykord eftersom man kan stryka sista bokstaven om och om igen och bara få riktiga ord. orkan - orka - ork - or - o Uppgiften är att finna det längsta strykordet i svenska språket. Ordlistan finns på fil. Rita problemträdet och jämför olika tänkbara algoritmer. Rekursiv tanke: 1. 2. 3. 4. 5. Uppdatera rekord om ord längre än rekord hitta söner till ord+a hitta söner till ord+b ,..., hitta söner till ord+ö Basfall: Om ordet inte finns return Add current directory to python path 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import sys , os s y s . path . append ( os . getcwd () def ) byggut ( ord ) : global record if l e n ( ord ) > l e n ( r e c o r d ) : r e c o r d =ord for tkn i n a l f a b e t : if s v e n s k a . e x i s t s ( ord + tkn ) : byggut ( ord + tkn ) b i n t r e e import B i n t r e e a l f a b e t =" a b c d e f g h i j k l m n o p q r s t u v w x y z å ä ö " r e c o r d =" " from print ’ Ord : ’ , Ord : s v e n s k a = B i n t r e e () s v e n s k f i l = open ( " words . t x t " ) for r a d i n s v e n s k f i l . r e a d l i n e s () : print r a d . s t r i p () , s v e n s k a . put ( r a d . s t r i p () ) # Strippa o hur s k a e t t 53 54 55 56 57 byggut ( " " ) 56 print 57 print or returtecknet utan o r k o r k a ä t a o s t i en o r k a n u n d r a r j a g print " Lägsta strykord : ", r e c o r d Lägsta s t r y k o r d : orkan /home/mikael/activity-phd/teaching/10DD1344/Exersice5/sjuor.py November 25, 2010 1 2 SJUOR TILL HUNDRA 0 # coding : iso -8859 -1 Det gäller att skriva talet 100 med enbart sjuor och dom fyra räknesätten, till exempel så här: 7 +7 /7 *7 *7 = 98 Det var ett gott försök som inte nådde ända fram. För att man ska få använda / måste divisionen gå jämnt ut. Rita problemträdet och diskutera bästa algoritm för att avgöra OM problemet är lösbart. Om man dessutom vill veta hur lösningen ser ut krävs en mer komplicerad datastruktur. Beskriv den och skissa ett program. Add current directory to python path 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import sys , os s y s . path . append ( os . getcwd () ) queue i m p o r t Queue b i n t r e e import B i n t r e e from from q=Queue () dumsons= B i n t r e e () def makesons ( t a l ) : if t a l ==100 : print " Hundra ! " True dumsons . e x i s t s ( t a l ) : dumsons . put ( t a l ) return if not q . put ( t a l +7) q . put ( t a l -7) q . put ( t a l *7) i f ( t a l %7==0) : q . put ( t a l /7) return False q . put (0) b o o l= F a l s e n o t q . i s e m p t y () : b o o l=makesons ( q . g e t () ) if b o o l : break while Hundra ! /home/mikael/activity-phd/teaching/10DD1344/Exersice5/sjuor2.py November 25, 2010 1 2 SJUOR TILL HUNDRA version 2 0 # coding : iso -8859 -1 Det gäller att skriva talet 100 med enbart sjuor och dom fyra räknesätten, till exempel så här. 7 +7 /7 *7 *7 =98 Det var ett gott försök som inte nådde ända fram. För att man ska få använda / måste divisionen gå jämnt ut. Rita problemträdet och diskutera bästa algoritm för att avgöra OM problemet är lösbart. Om man dessutom vill veta hur lösningen ser ut krävs en mer komplicerad datastruktur. Beskriv den och skissa ett program. Add current directory to python path 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 sys , os s y s . path . append ( os . getcwd () f r o m queue i m p o r t Queue from b i n t r e e import B i n t r e e import ) q=Queue () dumsons= B i n t r e e () Node : t a l =0 f a r =None op= ’ ’ class def makesons ( f a r ) : t a l=f a r . t a l if t a l ==100 : writechain( far ) r e t u r n True if n o t dumsons . e x i s t s ( t a l ) : dumsons . put ( t a l ) i n s e r t ( t a l +7 , ’+7 ’ , f a r ) i n s e r t ( t a l -7 , ’ −7 ’ , f a r ) i n s e r t ( t a l *7 , ’ * 7 ’ , f a r ) i f ( t a l %7==0) : i n s e r t ( t a l /7 , ’ /7 ’ , f a r ) return False def def i n s e r t ( t a l , op , f a r ) : nod=Node () nod . t a l = t a l nod . op = op nod . f a r = f a r q . put ( nod ) w r i t e c h a i n (p) : i f p i s None : return w r i t e c h a i n (p. f a r ) print ’(%s ) ’ %( p . op ) , p . t a l , q . put ( Node () ) b o o l= F a l s e w h i l e n o t q . i s e m p t y () : b o o l=makesons ( q . g e t () ) if bool : break () 0 (+7) 7 (+7) 14 (*7) 98 (*7) 686 (+7) 693 (+7) 700 (/7) 100 /home/mikael/activity-phd/teaching/10DD1344/Exersice5/labyrint.py November 25, 2010 1 3 LABYRINT 0 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # coding : latin En svartvit grafikskärm kan beskrivas som en boolesk 1000x1000-matris, där true betyder en svart bildpunkt. På skärmen finns en labyrint. Ge en algoritm som finner en väg från övre vänstra till nedre högra hörnet och som bara går till vågrrätt och lodrätt liggande vita grannpunkter. Add current directory to python path import sys , os s y s . p a t h . append ( o s . g e t c w d () ) from from q u e u e i m p o r t Queue s y s import e x i t q=Queue () M=10 N=10 makesons ( k o o r d i n a t p a r ) : xx , yy = k o o r d i n a t p a r d i s t = m a t r i s [ xx ] [ yy ] if xx==M-1 and yy==N-1 : f o r ny_rad i n matris : f o r p o s i n ny_rad : print s t r ( pos ) + def ’ ’ *(2 - l e n ( s t r ( p o s ) ) ) , print print print return for " Ute ! " True dx , dy i n [ (0 ,1) ,(0 , -1) , (1 ,0) ,( -1 ,0) ] : x=xx + dx ; y=yy + dy i f 0 <=x <M and 0 <=y <N and 0 == m a t r i s [ x ] [ y ] : 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 m a t r i s [ x ] [ y ]= 1 + d i s t q . p u t (( x , y ) ) return False k a r t a =open ( " k a r t a " ) . r e a d l i n e s () m a t r i s =[ ] for rad in karta : ny_rad=[ ] for i in range ( len ( rad ) ) : if r a d [ i ]== ’ ’ : ny_rad . append (0) elif r a d [ i ]== ’ x ’ : ny_rad . append ( ’ x ’ ) m a t r i s . append ( ny_rad ) and matris [ x ] [ y ] is not ’x ’ /home/mikael/activity-phd/teaching/10DD1344/Exersice5/labyrint.py 64 ’ Startmatris ’ print Startmatris 68 69 70 71 for ny_rad in for matris : p o s i n ny_rad : print s t r ( pos ) + print x 0 0 x x x x x x x x x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x 69 print 70 print x 0 x x x 0 x x x x x 0 0 0 0 0 0 0 0 0 x x x x x x x x x x 0 x 0 x x x x x x x 0 0 0 0 0 0 x x x x 0 x x 0 0 0 0 0 0 x x x x x 0 x x x 0 ’ Slutmatris ’ Slutmatris 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 m a t r i s [ 0 ] [ 0 ]=1 ok=r a n g e (M) for i i n r a n g e (M) : ok [ i ]=[ ] for j i n r a n g e (N) : if k a r t a [ i ] [ j ]==" " : ok [ i ] . append ( True ) else : ok [ i ] . append ( F a l s e ) q . p u t ((0 ,0) ) b o o l= F a l s e w h i l e n o t q . i s e m p t y () : b o o l =m a k e s o n s ( q . g e t () ) if bool : break 1 2 x x x x x x x x x 3 x 11 12 13 x 19 0 x Ute ! x 4 x x x 6 7 8 x x 7 x x 8 x 9 x x x x 10 10 9 x 12 11 11 x x x x 12 12 13 14 15 x 13 x x 15 16 x 14 18 17 16 x x x 19 x x x x x x 5 x x x x 10 x x x x x 13 x 14 15 16 17 18 15 x x x 19 ’ ’ *(2 - l e n ( s t r ( p o s ) ) ) , November 25, 2010 2