csuperbonca

Download csuperbonca

If you can't read please download the document

Upload: voxmortem

Post on 01-Feb-2016

214 views

Category:

Documents


0 download

DESCRIPTION

codingame

TRANSCRIPT

import sysimport mathimport operator# grid of 30x20: global_map#expiration_date = datetime.datetime(2015, 10, 15, 10, 33, 24, 78915)current_positions = []global_map=[]length=30height=15direction = 'LEFT'previous = 'LEFT'oord = 'DOWN'turn = 0for i in range(length): global_map.append([]) for j in range(height): global_map[i].append(-1) def update_map(player, position, global_map): global_map[position[0]][position[1]] = player def roundPosition(iPosition): return (iPosition[0]%length,iPosition[1]%height) def neigbours(aPosition): result = [] map_dimensions=[length,height] for i in [0,1]: for sign in ["-", "+"]: tmp_pos=[aPosition[0], aPosition[1]] temp_int=int(sign+"1") tmp_pos[i] += temp_int tmp_pos[i]=tmp_pos[i]%map_dimensions[i] result.append(tuple(tmp_pos)) return result def get_neigbours(zone, new_cells): result = [] for cell in new_cells: for cell_neigbour in neigbours(cell): if cell_neigbour not in zone and cell_neigbour not in result and isPositionSafe(cell_neigbour): result.append(cell_neigbour) return result def get_zones(): result=[] available_cells = [] for column_index in range(length): for line_index in range(height): if isPositionSafe((column_index,line_index)): available_cells.append((column_index, line_index)) while len(available_cells)>0: zone=[available_cells.pop()] new_cells = zone len_zone=0 while len_zone> sys.stderr, "is", str(iPosition), "safe" for opponent_position in current_positions: if opponent_position in neigbours(iPosition): return False if global_map[iPosition[0]][iPosition[1]] == -1: return True return False def isPositionRisky(iPos): iPosition = roundPosition(iPos) for opponent_position in current_positions: if opponent_position in neigbours(iPosition): return True return False def isRisky(iPosX, iPosY): return isPositionRisky((iPosX, iPosY))def isWallPourFlo(iPosition): iPosition = roundPosition(iPosition) return global_map[iPosition[0]][iPosition[1]] != -1 def isWall(iPosX, iPosY): return isWallPourFlo((iPosX, iPosY)) def isPosSafe(iPosX, iPosY): return isPositionSafe((iPosX, iPosY)) def lenghtUtil(iPosX, iPosY, iIncrX, iIncrY): if (isPosSafe(iPosX+iIncrX, iPosY+iIncrY)): return 1+lenghtUtil(iPosX+iIncrX, iPosY+iIncrY, iIncrX, iIncrY) else: return 0 def closestObstacle(iPosition): left = lenghtUtil(iPosition[0], iPosition[1], -1, 0) right = lenghtUtil(iPosition[0], iPosition[1], 1, 0) up = lenghtUtil(iPosition[0], iPosition[1], 0, -1) down = lenghtUtil(iPosition[0], iPosition[1], 0, 1) #print >> sys.stderr, "left", left, "right", right, "up", up, "down", down if up > down : aVert = 'UP' #print >> sys.stderr,"up", up else: aVert = 'DOWN' #print >> sys.stderr,"down", down if left > right: aHori = 'LEFT' #print >> sys.stderr, "left", left else: aHori = 'RIGHT' #print >> sys.stderr, "right", right return aVert, aHori def getWay(iPosition): countDico = {} countDico["LEFT"] = 0 countDico["RIGHT"] = 0 countDico["UP"] = 0 countDico["DOWN"] = 0 if not isWall(iPosition[0]-1, iPosition[1]): countDico["LEFT"] = countFree((iPosition[0]-1, iPosition[1])) if not isWall(iPosition[0]+1, iPosition[1]): countDico["RIGHT"] = countFree((iPosition[0]+1, iPosition[1])) if not isWall(iPosition[0], iPosition[1]-1): countDico["UP"] = countFree((iPosition[0], iPosition[1]-1)) if not isWall(iPosition[0], iPosition[1]+1): countDico["DOWN"] = countFree((iPosition[0], iPosition[1]+1)) way, count = max(countDico.iteritems(), key=operator.itemgetter(1)) print >> sys.stderr, "getWay:", way, "count", count if count == 0: return None else: return way def countFree(iPosition): count = 0 if isPosSafe(iPosition[0]-1, iPosition[1]): count +=1 if isPosSafe(iPosition[0]+1, iPosition[1]): count +=1 if isPosSafe(iPosition[0], iPosition[1]-1): count +=1 if isPosSafe(iPosition[0], iPosition[1]+1): count +=1 return count def getIncrement(iDirection): incrX = 0 incrY = 0 if iDirection == 'DOWN': incrY += 1 elif iDirection == 'UP': incrY -= 1 elif iDirection == 'LEFT': incrX -= 1 elif iDirection == 'RIGHT': incrX +=1 return incrX, incrY def getDirection(iPos, iDestination): print >> sys.stderr, "getDirection", iPos,iDestination, roundPosition((iPos[0], iPos[1]+1)), roundPosition((iPos[0], iPos[1]-1)),roundPosition((iPos[0]+1, iPos[1])),roundPosition((iPos[0]-1, iPos[1])) if iDestination == roundPosition((iPos[0], iPos[1]+1)): return "DOWN" elif iDestination == roundPosition((iPos[0], iPos[1]-1)): return "UP" elif iDestination == roundPosition((iPos[0]+1, iPos[1])): return "RIGHT" elif iDestination == roundPosition((iPos[0]-1, iPos[1])): return "LEFT" return Nonedef sizeZone(cell, zones): for zone in zones: if cell in zone: return len(zone),zones.index(zone) return 0, None def getZoneId(player, zones): result = [] for cell in neigbours(player): if global_map[cell[0]][cell[1]] == -1: for second_cell in neigbours(cell): if cell in zone: result.append(zones.index(zone)) if len(result)>0: return result return None def areSameZone(opponent_position, myPos, zones): for zone in zones: self_present = False enemy_present = False for cell in neigbours(myPos): if cell in zone: self_present = True if self_present: for cell in neigbours(opponent_position): if global_map[cell[0]][cell[1]] == -1: for second_cell in neigbours(cell): if cell in zone: return zone return None def stratOneVOne(): #compute zone #creer un mur pour contenir les adversaires #fill pass def feedPlayercount(): playerCount = {} for player in current_positions: zoneList = getZoneId(player, zones) for id in zoneList: if id in playerCount: playerCount[id] += 1 else: playerCount[id] = 1 return playerCountdef getAccurate(neig_list, sizeList, zoneIdList, playerCount): aAccurateSizeList = [] for index, voisin in enumerate(neig_list): aAccurateSizeList.append(sizeList[index]/playerCount[zoneIdList[index]]) return aAccurateSizeListdef fill(iPos, direction): incrX = 0 incrY = 0 previous = direction oord, tmpdir = closestObstacle(iPos) _, incrY = getIncrement(oord) if previous == 'UP' or previous == 'DOWN': direction = tmpdir incrX, _ = getIncrement(direction) sizeList, zoneIdList = [], [] neig_list = neigbours(iPos) for voisin in neig_list: size, id = sizeZone(voisin, zones) sizeList.append(size) zoneIdList.append(id) aPlayerCount = feedPlayercount() aAccurate = getAccurate(neig_list, sizeList, zoneIdList, aPlayerCount) bestNeighSize = getMax(aAccurate) count = aAccurate.count(bestNeighSize) print >> sys.stderr, "zoneSize", bestNeighSize, "index", aAccurate.index(bestNeighSize) print >> sys.stderr, "Best neighbor", neig_list[aAccurate.index(bestNeighSize)] if bestNeighSize > 0: if count == 1: return getDirection(iPos, neig_list[aAccurate.index(bestNeighSize)]), False else: aIncrX, aIncrY = getIncrement(previous) if sizeZone((iPos[0]+aIncrX, iPos[1]+aIncrY), zones) == bestNeighSize and aAccurate.count(0)+count != 4: return previous, False if isPosSafe(iPos[0] + incrX, iPos[1]) : if isPosSafe(iPos[0] + incrX, iPos[1] + incrY): return direction, False else: if isPosSafe(iPos[0], iPos[1] + incrY): return oord, False else: return direction, False else: if countFree(iPos) == 0: print >> sys.stderr, "We are stuck, processing alternatives" way = getWay(iPos) if way: print >> sys.stderr, "We found a risky way" return way, False if isPosSafe(iPos[0], iPos[1] + incrY): return oord, False else: go = oord if isPosSafe(iPos[0], iPos[1] - incrY): go = 'UP' if oord == 'UP': go = 'DOWN' return go, False else: aIncrX, aIncrY = getIncrement(direction) print >> sys.stderr, "Pos", iPos[0], iPos[1], "newPos", iPos[0]+aIncrX, iPos[1]+aIncrY if isWall(iPos[0]+aIncrX, iPos[1]+aIncrY): return direction, True else: print >> sys.stderr, "We are stuck, but can't shoot" return direction, False player_count = int(raw_input())my_id = int(raw_input())# game loopwhile 1: current_positions = [] helper_bots = int(raw_input()) for i in xrange(player_count): x, y = [int(j) for j in raw_input().split()] if (x, y) == (-1, -1): continue update_map(i,(x,y), global_map) if i == my_id: myPos = (x, y) else: current_positions.append((x, y)) if turn == 0: oord, direction = closestObstacle(myPos) removal_count = int(raw_input()) for i in xrange(removal_count): remove_x, remove_y = [int(j) for j in raw_input().split()] zones = get_zones() print >> sys.stderr, "Nombre de zones:", len(zones) # Write an action using print # To debug: print >> sys.stderr, "Debug messages..." # A single line with UP, DOWN, LEFT or RIGHT if len(current_positions)!=1: #if in the same zone: if len(zones)==1 or areSameZone(current_positions[0], myPos, zones): print >> sys.stderr, "working" #start using 1v1 strategy #else: direction, deploy = fill(myPos, direction) else: direction, deploy = fill(myPos, direction) if deploy : print 'DEPLOY' else: print direction turn += 1