Advertisement
Guest User

Bender le robot dépressif - Codingame - entrainement LJF

a guest
Nov 24th, 2013
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.79 KB | None | 0 0
  1. # Bender le robot depressif
  2.  
  3. class Dir :
  4.    names = [ 'SOUTH', 'EAST', 'NORTH', 'WEST' ]
  5.    deltax = [ 0, 1, 0, -1 ]
  6.    deltay = [ 1, 0, -1, 0]
  7.  
  8.    inverse = 0
  9.    actuel = 0
  10.    reset = 1
  11.  
  12.    def tourne(self) :
  13.       if self.reset == 1 :
  14.          self.reset = 0
  15.          if self.inverse == 0 :
  16.             self.actuel = 0
  17.          else :
  18.             self.actuel = 3
  19.       else :
  20.          if self.inverse == 0 :
  21.             self.actuel += 1
  22.             if self.actuel > 3 : self.actuel = 0
  23.          else :
  24.             self.actuel -= 1
  25.             if self.actuel < 0 : self.actuel = 3
  26.  
  27.    def mvt(self,point) :
  28.       x = point.x + self.deltax[self.actuel]
  29.       y = point.y + self.deltay[self.actuel]
  30.       return Point(x,y)
  31.  
  32.    def inverser(self) :
  33.       self.inverse = 1 - self.inverse
  34.  
  35. class Point :
  36.    def __init__(self,x,y) :
  37.       self.x = x
  38.       self.y = y
  39.  
  40.    def cmp(self,pt) :
  41.       return self.x == pt.x and self.y == pt.y
  42.  
  43. class Carte :
  44.    carte = []
  45.    teleport = []
  46.  
  47.    def __init__(self,x,y) :
  48.       C = x
  49.       L = y
  50.  
  51.    def terrain(self,pos) :
  52.       return self.carte[pos.y][pos.x]
  53.  
  54.    def replace(self,pos,char) :
  55.       self.carte[pos.y][pos.x] = char
  56.  
  57. class Logelt :
  58.    def __init__(self,robot) :
  59.       self.pt = robot.pos
  60.       self.direction = robot.d.actuel
  61.       self.inverse = robot.d.inverse
  62.       self.casseur = robot.casseur
  63.       self.casses = robot.casses
  64.  
  65.    def cmp(self,l) :
  66.         return self.pt.cmp(l.pt) and self.direction == l.direction and self.inverse == l.inverse and self.casseur == l.casseur and self.casses == l.casses
  67.  
  68.    def deja(self,tab) :
  69.       for i in tab :
  70.          if self.cmp(i) : return 1
  71.  
  72.       return 0
  73.  
  74. class Robot :
  75.  
  76.    log = []
  77.    casseur = 0
  78.    casses = 0
  79.    arrive = 0
  80.    loop = 0
  81.  
  82.    def __init__(self):
  83.       self.d = Dir()
  84.       self.pos = carte.depart
  85.  
  86.    def mvt(self) :
  87.       pt = self.d.mvt(self.pos)
  88.       t = carte.terrain(pt)
  89.       #print t  + str(pt.x) + " " +  str(pt.y)
  90.  
  91.       if t == ' ' :
  92.          self.bouge(pt)
  93.       elif t == '#' :
  94.          self.d.tourne()
  95.       elif t == 'X' :
  96.          if self.casseur == 1 :
  97.             self.bouge(pt)
  98.             self.casses += 1
  99.             carte.replace(self.pos," ")
  100.          else :
  101.             self.d.tourne()
  102.       elif t == 'B' :
  103.          self.casseur = 1 - self.casseur
  104.          self.bouge(pt)
  105.       elif t == 'I' :
  106.          self.d.inverser()
  107.          self.bouge(pt)
  108.       elif t == "$" :
  109.          self.bouge(pt)
  110.          self.arrive = 1
  111.       elif t == "T" :
  112.          i = 0
  113.          if pt.cmp(carte.teleport[0]) : i = 1
  114.          self.bouge(carte.teleport[i])
  115.       elif t == "E" :
  116.          self.bouge(pt)
  117.          self.d.actuel = 1
  118.       elif t == "S" :
  119.          self.bouge(pt)
  120.          self.d.actuel = 0
  121.       elif t == "W" :
  122.          self.bouge(pt)
  123.          self.d.actuel = 3
  124.       elif t == "N" :
  125.          self.bouge(pt)
  126.          self.d.actuel = 2
  127.  
  128.    def bouge(self,pt) :
  129.       self.pos = pt
  130.       l = Logelt(self)
  131.  
  132.       if l.deja(self.log) :
  133.          self.loop = 1
  134.          return
  135.  
  136.       self.log.append(l)
  137.       self.d.reset = 1
  138.  
  139.       #print self.d.names[self.d.actuel]
  140.  
  141.  
  142. # init carte
  143. y,x = raw_input().split(' ')
  144. carte = Carte(int(x),int(y))
  145. for i in xrange(int(y)) :
  146.    t = raw_input()
  147.    carte.carte.append(list(t))
  148.  
  149.    s = t.find('@')
  150.    if s != -1 : carte.depart = Point(s,i)
  151.  
  152.    s = t.find('$')
  153.    if s != -1 : carte.arrivee = Point(s,i)
  154.  
  155.    x = 0
  156.    for c in t :
  157.       if c == "T" :
  158.          carte.teleport.append(Point(x,i))
  159.       x += 1
  160.  
  161. robot = Robot()
  162.  
  163. i = 0
  164. while robot.arrive == 0 and robot.loop == 0 and i < 10000 :
  165.    robot.mvt()
  166.    i += 1
  167.  
  168. if robot.loop == 1 :
  169.    print "LOOP"
  170. else :
  171.    for l in robot.log :
  172.       print robot.d.names[l.direction]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement