Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Bender le robot depressif
- class Dir :
- names = [ 'SOUTH', 'EAST', 'NORTH', 'WEST' ]
- deltax = [ 0, 1, 0, -1 ]
- deltay = [ 1, 0, -1, 0]
- inverse = 0
- actuel = 0
- reset = 1
- def tourne(self) :
- if self.reset == 1 :
- self.reset = 0
- if self.inverse == 0 :
- self.actuel = 0
- else :
- self.actuel = 3
- else :
- if self.inverse == 0 :
- self.actuel += 1
- if self.actuel > 3 : self.actuel = 0
- else :
- self.actuel -= 1
- if self.actuel < 0 : self.actuel = 3
- def mvt(self,point) :
- x = point.x + self.deltax[self.actuel]
- y = point.y + self.deltay[self.actuel]
- return Point(x,y)
- def inverser(self) :
- self.inverse = 1 - self.inverse
- class Point :
- def __init__(self,x,y) :
- self.x = x
- self.y = y
- def cmp(self,pt) :
- return self.x == pt.x and self.y == pt.y
- class Carte :
- carte = []
- teleport = []
- def __init__(self,x,y) :
- C = x
- L = y
- def terrain(self,pos) :
- return self.carte[pos.y][pos.x]
- def replace(self,pos,char) :
- self.carte[pos.y][pos.x] = char
- class Logelt :
- def __init__(self,robot) :
- self.pt = robot.pos
- self.direction = robot.d.actuel
- self.inverse = robot.d.inverse
- self.casseur = robot.casseur
- self.casses = robot.casses
- def cmp(self,l) :
- 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
- def deja(self,tab) :
- for i in tab :
- if self.cmp(i) : return 1
- return 0
- class Robot :
- log = []
- casseur = 0
- casses = 0
- arrive = 0
- loop = 0
- def __init__(self):
- self.d = Dir()
- self.pos = carte.depart
- def mvt(self) :
- pt = self.d.mvt(self.pos)
- t = carte.terrain(pt)
- #print t + str(pt.x) + " " + str(pt.y)
- if t == ' ' :
- self.bouge(pt)
- elif t == '#' :
- self.d.tourne()
- elif t == 'X' :
- if self.casseur == 1 :
- self.bouge(pt)
- self.casses += 1
- carte.replace(self.pos," ")
- else :
- self.d.tourne()
- elif t == 'B' :
- self.casseur = 1 - self.casseur
- self.bouge(pt)
- elif t == 'I' :
- self.d.inverser()
- self.bouge(pt)
- elif t == "$" :
- self.bouge(pt)
- self.arrive = 1
- elif t == "T" :
- i = 0
- if pt.cmp(carte.teleport[0]) : i = 1
- self.bouge(carte.teleport[i])
- elif t == "E" :
- self.bouge(pt)
- self.d.actuel = 1
- elif t == "S" :
- self.bouge(pt)
- self.d.actuel = 0
- elif t == "W" :
- self.bouge(pt)
- self.d.actuel = 3
- elif t == "N" :
- self.bouge(pt)
- self.d.actuel = 2
- def bouge(self,pt) :
- self.pos = pt
- l = Logelt(self)
- if l.deja(self.log) :
- self.loop = 1
- return
- self.log.append(l)
- self.d.reset = 1
- #print self.d.names[self.d.actuel]
- # init carte
- y,x = raw_input().split(' ')
- carte = Carte(int(x),int(y))
- for i in xrange(int(y)) :
- t = raw_input()
- carte.carte.append(list(t))
- s = t.find('@')
- if s != -1 : carte.depart = Point(s,i)
- s = t.find('$')
- if s != -1 : carte.arrivee = Point(s,i)
- x = 0
- for c in t :
- if c == "T" :
- carte.teleport.append(Point(x,i))
- x += 1
- robot = Robot()
- i = 0
- while robot.arrive == 0 and robot.loop == 0 and i < 10000 :
- robot.mvt()
- i += 1
- if robot.loop == 1 :
- print "LOOP"
- else :
- for l in robot.log :
- print robot.d.names[l.direction]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement