/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