Skip to content

Instantly share code, notes, and snippets.

@odanado
Created December 13, 2015 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save odanado/de4c6e8a67c7b39a8407 to your computer and use it in GitHub Desktop.
Save odanado/de4c6e8a67c7b39a8407 to your computer and use it in GitHub Desktop.
CODE RUNNER 2015 本戦
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