今天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的。。。
膜拜..
党姐。。。作为你的队友我无限光荣。。。 😳
yyyyyyyyyyyyyyyyyyyyyyyyyyyym
原本打算等到要给大家算分的时候再写个脚本的,现在可以捡现成的了
😯
orz
98传送门过来ym
现在才知道98是啥,,汗~~
厉害!ym
不过新人土问一下,程序在哪。。。
复制代码么?
python不是一行一行来的么
我太土了。。。
就是最长的那个,复制下保存成.py格式,双击就成,当然你还要下个python才能解释脚本,http://www.python.org/getit/
双击就是一个控制台突然闪出来然后又没了= = ➡
。。。。你再试试吧。。。。有IDLE折腾下,顺便把python学学吧,, 😀
被邮件传送过来ym
同被传送过来,yyyyym