Skip to content

Instantly share code, notes, and snippets.

@tjkendev
Created December 12, 2015 09:24
Show Gist options
  • Save tjkendev/c10963cf690256891594 to your computer and use it in GitHub Desktop.
Save tjkendev/c10963cf690256891594 to your computer and use it in GitHub Desktop.
Code Runner 決勝用に書いたソースコード
# -*- 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