ZJU集训选拔分数判定器 (dt了..= =)

今天edward_mj说到浙大的集训选拔分数统计有点难搞,我就萌生写个py脚本来统计分数的想法,正好最近py手生,说搞就搞~

统计标准在这里:

狗狗40题(这里的1001-1040) 2.5分/题
Andrew Stankevich’s Contest 1.5分/题
其余ZOJ中所有题号的质数的题 1分/题
其余题目 0.3分/题

这是关于zoj题目的统计,我主要就是搞这个,主要框架就是一个if else 语句,难点就是提取那几个题的题号,一步一步来:

一、提取狗狗40题题号:

shi哥的blog有现成的题号,但是还需要分离,复制网页html代码,然后通过文件找出题号,我用的是很笨的方法,找到那一行,再找到那一个数字= =

f = open("40.txt","r")
fp = open("out.txt","w")
for i in range(1,241):
    a = f.readline();
    if i%6 is not 4:
        continue
    fp.write(a[4:8]+",")


这个这个。。不解释了。。。太水了 👿

二、提取大妈套题的数据:

这个有点难,因为他的题号是分开的,需要通过页面中的题目来源搜索,我们可以看到11套题的搜索结果都只差了个数字,因为他的搜索时用的是get方式,信息都在地址上,可以修改地址来获取信息。一个循环。。把每套大妈题的题目都获取到。。

在这里用到了正则表达式,其中re.findall(r”\d{4}<f”,a)是获取网页中的题号,找到一个题号就处理一下,放到输出文件中,注意搜索1时候他把10和11的题都弄上去了,有重复。。手工去除

import urllib
import re
ss = "http://acm.zju.edu.cn/onlinejudge/searchProblem.do?contestId=1&titlefrom=0&authorfrom=0&sourcefrom=0&query=Andrew+Stankevich%27s+Contest+%23"

f = open("out.txt","w")
for i in range(1,12):
    url = ss + str(i)
    wang = urllib.urlopen(url)
    a = wang.read()
    li = re.findall(r"\d{4}</f",a)
    for line in li:
        f.write(line[:4]+",")

三。提取用户已过题目信息。
这个有点纠结,,直接输入用户名没法搞,只能用用户id,,,再次用正则表达式获取题号:
其中,gougou表示狗狗40题,andrew表示大妈套题,pattern表示通过re找到的包含题目的的字符串的列表,各种统计变量从名字上都很好认定:

import urllib
import math
import re
def prime(n):
    for i in range(2,int(math.sqrt(n)+0.5)):
        if n%i == 0:
            return 0
    return 1

gougou = [1021,1030,1041,1043,1060,1063,1066,1100,1103,1116,\
          1123,1138,1144,1145,1155,1185,1193,1197,1230,1237,\
          1245,1298,1299,1301,1321,1387,1389,1391,1413,1423,\
          1425,1426,1448,1460,1462,1463,1504,1506,1509,1518]
andrew = [2313,2314,2315,2316,2317,2318,2319,2320,\
          2337,2338,2339,2340,2341,2342,2343,2344,\
          2361,2362,2363,2364,2365,2366,2367,2368,2369,\
          2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,\
          2587,2588,2589,2590,2591,2592,2593,2594,\
          2595,2596,2597,2598,2599,2600,2601,2602,2603,\
          2604,2605,2606,2607,2608,2609,2610,2611,2612,\
          2670,2671,2672,2673,2674,2675,2676,2677,2678,\
          2696,2697,2698,2699,2700,2701,2702,2703,\
          2704,2705,2706,2707,2708,2709,2710,2711,\
          3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372]

url = "http://acm.zju.edu.cn/onlinejudge/showUserStatus.do?userId="
userid = input("Please input you userid(in your user status address):")
f = urllib.urlopen(url+str(userid))
a = f.read()
f.close

numofgougou = numofandrew = numofprime = count =summ= 0
username = re.findall(r'"5">\w{1,}',a)
print "YOU ARE " + username[0][4:] + ' !!'
pattern = re.findall(r"\d{4}</a>",a)

for line in pattern:
    num = int(line[:4])
    if num in gougou:
        count += 2.5
        numofgougou += 1
    elif num in andrew:
        count += 1.5
        numofandrew += 1
    elif prime(num):
        count += 1
        numofprime += 1
    else:
        count += 0.3
    summ += 1
    #print line
print "Num of gougou: ",numofgougou
print "Num of andrew: ",numofandrew
print "Num of prime:  ",numofprime
print "The number of problems you have solved:",summ
print "Total scores ",count
f = input()

完了之后我测了下我的。。138.3.。。。算是合格了。。晒晒我的。。。

watashi的我运行了好半天。。。500+分。。。
什么时候zzu要是置顶选拔标准我也弄个比这bt的。。。

关于 “ZJU集训选拔分数判定器 (dt了..= =)” 的 12 个意见

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注