import time
import sys

class radna_traka:
	radna_traka = []
	def __init__(self):
		"""radna_traka ts"""


	def inicijaliziraj (self):
		br = 0
		string = ''
		flab = open('datoteka','r')
		self.string =''
		for line in flab:
			line = line[:-1]
			for znak in line:
				self.radna_traka.append(znak)
		return self.radna_traka

class simulacija(radna_traka):
	
	def __init__(self):
		"""simulacija labirinta"""
		self.glava = 0
		self.zapisi = ''
		self.fp = {}
		self.koraci= []
		self.brojac = 0
		self.stanje = 'q0'
		self.znak = ''
		self.pomocni= []
		self.stog =[]

	def ispisi(self):
		brojac = 8
		string = ''
		for znak in self.radna_traka:
			string = string + znak
			brojac = brojac -1
			if brojac == 0:
				print string
				string = ''
				brojac = 8
	def prijelazi(self):
       
	        self.fp['q0','!']= [('q0','!','R')]
                self.fp['q0','#']= [('q0','#','R')]
                self.fp['q0','P']= [('q1','P','R'),('q2','P','L'),('q3','P','D'),('q4','P','U')]
                self.fp['q0','-']= [('q0','-','R')]
                self.fp['q1','!']= [('qe','!','L')]
                self.fp['q1','#']= [('qe','#','L')]
                self.fp['q1','-']= [('qdr','-','L')]
                self.fp['q1','K']= [('qkrr','K','L')]
                self.fp['q1','R']= [('qe','R','L')]
                self.fp['q1','L']= [('qe','L','L')]
                self.fp['q1','U']= [('qe','U','L')]
                self.fp['q1','D']= [('qe','D','L')]
                self.fp['q2','!']= [('qe','!','R')]
                self.fp['q2','#']= [('qe','#','R')]
                self.fp['q2','-']= [('qdl','-','R')]
                self.fp['q2','K']= [('qkrl','K','R')]
                self.fp['q2','R']= [('qe','R','R')]
                self.fp['q2','L']= [('qe','L','R')]
                self.fp['q2','U']= [('qe','U','R')]
                self.fp['q2','D']= [('qe','D','R')]
                self.fp['q3','!']= [('qe','!','U')]
                self.fp['q3','#']= [('qe','#','U')]
                self.fp['q3','-']= [('qdd','-','U')]
                self.fp['q3','K']= [('qkrd','K','U')]
                self.fp['q3','R']= [('qe','R','U')]
                self.fp['q3','L']= [('qe','L','U')]
                self.fp['q3','U']= [('qe','U','U')]
                self.fp['q3','D']= [('qe','D','U')]
                self.fp['q4','!']= [('qe','!','D')]
                self.fp['q4','#']= [('qe','#','D')]
                self.fp['q4','-']= [('qdu','-','D')]
                self.fp['q4','K']= [('qkru','K','D')]
                self.fp['q4','R']= [('qe','R','D')]
                self.fp['q4','L']= [('qe','L','D')]
                self.fp['q4','U']= [('qe','U','D')]
                self.fp['q4','D']= [('qe','D','D')]
                self.fp['qdr','-']= [('q-','R','R')]
                self.fp['qdl','-']= [('q-','L','L')]
		self.fp['qdd','-']= [('q-','D','D')]
                self.fp['qdu','-']= [('q-','U','U')]
		self.fp['q-','!']=[('qe','L','L')]
		self.fp['q-','R']=[('qe','L','L')]
		self.fp['q-','L']=[('qe','L','L')]
		self.fp['q-','U']=[('qe','L','L')]
		self.fp['q-','D']=[('qe','L','L')]
		self.fp['q-','#']=[('qe','L','L')]
                self.fp['q-','-']= [('q1','-','R'),('q2','-','L'),('q3','-','D'),('q4','-','U')]
                self.fp['qkrr','-']=['qkraj','R','R']
                self.fp['qkrl','-']=['qkraj','L','L']
                self.fp['qkru','-']=['qkraj','U','U']
                self.fp['qkrd','-']=['qkraj','D','D']

			
	def simuliraj(self):
		m=[]
		for znak in self.radna_traka:
			if (self.stanje,znak) in self.fp.keys():
				if znak == 'P':
					print 'NASAO SAM P'
					self.glava = self.radna_traka.index('P')
					print 'GLAVA', self.glava
					m= self.fp[self.stanje,znak]
					for dio in m:
						self.pomocni.append(dio)
				else:
					print self.fp[self.stanje,znak]
					m= self.fp[self.stanje,znak]
					for x in m:
						novo_stanje = x[0]
						smjer = x[2]
			self.stanje = novo_stanje
			if znak =='P':
				print 'IDEM DALJE'
				time.sleep(1)
				break
		koraci=[]
		stog=[]

		for znak in self.pomocni:
			self.stanje = znak[0]
			nznak = znak[1]
			pomak = znak[2]
			
			if pomak == 'L':
				del koraci[:]
				self.glava = self.radna_traka.index('P')
				self.glava = self.glava -1
				sign = self.radna_traka[self.glava]
				self.fp[self.stanje,sign]
				l= self.fp[self.stanje,sign][0]
				self.stanje = l[0]
				self.smjer = l[2]
				if self.stanje =='qe':
					pass
				else :
					koraci.append (self.glava)
					koraci.append (self.stanje)
					koraci.append (self.smjer)
					if koraci != []:
						stog.append(koraci[:])
			
			if pomak == 'R':
				del koraci[:]
				self.glava = self.radna_traka.index('P')
                                self.glava = self.glava +1
                                sign = self.radna_traka[self.glava]
                                self.fp[self.stanje,sign]
                                l= self.fp[self.stanje,sign][0]
                                self.stanje = l[0]
                                self.smjer = l[2]
                                if self.stanje =='qe':
					pass
                                 
                                else :
                                        koraci.append (self.glava)
                                        koraci.append (self.stanje)
                                        koraci.append (self.smjer)
					if koraci != []:
						stog.append (koraci[:])
			if pomak == 'U':
				del koraci[:]
                                self.glava = self.radna_traka.index('P')
                                self.glava = self.glava -8
                                sign = self.radna_traka[self.glava]
                                self.fp[self.stanje,sign]
                                l= self.fp[self.stanje,sign][0]
                                self.stanje = l[0]
                                self.smjer = l[2]
          
                                if self.stanje =='qe':
                                       pass
                                else :
                                        koraci.append (self.glava)
                                        koraci.append (self.stanje)
                                        koraci.append (self.smjer)
					if koraci != []:
						stog.append (koraci[:])

                          
				
                        if pomak == 'D':
				del koraci[:]
                                self.glava = self.radna_traka.index('P')
                                self.glava = self.glava +8
                           
                                sign = self.radna_traka[self.glava]
                                self.fp[self.stanje,sign]
                         
                                l= self.fp[self.stanje,sign][0]
                                self.stanje = l[0]
                                self.smjer = l[2]
                     
                                if self.stanje =='qe':
                                       pass
                                else :
                                        koraci.append (self.glava)
                                        koraci.append (self.stanje)
                                        koraci.append (self.smjer)
					if koraci != []:
						stog.append(koraci[:])
	
                           
				break
		
		while self.stanje not in ['qkrr','qkru','qkrl','qkru'] or len(stog)>0:
			if len(stog) == 0:
				break
			self.element = stog.pop()
			self.glava = self.element[0]
			self.stanje = self.element[1]
			self.pomak = self.element[2]
			znak = self.radna_traka[self.glava]
			if znak == '-':# ovdje ne moram provjeravati broj jer znam da ce mi se sigurno pomaknuti samo za jedan element			
				self.zapisi = '-'
				if self.pomak =='R':
					self.pomak_desno()
				if self.pomak =='L':
					self.pomak_lijevo()
				if self.pomak =='U':
					self.pomak_gore()
				if self.pomak =='D':
					self.pomak_dolje()
				self.ispisi()	
				m= self.fp[self.stanje,znak][0]
				novo_stanje = m[0]
				self.zapisi = m[1]
				pomak = m[2]
				if pomak == 'R':
					self.pomak_desno()
				if pomak =='L':
					self.pomak_lijevo()
				if pomak == 'D':
					self.pomak_dolje()
				if pomak =='U':
					self.pomak_gore()
				self.ispisi()
				self.stanje = novo_stanje
				self.znak = self.radna_traka[self.glava]
				GLAVURDA = self.glava
			self.lista = self.fp[self.stanje, self.znak]
			print self.lista

			
			for znak in self.lista:
				del koraci[:]
	                        self.stanje = znak[0]
	                        nznak = znak[1]
	                        pomak = znak[2]
        	         
                	        if pomak == 'L':
                        	        self.glava = GLAVURDA
                                	self.glava = self.glava -1
					print 'TRAKA:',self.radna_traka
					print 'GLAVA:',self.glava, self.radna_traka[self.glava]
                                	sign = self.radna_traka[self.glava]
                                	self.fp[self.stanje,sign]
                                	print 'prijelaz:',self.fp[self.stanje,sign]
                                	l= self.fp[self.stanje,sign][0]
                                	self.stanje = l[0]
                                	self.smjer = l[2]
					if self.stanje == 'qkrl':
						print 'NASAO SAM RJESENJE'
						self.glava= self.glava +1
						self.zapisi = 'L'
						self.pomak= 'L'
						self.pomak_lijevo()
						print self.fp[self.stanje,'-']
						self.ispisi()
						sys.exit()

                         
                                	if self.stanje =='qe'or self.radna_traka[self.glava]!='-':
                                        	pass
                                	else :
                                        	koraci.append (self.glava)
                                        	koraci.append (self.stanje)
                                        	koraci.append (self.smjer)
                                        	stog.append(koraci[:])
                       
			
                        	if pomak == 'R':
                                	self.glava = GLAVURDA
                                	self.glava = self.glava +1
					print 'TRAKA',self.radna_traka
					print 'GLAVA',self.glava, self.radna_traka[self.glava]
                                	sign = self.radna_traka[self.glava]
                                	self.fp[self.stanje,sign]
                                	print 'prijelaz',self.fp[self.stanje,sign]
                                	l= self.fp[self.stanje,sign][0]
                                	self.stanje = l[0]
                                	self.smjer = l[2]
					if self.stanje == 'qkrr':
						print 'NASAO SAM RJESENJE'
						self.zapisi= 'R'
						self.glava = self.glava -1
						self.pomak_desno()
						print self.fp[self.stanje,'-']
						self.ispisi()
						sys.exit()

                                	if self.stanje =='qe'or self.radna_traka[self.glava]!='-':
                                      		pass 
                                	else :
                                        	koraci.append (self.glava)
                                        	koraci.append (self.stanje)
                                        	koraci.append (self.smjer)
                                                stog.append (koraci[:])
                           	   
   

				if pomak == 'U':
                                	self.glava = GLAVURDA
                                	self.glava = self.glava -8
					print 'TRAKA',self.radna_traka
                                	print 'GLAVA',self.glava, self.radna_traka[self.glava]
                                	sign = self.radna_traka[self.glava]
                                	self.fp[self.stanje,sign]
                                	print 'prijelaz',self.fp[self.stanje,sign]
                                	l= self.fp[self.stanje,sign][0]
                                	self.stanje = l[0]
                                	self.smjer = l[2]
					if self.stanje == 'qkru':
						print 'NASAO SAM RJESENJE'
						self.glava = self.glava +8
						self.zapisi ='U'
						self.pomak ='U'
						print self.fp[self.stanje,'-']
						self.pomak_gore()
						self.ispisi()
						sys.exit()

                           
                                	if self.stanje =='qe' or self.radna_traka[self.glava]!='-':
                                       		pass
                                	else :
                                        	koraci.append (self.glava)
                                        	koraci.append (self.stanje)
                                        	koraci.append (self.smjer)
                                                stog.append (koraci[:])
                               
               

				if pomak == 'D':
                                	self.glava = GLAVURDA
                                	self.glava = self.glava +8
					print 'TRAKA',self.radna_traka
                                	print 'GLAVA',self.glava, self.radna_traka[self.glava]
                                	sign = self.radna_traka[self.glava]
                                	self.fp[self.stanje,sign]
                                	print 'prijelaz',self.fp[self.stanje,sign]
                                	l= self.fp[self.stanje,sign][0]
                                	self.stanje = l[0]
                                	self.smjer = l[2]
					if self.stanje == 'qkrd':
						print 'NASAO SAM RJESENJE'
						self.glava = self.glava - 8
						self.zapisi ='D'
						self.pomak ='D'
						print self.fp[self.stanje,'-']
						self.pomak_gore()
						self.ispisi()
						sys.exit()
                               
                                	if self.stanje =='qe'or self.radna_traka[self.glava]!='-':
                                       		pass
                                	else :
                                        	koraci.append (self.glava)
                                       		koraci.append (self.stanje)
                                        	koraci.append (self.smjer)
                                                stog.append(koraci[:])



			self.ispisi()
			time.sleep(1)
		print 'NEMA RJESENJA U LABIRINTU'


        def pomak_lijevo(self):
                self.radna_traka[self.glava]=self.zapisi
                self.glava= self.glava - 1

        def pomak_desno (self):
                self.radna_traka[self.glava]= self.zapisi
                self.glava = self.glava +1

        def pomak_gore (self):
                self.radna_traka[self.glava]= self.zapisi
                self.glava = self.glava - 8
		lista = self.radna_traka[self.glava + 8: self.glava]

        def pomak_dolje(self):
                self.radna_traka[self.glava]= self.zapisi
                self.glava = self.glava + 8
		

				
ul= radna_traka()
x=[]
x= ul.inicijaliziraj()
print x
sim = simulacija()
sim.ispisi()
sim.prijelazi()
sim.simuliraj()
	

