Created
December 12, 2015 09:24
-
-
Save tjkendev/c10963cf690256891594 to your computer and use it in GitHub Desktop.
Code Runner 決勝用に書いたソースコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- encoding: utf-8 -*- | |
import urllib2, time, os | |
import itertools, random | |
import socket | |
urlopen = urllib2.urlopen | |
random.seed() | |
rand = random.randint | |
randf = random.random | |
def query(url): | |
res = urlopen(url, timeout=1) | |
return res.read() | |
def exist(filename): | |
return os.path.isfile(filename) | |
def read_file(filename): | |
f = open(filename) | |
data = f.read() | |
f.close() | |
return data | |
def save_file(filename, string): | |
f = open(filename, 'w') | |
f.write(string) | |
f.close() | |
token = "*****" | |
def s_query(string): | |
v = None | |
while 1: | |
try: | |
v = query(string) | |
return v | |
except urllib2.HTTPError, e: | |
print "[",e,"]", e.read() | |
break | |
except urllib2.URLError, e: | |
print "[",e,"]" | |
except socket.timeout, e: | |
print "[",e,"]" | |
return v | |
def g_query(tp, p=None): | |
print "query " + tp | |
q = "http://game.coderunner.jp/" + tp + "?token=" + token + ("&" + p if p else "") | |
print q | |
return s_query(q) | |
# 受注 | |
def taketask(): | |
return g_query("taketask") | |
# 部下への割り当て | |
def assign(task_id, worker_ids): | |
return g_query("assign", "task=%d&worker=%s" % (task_id, ','.join(map(str, worker_ids)))) | |
# 外注 | |
def outsource(task_id, orderReward): | |
return g_query("outsource", "task=%d&orderReward=%d" % (task_id, orderReward)) | |
# 部下の挿げ替える | |
def change(worker_ids): | |
return g_query("change", "worker=%s" % ','.join(map(str, worker_ids))) | |
# 会社情報 | |
def getinfo(): | |
return g_query("getinfo") | |
# 外注情報 | |
def getout(): | |
return g_query("getout") | |
def load(filename): | |
if exist(filename): | |
text = read_file(filename) | |
#print text | |
return eval(text) if text else {} | |
else: | |
return {} | |
def get_varname(obj): | |
return [k for k, v in globals().items() if id(obj) == id(v)] | |
#filename = "solve.txt" | |
filename = "temp.txt" | |
var_file = "temp_%s.txt" | |
memo = load(filename) | |
# -> save_file(filename, str(memo)) | |
count = 0 | |
outsource_base = 20 | |
reward_base = 30. | |
while 1: | |
if count%5==0: | |
dd = getinfo() | |
if dd: | |
info = [map(int, e.split()) for e in dd.split("\n")] | |
money = info[0][0] | |
bn, tn = info[1] | |
print "部下の数 %d, 種類の数 %d" % (bn, tn) | |
idx = 2 | |
sp = {} | |
ti = {} | |
exp = {} | |
for i in xrange(bn): | |
data = info[idx+i] | |
sp[data[0]] = data[1:-2] | |
ti[data[0]] = data[-2] | |
exp[data[0]] = data[-1] | |
print data[0], "= (sp)", sp[data[0]] | |
print data[0], "= (ti)", ti[data[0]] | |
print data[0], "= (exp)", exp[data[0]] | |
idx += bn | |
wn = info[idx][0] | |
print "未割り当てのタスク数 %d" % wn | |
idx += 1 | |
w_data = {} | |
for i in xrange(wn): | |
data = info[idx+i] | |
w_data[data[0]] = {"rest": data[1], "amount": data[2], "type": data[3], "reward": data[4], "panish": data[5], "assign": 0} | |
print data[0], w_data[data[0]] | |
idx += wn | |
on = info[idx][0] | |
print "外注数 %d" % on | |
idx += 1 | |
o_data = {} | |
for i in xrange(on): | |
data = info[idx+i] | |
o_data[data[0]] = {"rest": data[1], "amount": data[2], "type": data[3], "reward": data[4], "panish": data[5], "money": data[6], "assign": 0} | |
print "info ok" | |
if wn>0: | |
for wid, w_info in w_data.items(): | |
if w_info["assign"]: | |
continue | |
if w_info["amount"] < outsource_base*w_info["reward"] and on < 40: | |
outsource(wid, w_info["amount"]/float(reward_base)) | |
print "outsource" | |
w_info["assign"] = 1 | |
on += 1 | |
else: | |
workers = [(k, v[w_info["type"]]) for k, v in sp.items() if ti[k]==0] | |
workers.sort(reverse=True) | |
rr = 0. | |
assign_id = [] | |
for i, speed in workers: | |
assign_id.append(i) | |
rr += speed | |
if w_info["amount"] <= rr*w_info["rest"]: | |
break | |
print "[", wid, "]", float(w_info["amount"])/w_info["reward"] ,w_info["amount"], rr*w_info["rest"], len(assign_id) | |
if len(assign_id)>0 and w_info["amount"] <= rr*w_info["rest"]: | |
print assign(wid, assign_id) | |
print "assign ok" | |
w_info["assign"] = 1 | |
for bid in assign_id: | |
ti[bid] = w_info["rest"] | |
wn -= 1 | |
if count%5==0: | |
print "out info" | |
dd = getout() | |
if dd: | |
info = [map(int, e.split()) for e in dd.split("\n")] | |
o_num = info[0][0] | |
print o_num | |
tasks = [info[1+i] for i in xrange(o_num)] | |
tasks.sort(key=lambda x: float(x[2])/x[4], reverse=True) | |
for wid, rest, amount, tp, reward in tasks: | |
if amount < 100*reward: | |
continue | |
workers = [(k, v[tp]) for k, v in sp.items() if ti[k]==0] | |
workers.sort(reverse=True) | |
rr = 0 | |
assign_id = [] | |
for j, speed in workers: | |
assign_id.append(j) | |
rr += speed | |
if amount <= rr*rest: | |
break | |
print "[", wid, "(out)]", float(amount)/reward, amount, rr*rest, len(assign_id), len(workers) | |
if len(assign_id)>0 and amount <= rr*rest: | |
print assign(wid, assign_id) | |
print "", wid, "(out) assign ok" | |
for bid in assign_id: | |
ti[bid] = rest | |
if wn<1 and sum(ti[k]==0 for k, v in sp.items())>0: | |
print "take task" | |
task = taketask() | |
wid, rest, amount, tp, reward, panish = map(int, task.split()) | |
if amount < outsource_base*reward and on < 20: | |
outsource(wid, amount/float(reward_base)) | |
print "outsource" | |
on += 1 | |
else: | |
workers = [(k, v[tp]) for k, v in sp.items() if ti[k]==0] | |
workers.sort(reverse=True) | |
rr = 0. | |
assign_id = [] | |
for i, speed in workers: | |
assign_id.append(i) | |
rr += speed | |
if amount <= rr*rest: | |
break | |
print "[", wid, "]", float(amount)/reward, amount, rr*rest, len(assign_id) | |
if len(assign_id)>0 and amount <= rr*rest: | |
print assign(wid, assign_id) | |
print "", wid, "assign ok" | |
wn -= 1 | |
for bid in assign_id: | |
ti[bid] = rest | |
else: | |
print "cannot assign" | |
w_data[wid] = {"rest": rest, "amount": amount, "type": tp, "reward": reward, "panish": panish, "assign": 0} | |
wn += 1 | |
time.sleep(0.2) | |
for k, v in ti.items(): | |
ti[k] = max(ti[k]-0.2, 0) | |
for wid, wd in w_data.items(): | |
w_data[wid]["rest"] -= 0.2 | |
count += 1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment