python 12關挑戰,看看你能過幾關

2020-09-26 09:00:03

第0關

計算2的38次方

>>> 2**38
274877906944
>>> pow(2,38)
274877906944

第1關

實現字母移位編解碼

import string, sys
a = string.ascii_lowercase
b = a[2:] + a[:2]
s = sys.stdin.read()
print s.translate(string.maketrans(a, b))

第2關

從一大段字串中尋找只出現過一次的字元,並按原順序輸出。

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)

第3關

從一大段字元中找出小寫字母,要求它的左右分別恰好有三個大寫字母,按原順序輸出。

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)

第4關

有一組類似連結串列結構的網頁,每個頁面給出了下一個頁面的地址引數,遍歷整個鏈找到最後的結點。

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)

第5關

使用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])

第6關

與第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

第7關

在一張圖片的中間取一部分畫素點,將其灰度值轉換成對應的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'

第8關

給出經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'

第9關

給出一個整數列表代表一條線,其中第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')

第10關

求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])

第11關

給出一張影象,要求去掉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')

資源傳送門

  • 關注【做一個柔情的程式猿】公眾號
  • 在【做一個柔情的程式猿】公眾號後臺回覆 【python資料】【2020秋招】 即可獲取相應的驚喜哦!

「❤️ 感謝大家」

  • 點贊支援下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
  • 歡迎在留言區與我分享你的想法,也歡迎你在留言區記錄你的思考過程。