小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

2002年2月16日 星期六

python: 猜數字遊戲 七次必中



這個程式碼還可已有不少改良.不是說可以改得更強(這隻程式明顯很弱),因為這個不是這隻程式的目的,而是可以改得更短更簡潔。

發信人: weijr (Magic Happens), 信區: weijr

標 題: Re: python
發信站: 透藍的盒子 BBS (Fri Feb 15 03:58:40 2002), 轉信

#!/usr/bin/python
# 猜數字遊戲,七次必中 2002(C) weijr
# USAGE: ./gagb.py 4567 , works fine on my Athlon 1.2Ghz
from sys import *
X,M,BIG,A=4,range(10),99999,range(4)
so=lambda a,b: (len(filter(lambda i:a[i]==b[i],A)),
len([i for i in A for j in A if i!=j and a[i]==b[j]]))
def fd(rm,sc,N,a,b):
if len(rm) in (1,5040): return [100-N,rm[0]]
if not (rm and N):return [len(rm)*BIG,[]]
m,r,n=b,[],a
for i in rm:
for j in sc:
n=max(fd(filter(lambda x:so(x,i)==j,rm),sc,N-1,n,b)[0],n)
if n>=b:break
(m,r,n)=min((n,i,a),(m,r,a))
if m<=a:return [m,r]
return [m,r]

sc=[(x,y) for x in A for y in A+[X] if x+y<=X and (x,y)!=(X-1,1)]
g=reduce(lambda x,y:[a+[i] for a in x for i in M if i not in a],A,[[]])
K,a,s=0,[],[int(argv[1][i]) for i in A]
while a!=s: #go guess
[n,a,K]=fd(g,sc,6-K,100,BIG)+[K+1]
g=filter(lambda x:so(a,s)==so(a,x),g[:])
print a,so(a,s)




python: 圓周率 質數 組合

算圓週率到小數點下一千位
l=4*10**1005
print reduce(lambda a,i:(4*l/5**i-l/239**i)/i-a,range(1,1450,2),0)

10^A位
T=10**A
M,l,R=100*T,4*10**(T+A+2),range(1,145*T/100,2)
print reduce(lambda (p,q,r),i:((q-r)/i-p,q/25,r/57121),R,(0,4*l/5,l/239))[0]/M

更新
l,N==10**1005,10**4
print reduce(lambda a,i:l+a*i/(2*i+1),range(N,0,-1),l)/5/N

列出所有小於N的質數
reduce(lambda x,i:filter(lambda j:j==i or j%i!=0,x),range(2,N**0.5),range(2,N))


c7 取6 程式怎麼寫 ...
python 程式碼
reduce(lambda s,i:[l+[j] for l in s for j in A if not l or j>l[-1]],A[:6],[[]])
其中A是要取六的集合。

2002年2月9日 星期六

樂透必中組合 python

發信人: weijr (Magic Happens), 信區: TnC
標 題: Re: 樂透必中組合產生器
發信站: 透藍的盒子 BBS (Fri Feb 1 15:34:33 2002), 轉信

【 在 weijr (Magic Happens) 的大作中提到: 】
: 練習python用的。貪心算法,共23行。用C可能會快一千倍以上。
果然快一千倍。雖然程式碼長十倍。
另一個版本的python source.

#!/usr/bin/python
import sys
[V,K,T,M]=map(int,sys.argv[1:])
A,mc,mn,num=[],[],1,0
ok=lambda l1,l2:len([i for i in l1 if i in l2])>=T
def try_all(m,n,f,l=[0]):
if not n: return f(l[1:])
map(lambda x:try_all(m,n-1,f,l+[x]),xrange(l[-1]+1,m+1))
def find_max(l):
global mn,mc
(mn,mc)=max((len([i for i in A if ok(l,i)]),l),(mn,mc))
try_all(V,M,A.append)
while mn:
(mc,mn,num)=([],0,num+1)
try_all(V,K,find_max)
map(A.remove,filter(lambda x:ok(x,mc),A))
print num,"mc=",mc,"mn=",mn

發信人: weijr (Magic Happens), 信區: TnC
標 題: Re: 樂透必中組合產生器
發信站: 透藍的盒子 BBS (Fri Feb 1 15:34:33 2002), 轉信

【 在 weijr (Magic Happens) 的大作中提到: 】
: 練習python用的。貪心算法,共23行。用C可能會快一千倍以上。
果然快一千倍。雖然程式碼長十倍。
另一個版本的python source.

#!/usr/bin/python
import sys
[V,K,T,M]=map(int,sys.argv[1:])
A,mc,mn,num=[],[],1,0
ok=lambda l1,l2:len([i for i in l1 if i in l2])>=T
def try_all(m,n,f,l=[0]):
if not n: return f(l[1:])
map(lambda x:try_all(m,n-1,f,l+[x]),xrange(l[-1]+1,m+1))
def find_max(l):
global mn,mc
(mn,mc)=max((len([i for i in A if ok(l,i)]),l),(mn,mc))
try_all(V,M,A.append)
while mn:
(mc,mn,num)=([],0,num+1)
try_all(V,K,find_max)
map(A.remove,filter(lambda x:ok(x,mc),A))
print num,"mc=",mc,"mn=",mn