計算2的38次方
>>> 2**38
274877906944
>>> pow(2,38)
274877906944
實現字母移位編解碼
import string, sys
a = string.ascii_lowercase
b = a[2:] + a[:2]
s = sys.stdin.read()
print s.translate(string.maketrans(a, b))
從一大段字串中尋找只出現過一次的字元,並按原順序輸出。
import urllib, re, sys
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('ocr.html')
txt = re.findall(r'<!--(.*?)-->', dat, re.S)[-1]
d = {}
for i in txt:
d[i] = d.get(i, 0) + 1
for i in txt:
if d[i] == 1:
sys.stdout.write(i)
從一大段字元中找出小寫字母,要求它的左右分別恰好有三個大寫字母,按原順序輸出。
import urllib, re, sys
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('equality.html')
txt = re.findall(r'<!--(.*?)-->', dat, re.S)[-1]
ans = re.findall(r'[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', txt, re.S)
print ''.join(ans)
有一組類似連結串列結構的網頁,每個頁面給出了下一個頁面的地址引數,遍歷整個鏈找到最後的結點。
import urllib, re
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
pre = 'linkedlist.php?nothing='
idx = '12345'
while True:
dat = get_file(pre + idx)
print dat
ans = re.search(r'\d+', dat)
if ans is None: break
idx = ans.group(0)
使用pickle模組載入序列化後的內容,然後列印出來。
import urllib, pickle
def get_file(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return urllib.urlopen(url).read()
dat = get_file('banner.p')
ans = pickle.loads(dat)
print '\n'.join([''.join([j[0] * j[1] for j in i]) for i in ans])
與第4關類似,但這次結點資訊存在於一個zip檔案中,需要從頭到尾拼接各個檔案的註釋內容。
import urllib, StringIO, zipfile, re
def get_zip(fname):
url = 'http://www.pythonchallenge.com/pc/def/' + fname
return zipfile.ZipFile(StringIO.StringIO(urllib.urlopen(url).read()))
z = get_zip('channel.zip')
idx = 'readme'
cmt = ''
while True:
cmt += z.getinfo(idx + '.txt').comment
txt = z.read(idx + '.txt')
ret = re.search(r'\d{2,}', txt)
if ret is None: break
idx = ret.group(0)
print cmt
在一張圖片的中間取一部分畫素點,將其灰度值轉換成對應的Ascii字元。
>>> import urllib, StringIO
>>> from PIL import Image
>>> src = urllib.urlopen('https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202009/oxygenenm5fvf2dxn.png').read()
>>> img = Image.open(StringIO.StringIO(src))
>>> w, h = img.size
>>> ''.join([chr(img.getpixel((i, h/2))[0]) for i in xrange(0, w, 7)])
'smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]pe_'
>>> ''.join(map(chr, [105, 110, 116, 101, 103, 114, 105, 116, 121]))
'integrity'
給出經bzip壓縮過的使用者名稱和密碼內容,將其還原。
>>> import bz2
>>> uid='BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>> pwd='BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
>>> bz2.BZ2Decompressor().decompress(uid)
'huge'
>>> bz2.BZ2Decompressor().decompress(pwd)
'file'
給出一個整數列表代表一條線,其中第i點的x,y座標下標分別為2i, 2i+1,根據座標點畫出該圖。
>>> from PIL import Image, ImageDraw
>>> l1 = [146,399, ...]
>>> l2 = [156,141, ...]
>>> img = Image.new('1', (500,500), 1)
>>> draw = ImageDraw.Draw(img)
>>> draw.line(zip(l1[0::2], l1[1::2]))
>>> draw.line(zip(l2[0::2], l2[1::2]))
>>> img.save('out.png')
求look-and-say sequence中第31項的長度。
a = ['1']
for i in xrange(30):
t = ''
n = 0
x = ''
for i in a[-1]:
if n == 0:
n = 1
x = i
elif i == x:
n += 1
else:
t += str(n) + x
n = 1
x = i
else:
t += str(n) + x
a.append(t)
print len(a[30])
給出一張影象,要求去掉x,y座標和為奇數的畫素點。
import urllib
import StringIO
from PIL import Image, ImageDraw
url = 'http://www.pythonchallenge.com/pc/return/cave.jpg'
dat = urllib.urlopen(url).read()
img = Image.open(StringIO.StringIO(dat))
w, h = img.size
for i in xrange(w):
for j in xrange(h):
if (i + j) % 2:
img.putpixel((i,j), 0)
img.save('out.png')