Share Pastebin
Guest
Public paste!

vollmond

By: a guest | Jul 20th, 2008 | Syntax: Groovy | Size: 3.00 KB | Hits: 111 | Expires: Never
Copy text to clipboard
  1. //SearchEngines - Google codejam
  2.  
  3. class Timetable {
  4.         static def testCase = 0
  5.         static def numTripsFromA = new 5.0%2Fdocs%2Fapi%2F">ArrayList()
  6.         static def numTripsFromB = new 5.0%2Fdocs%2Fapi%2F">ArrayList()
  7.         static def turnaround
  8.         static def curSource
  9.         static def availA
  10.         static def availB
  11.  
  12.         static void main(args) {
  13.                 if (args.length != 1) {
  14.                         println "Usage: <command> <path to input>"
  15.                         5.0%2Fdocs%2Fapi%2F">System.exit(1)
  16.                 }
  17.  
  18.                 def seenFirstLine = false
  19.                 def timeForNums = false
  20.  
  21.                 new 5.0%2Fdocs%2Fapi%2F">File(args[0]).splitEachLine(" ") { lineFields ->
  22.                         if (lineFields.size() == 1) {
  23.                                 if (seenFirstLine) {
  24.                                         if (testCase > 0) {
  25.                                                 processData()
  26.                                         }
  27.                                        
  28.                                         turnaround = new 5.0%2Fdocs%2Fapi%2F">Integer(lineFields[0])
  29.                                         timeForNums = true
  30.                                         testCase++
  31.                                         trips = new 5.0%2Fdocs%2Fapi%2F">ArrayList()
  32.                                 } else {
  33.                                         seenFirstLine = true
  34.                                 }
  35.                         } else {
  36.                                 if (timeForNums) {
  37.                                         numTripsFromA = new 5.0%2Fdocs%2Fapi%2F">Integer(lineFields[0])
  38.                                         numTripsFromB = new 5.0%2Fdocs%2Fapi%2F">Integer(lineFields[1])
  39.                                         timeForNums = false
  40.                                 } else {
  41.                                         def fieldFields = lineFields[0].tokenize(":")
  42.                                         if (fieldFields.size() > 1) {
  43.                                                 if (numTripsFromA > 0) {
  44.                                                         trips.add(new TripData(depart:lineFields[0], arrive:lineFields[1], source:"A"))
  45.                                                         numTripsFromA--
  46.                                                 } else if (numTripsFromB > 0) {
  47.                                                         trips.add(new TripData(depart:lineFields[0], arrive:lineFields[1], source:"B"))
  48.                                                         numTripsFromB--
  49.                                                 }
  50.                                         }
  51.                                 }
  52.                         }
  53.                 }
  54.  
  55.                 processData()
  56.         }
  57.  
  58.         static processData() {
  59.                 def startA = 0
  60.                 def startB = 0
  61.                 availA = 0
  62.                 availB = 0
  63.                 def curTime
  64.  
  65.                 sortTrips()
  66.  
  67.                 //println "turnaround = ${turnaround} \n $trips"
  68.  
  69.                 trips.each() { trip ->
  70.                         curTime = trip.depart
  71.                         updateTimes(curTime)
  72.                         if (trip.source == "A") {
  73.                                 if (availA > 0) {
  74.                                         availA--
  75.                                 } else {
  76.                                         startA++
  77.                                 }
  78.                         } else if (trip.source == "B") {
  79.                                 if (availB > 0) {
  80.                                         availB--
  81.                                 } else {
  82.                                         startB++
  83.                                 }
  84.                         }
  85.                 }
  86.  
  87.                 println "Case #${testCase}: ${startA} ${startB}"
  88.         }
  89.  
  90.         static updateTimes(curTime) {
  91.                 for (i in 0..trips.size()-1) {
  92.                         if (addTime(trips[i].arrive, turnaround) <= curTime && ! trips[i].done) {
  93.                                 trips[i].done = true
  94.                                 if (trips[i].source == "A") {
  95.                                         availB++
  96.                                 } else {
  97.                                         availA++
  98.                                 }
  99.                         }
  100.                 }
  101.         }
  102.  
  103.         static addTime(time, turnaround) {
  104.                 def timeFields = time.tokenize(":")
  105.                 def hours = new 5.0%2Fdocs%2Fapi%2F">Integer(timeFields[0])
  106.                 def minutes = new 5.0%2Fdocs%2Fapi%2F">Integer(timeFields[1])
  107.                 minutes += turnaround
  108.  
  109.                 if (minutes > 59) {
  110.                         hours++
  111.                         minutes -= 60
  112.                 }
  113.                
  114.                 if ("${minutes}".size() < 2) {
  115.                         minutes = "0${minutes}"
  116.                 }
  117.  
  118.                 if ("${hours}".size() < 2) {
  119.                         hours = "0${hours}"
  120.                 }
  121.  
  122.                 return "${hours}:${minutes}"
  123.         }
  124.  
  125.         static sortTrips() {
  126.                 def tmp
  127.                 def swapped = true
  128.  
  129.                 while (swapped) {
  130.                         swapped = false
  131.                         (trips.size() - 1).times() { i ->
  132.                                 if (trips[i].depart > trips[i+1].depart ||
  133.                                         (trips[i].depart == trips[i+1].depart && trips[i].arrive > trips[i+1].arrive)) {
  134.                                         swapped = true
  135.                                         tmp = trips[i]
  136.                                         trips[i] = trips[i+1]
  137.                                         trips[i+1] = tmp
  138.                                 }
  139.                         }
  140.                 }
  141.         }
  142. }