将lemon下的数据转成UOJ支持的格式

本文介绍了一个Python脚本,用于自动化地将OI比赛中的题目数据格式转换为UOJ平台所需的格式,包括处理传统题和包含subtask的数据,通过修改文件名和创建必要的配置文件,大大提高了效率。

背景

很多时候OI考试都是使用lemon进行评测的,但是赛后把题目放到OJ上会更方便补题一些。由于很多OI题数据点很多,一个一个复制改名会很累,所以写一些py脚本来改格式就会方便很多。

UOJ下的数据格式具体可以看社区版的wiki

代码

传统题

import os, shutil

cnt = {}
tot = 0
pre = 'data'
firstsuf = 'unknown'
in_suf, out_suf = 'in', 'out'
time_limit = 1
memory_limit = 128
output_limit = 64
n_ex_tests = 1
n_sample_tests = 1

for root, dirs, files in os.walk('.'):
    for name in files:
        p=str(name).find('.')
        suf=name[p:]
        if root == '.' and (suf=='.in' or suf=='.out' or suf=='.ans'):
            if suf=='.ans': out_suf = 'ans'
            if firstsuf == 'unknown': firstsuf = suf
            if suf == firstsuf: tot += 1
            if not cnt.has_key(suf): cnt[suf] = 0
            cnt[suf] += 1
            newname = pre+str(cnt[suf])+suf
            shutil.move(name, newname)
            print(root, newname, name)

for i in range(n_ex_tests):
    with open('.\\ex_'+pre+str(i+1)+'.'+in_suf, 'w') as f:
        f.write('')
    with open('.\\ex_'+pre+str(i+1)+'.'+out_suf, 'w') as f:
        f.write('')        

with open('.\\problem.conf', 'w') as f:
    f.write('n_tests '+str(tot)+'\n')
    f.write('n_ex_tests '+str(n_ex_tests)+'\n')
    f.write('n_sample_tests '+str(n_sample_tests)+'\n')
    f.write('input_pre '+pre+'\n')
    f.write('output_pre '+pre+'\n')
    f.write('input_suf '+in_suf+'\n')
    f.write('output_suf '+out_suf+'\n')
    f.write('time_limit '+str(time_limit)+'\n')
    f.write('memory_limit '+str(memory_limit)+'\n')
    f.write('output_limit '+str(output_limit)+'\n')
    f.write('use_builtin_judger on\n')
    f.write('use_builtin_checker ncmp')

包含subtask(数据放在子文件夹下)

import os, shutil

subtasks = {}
cnt = {}
tot = 0
firstsuf = 'unknown'
pre = 'data'
in_suf, out_suf = 'in', 'out'
path=os.getcwd()

for root, dirs, files in os.walk('.'):
    for name in files:
        p=str(name).find('.')
        suf=name[p:]
        if root[-8:-1]=='Subtask' and (suf=='.in' or suf=='.out' or suf=='.ans'):
            if (suf=='.ans'): out_suf = 'ans'
            if firstsuf == 'unknown': firstsuf = suf
            if not subtasks.has_key(root): subtasks[root]=0
            if (not cnt.has_key(suf)): cnt[suf]=0
            cnt[suf]+=1
            if suf==firstsuf: subtasks[root]+=1
            newname=pre+str(cnt[suf])+suf
            shutil.copyfile(os.path.join(root,name), os.path.join(path, newname))
            print(root, firstsuf, subtasks[root], name)

with open('.\\problem.conf', 'w') as f:
    f.write('n_subtasks '+str(len(subtasks))+'\n')
    i=1
    for key,val in subtasks.items():
        tot+=val
        print(key, val, tot)
        f.write('subtask_end_'+str(i)+' '+str(tot)+'\n')
        f.write('subtask_score_'+str(i)+' 0\n')
        i+=1
    f.write('n_tests '+str(tot)+'\n')
    f.write('input_pre '+pre+'\n')
    f.write('output_pre '+pre+'\n')
    f.write('input_suf '+in_suf+'\n')
    f.write('output_suf '+out_suf+'\n')
    f.write('time_limit 1\n')
    f.write('memory_limit 128\n')
    f.write('output_limit 64\n')
    f.write('use_builtin_judger on\n')
    f.write('use_builtin_checker ncmp')

todo

把代码改成参数的形式(感觉要永远鸽了)

转载于:https://www.cnblogs.com/naiij/p/10697936.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值