Created
December 13, 2015 12:52
-
-
Save odanado/de4c6e8a67c7b39a8407 to your computer and use it in GitHub Desktop.
CODE RUNNER 2015 本戦
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
require 'open-uri' | |
require 'json' | |
require 'pp' | |
$url = "https://game.coderunner.jp" | |
$token = "" | |
def query(v) | |
url = $url + "/query?token=#{$token}&v=#{v.join(',')}" | |
res = open(url) | |
res.string.to_i | |
end | |
# 仕事を得る | |
def taketask | |
url = "http://game.coderunner.jp/taketaskJson?token=" + $token | |
res = open(url) | |
JSON[res.string] | |
end | |
# 会社情報を得る | |
def getInfo | |
url = "http://game.coderunner.jp/getinfoJson?token=" + $token | |
res = open(url) | |
JSON[res.string] | |
end | |
# 仕事の割り当て | |
def assign(task, worker) | |
url = "http://game.coderunner.jp/assign?task=#{task}&worker=#{worker.join(',')}&token=" + $token | |
warn "#{__LINE__}: #{url}" | |
begin | |
res = open(url) | |
res.string | |
rescue => e | |
puts e.message | |
pp e | |
puts res | |
puts "#{__LINE__}: assign error #{res}" | |
exit | |
end | |
end | |
# 外注をする | |
def outsource(task, orderReward) | |
url = "http://game.coderunner.jp/outsource?task=#{task}&orderReward=#{orderReward}&token=#{$token}" | |
end | |
# 外注情報取得 | |
def getout | |
url = "http://game.coderunner.jp/getoutJson?token=" + $token | |
res = open(url) | |
JSON[res.string] | |
end | |
# 部下入れ替え | |
def change(worker) | |
url = "http://game.coderunner.jp/change?worker=#{worker.join(',')}&token=" + $token | |
res = open(url) | |
JSON[res.string] | |
end | |
# 仕事をしていない労働者について、ある仕事が得意な順にソートする | |
def workersSort(workers, id) | |
workers.select!{|worker| worker["time"] == 0} | |
workers.sort!{|a, b| | |
b["speed"][id] <=> a["speed"][id] | |
} | |
end | |
# 仕事pattern をちょうどspeed で終わらせる人かそれ以上で終わらせる人のidを返す | |
def getWorker(workers, pattern, speed) | |
diff = 100 | |
id = nil | |
workers.each{|worker| | |
t = worker["speed"][pattern] - speed | |
if worker["time"] == 0 and t > 0 and t < diff | |
diff = t | |
id = worker["id"] | |
end | |
} | |
puts "#{__LINE__}: id: #{id} pattern: #{pattern} speed: #{speed}" | |
id | |
end | |
def showWorkers(workers, workersId) | |
workers.select{|worker| | |
workersId.include?(worker["id"]) | |
}.each{|worker| | |
puts "#{__LINE__}: #{worker}" | |
} | |
end | |
# 仕事を貪欲に割り当てる | |
def greedyAssign(workers, task) | |
assignedWorker = [] | |
pattern = task["pattern"] | |
workersSort(workers, pattern) | |
ok = false | |
s = task["load"] / (task["time"] + 15) | |
puts "#{__LINE__}: load: #{task['load']} time: #{task['time']}" | |
puts "#{__LINE__}: laod / time: #{s}" | |
if s < 10 | |
id = getWorker(workers, pattern, s) | |
unless id.nil? | |
showWorkers(workers, [id]) | |
worker = workers.select{|worker| worker['id'] == id}.first | |
speed = worker['speed'][pattern] | |
puts "#{__LINE__}: task load: #{task['load']} speed: #{speed} task time: #{task['time']}" | |
if task["load"] / speed + 5 < task["time"] | |
return [id] | |
end | |
puts "#{__LINE__}: やっぱ無理だったよ" | |
end | |
end | |
speed = 0 | |
workers.each{|worker| | |
speed += worker["speed"][pattern] | |
time = 1.0 * task["load"] / speed | |
assignedWorker << worker["id"] | |
if task["time"] > time + 5 | |
ok = true | |
puts "#{__LINE__}: task: #{task['time']}, #{time}" | |
puts "#{__LINE__}: worker: #{assignedWorker.join(',')}" | |
break | |
end | |
} | |
if ok | |
return assignedWorker | |
else | |
return [] | |
end | |
end | |
# ある人数以上が暇になる最小の時間を返す | |
def getWaitTime(info, n) | |
workers = info["workers"].sort{|a,b| a["time"]<=>b["time"]} | |
time = 0 | |
cnt = 0 | |
workers.each{|worker| | |
cnt+=1 | |
time = worker["time"] | |
break if n < cnt | |
} | |
time | |
end | |
loop do | |
info = getInfo() | |
task = taketask() | |
assignedWorker = greedyAssign(info["workers"].clone, task) | |
# puts showWorkers(info, assignedWorker) | |
unless assignedWorker.empty? | |
puts assign(task["id"], assignedWorker) | |
sleep(1) | |
else | |
puts "終わりだよ〜" | |
time = getWaitTime(info, 30) | |
puts "#{__LINE__}: wait time: #{time}" | |
sleep(time) | |
end | |
puts "" | |
end | |
puts getInfo | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment