2009年5月18日 星期一

自我督促的警惕文

前陣子 實在有點低落

我確定我喜歡這些作業,跟學習

但基礎不好是個事實 挫折必然會升起

導致頗心靈疲乏!!!

藉著忙其他事情逃避了幾天也夠了

該是努力奮發的時候了!!

~~~~該衝了!!~~~

2009年4月16日 星期四

有兩個數字,分別大於1,也分別小於50
Dora把這兩個數字的乘積告訴了Allen
Dora把這兩個數字的和告訴了Ben
Dora問這兩數字是什麼?

Allen:我不知道這兩個數字什麼
Ben:我也還不知道這兩個數字是什麼
Allen:那我知道這兩個數字是什麼
Ben:喔 那我也知道了

邏輯想法:
1.從第一句Allen話中,可以推測出此兩個數字[a,b]所相乘[a*b]的答案中,只出現一次的可以先刪除
2.從第二句Ben話中,推測此兩個數字[a,b]所相加[a+b]的答案中,只出現一次的也可以刪除
3.第三句話,因為Allen聽到了Ben說的話,他從而知道答案,代表他所知道的乘積,在剩下來的選項中只有一組
4.類似上面的理由

pyton:


total=[]
for a in xrange(2,50):
for b in xrange(a+1,50):
total.append([a,b,a+b,a*b])#先將所有的可能性置入


mult=[]
for i in xrange(len(total)):
mult.append(total[i][3])#把其中 乘積的部份拿出來看
mult_s=set(mult)#列出乘積list中的所有元素


mult_p=[]
for i in mult_s:
if mult.count(i) == 1:
mult_p.append(i)
for i in reversed(xrange(len(total))):
if total[i][3] in mult_p:
del total[i]#將乘積中只有一組的剃除(邏輯1)

add=[]
for i in xrange(len(total)):
add.append(total[i][2])
add_s=set(add)
add_p=[]
for i in add_s:
if add.count(i) == 1:
add_p.append(i)
for i in reversed(xrange(len(total))):
if total[i][2] in add_p:
del total[i]#將剩下來的,把只有一組加的剃除(邏輯2)

mult2=[]
for i in xrange(len(total)):
mult2.append(total[i][3])
mult2_s=set(mult2)
answer_m=[]
for i in mult2_s:
if mult2.count(i)==1:
answer_m.append(i)#在做一遍找乘積只有一組的 但這次是留下(邏輯3)
for i in xrange(len(total)):
if total[i][3] in answer_m:
print total[i]


心得:
這作業一開使的邏輯推導很重要,利用多次的迴圈便可找出答案,其中我看了學長的寫法
深深感到自己寫程式不熟悉,導致很多可以簡略或替代的寫法,我都把他變得很複雜,這組
程式的前幾個版本,都因為自己寫的太複雜,Debug 搞到自己很煩

2009年4月12日 星期日

強哥交代作業

1.1000位學生與1000扇關著的門,皆從1編號至1000。今1號學生將所有的門打開,接著2號學生把編號2的倍數的門再關起來,3號學生再把編號3的倍數的門作相反的動作(開著的關上、關著的打開),依此類推,直到1000號學生做完。請問最後哪幾號門是打開的? 寫程式求解。



student=[]
for i in xrange(1001):
student.append(1)
for j in xrange(1,1001):
for k in xrange(0,1001,j):
student[k]=student[k]*-1
for a in xrange(1,1001):
if student[a] == -1:
print '第',a,'門開啟'

待續.....

2009/4/10 強哥密技吱吱叫

list 介紹:
a = [1,2,3,4]
#a[0]是1,a[1]是2,即第一位為0

a.append(5) #將5加入list(a)尾端->[1,2,3,4,5]
len(a) #傳回a的數量,即 5

*如何將list中的值移除:
b =[1,2,4,2,5,1,5,3]
想移除其中的2
能使用b.pop(1)
or b.remove(2)
但這remove只能移除第一個2,並且兩者都使位置向前推進
所以想使兩個2都移除的話,如果使用:
for i in range(8):
if b[i] = 2:
b.pop(i) #這種方法是錯的,因為當第一個2被移除,其順序向前,將使得下一位數被跳過,
也使得,其後的a[x]錯位,找不到。
可利用從後方刪除:
for i in xrange(8):
j = 8 - i - 1
if b[j] = 2:
b.pop[j]#無向前推擠的疑慮(此法出自"小強學長必殺技!")

ditionary 介紹:
dit={'a':3,'b':4,'c':'k'}
可以如字典般查詢

dit['d']=7 #將'd':7加入dit內


sys介紹:
例如阿蒙學長使用ubutu(os:這........)
而我們使用windows
在路徑使用上差異很大,
如果直接寫入絕對路徑,在不同作業系統上會產生錯誤
所以使用sys來配合

re介紹:
正規表示式

split切割:
如果當有一字串'a>b'
當我想個別抓出a,b,c,d時,可使用split
>>> d='a>b'
>>> d.split('>')
['a', 'b']


程式邏輯:
Ex1:
a=3
a=b
b=5
a=?#答案仍然是3

Ex2:
a=[1,2]
b=a
b[0]=3
a=?#答案卻是[3,2]

差別為Ex1為數字 Ex2則為物件
物件相等則會使兩者相互變動
為了避免此種邏輯的影響,可利用copy模組:
from copy import *
a=[1,2]
b=copy(a)
b[0]=3#a還是[1,2]

又假設:
from copy import *
a=[1,2,[1,2]]
b=copy(a)
b[2][1]=3#a變成[1, 2, [1, 3]],因為a[2]仍為物件
可利用
deepcopy將此問題解決

2009/4/10 課堂

from numpy inport *
#numpy是強大的運算模組,內有需多方便的運算函數
Ex:
array() #使list有計算能力,如矩陣
zeros(x,y)#製造x列,y行的矩陣,其各值為0
arange()#array(range())

enumerate()函式
for i,x in enumerate(q): #將q[list]中的值,位置傳回 i ,其值傳回 x

矩陣置換:
from numpy import *
a=zeros((3,3))
for i in range(3):
for j in range(3):
a[i,j]=i*j
order = [2,0,1,]
b=zeros((3,3))
for i in order:
for j in order:
b[i,j]=a[order[i],order[j]]
#當需要b[i,j]時,將從a[order[i],order[j]]尋找,會傳回order中第i,j值
就使得矩陣能轉換成需要的數據,可用在位置順序改變時