Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
JarRacing solution in Uncategorized category for Water Jars by suwanditan
from itertools import chain
class LowTrack( object ):
def __init__( self, jars ):
self.jars = jars
def prepareLap( self, isSwapped = False ):
jars = self.jars
jar, buffers = jars[0], 0
yield jar, buffers, "01" if not isSwapped else "02"
while True:
if jar == jars[0] or buffers == 0:
while jars[0]+buffers <= jars[1]:
jar, buffers = 0, buffers + jar
yield jar, buffers, "12" if not isSwapped else "21"
jar, buffers = jars[0], buffers + jar
yield jar, buffers, "01" if not isSwapped else "02"
if buffers != jars[1]:
jar, buffers = jars[0] - jars[1]+buffers, jars[1]
yield jar, buffers, "12" if not isSwapped else "21"
if buffers == jars[1]:
jar, buffers = jar, 0
yield jar, buffers, "20"
class HighTrack( object ):
def __init__( self, jars ):
self.jars = jars
def prepareLap( self, isSwapped = False ):
jars = self.jars
buffers, jar = 0, jars[1]
yield buffers, jar, "02" if not isSwapped else "01"
while True:
if buffers == 0 or jar == jars[1]:
if jar-jars[0] + buffers < 0:
buffers, jar = jar, 0
yield buffers, jar, "21" if not isSwapped else "12"
else:
buffers, jar = jars[0], jar-jars[0] + buffers
yield buffers, jar, "21" if not isSwapped else "12"
if buffers == jars[0]:
buffers, jar = 0, jar
yield buffers, jar, "10" if not isSwapped else "20"
if jar == 0:
buffers, jar = buffers, jars[1]
yield buffers, jar, "02"
class JarRacing( object ):
JAR_LOW = 0
JAR_HIGH = 1
JAR_TRACK = 2
def __init__( self, first, second, goal ):
self.jars = sorted( [first, second] )
self.goal = goal
self.isSwapped = True if first > second else False
self.tracks = []
def race( self ):
lowJar = LowTrack( self.jars ).prepareLap( self.isSwapped )
highJar = HighTrack( self.jars ).prepareLap( self.isSwapped )
while True:
try:
lowLap = next( lowJar ) # Okay, LowJar, you first
highLap = next( highJar ) # now, time to catch up :)
self.tracks.append( (lowLap[ self.JAR_TRACK ], highLap[ self.JAR_TRACK ]) )
if self.goal in chain.from_iterable( [ lowLap, highLap ] ):
# Whoaa, why stop? what! finish? who's the winner??
self.tracks = list( zip( * self.tracks ) )
return list( self.tracks[ self.JAR_HIGH ] if self.goal in highLap else self.tracks[ self.JAR_LOW ] )
except StopIteration:
break
def checkio( first, second, goal ):
return JarRacing( first, second, goal ).race() # Racing Start !
if __name__ == '__main__':
print(checkio(5, 7, 6)) # ['02', '21', '10', '21', '02', '21', '10', '21', '02', '21']
print(checkio(3, 4, 1)) # ["02", "21"]
Aug. 24, 2013