# Kids problem # def produce_result(x, y, order): """ Walks along the path from end to beginning and note the numbers of the kids that are moved """ result = [] min = 1 max = len(order) while x > 1: x = x - 1 result.append(("p", min)) min = min + 1 while y > 1: y = y - 1 result.append(("k", max)) max = max - 1 return result def print_result(result): print len(result), ":", print "[", for k in range(len(result)-1,-1,-1): print result[k], print "]" print def compute(children): """ Order is a list denoting the ordering of the kids: order = [5, 2, 3, 4, 1]: kid that should be on position 5 at the end, is on position 1 at the beginning. Kid that should be on 2 is on 2, etc. """ limit = len(children) ordered = {} order = {} # make a map number -> position for k in range(0,len(children)): order[children[k]]=k+1 for level in range(limit,0,-1): for min in range(1,level+1): max = min + limit - level if ( min == max): # first row ordered[min-1] = True elif (min + 1 == max): # second row ordered[min-1] = order[min] < order[max] else: # other rows ordered[min-1]= ordered[min-1] and ordered[min] if ordered[min-1]: flevel, fmin = level, min # Transform to rectangular fx = fmin fy = flevel - fmin + 1 print_result(produce_result(fx, fy, order))