PDA

View Full Version : [python] break cicli annidati


Krat0s
05-10-2017, 19:37
Ciao a tutti. Ho ripreso da pochissimo a programmare (ho poche basi di un esame universitario in c++) ed un mio amico mi ha consigliato python.

Vi espongo brevemente il problema: sto provando a fare questi esercizi http://adventofcode.com/2016 ma mi sono incagliato al secondo del primo giorno. Quello che non riesco a fare (a parte l'esercizio in sč) č uscire contemporaneamente da pių cicli for annidati.

Ci sono sopra da un'oretta e qualcosa non va, vi posto dove sono arrivato al momento:

percorso=input('Inserire percorso: ' )
percorso_list=percorso.split(', ')
#nord = 0, est = 1, sud = 2, ovest = 3
coordinate=[0,0]
direzione=0
posizioni_visitate=[]
for i in range(0,len(percorso_list)):
cambio_dir=percorso_list[i][0]
cammino=int(percorso_list[i][1:len(percorso_list[i])])
if cambio_dir == 'L':
direzione=(direzione-1)%4
else:
direzione=(direzione+1)%4
for j in range(0, cammino):
posizioni_visitate.append(coordinate)
if direzione == 0:
coordinate[1]+=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k]==coordinate:
break
if direzione == 1:
coordinate[0]+=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k]==coordinate:
break
if direzione == 2:
coordinate[1]-=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k]==coordinate:
break
if direzione == 3:
coordinate[0]-=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k]==coordinate:
break
else:
continue
break
else:
continue
break
distanza=abs(coordinate[0])+abs(coordinate[1])
print('La distanza totale č: '+str(distanza))

Se dovesse servire, provo a spiegare l'esercizio:
Sono in una griglia (https://en.wikipedia.org/wiki/Taxicab_geometry) sul punto (0,0) guardando verso nord.
Mi vengono dati dei comandi del tipo:
L2 = gira di 90° a sinistra e vai avanti di 2
R4 = gira di 90° a destra e vai avanti di 4
Io, data una serie di comandi, devo dire la distanza del primo punto su cui passo due volte rispetto al punto di partenza

"For example, if your instructions are R8, R4, R4, R8, the first location you visit twice is 4 blocks away, due East.

How many blocks away is the first location you visit twice?"

Grazie mille a chi mi darā una mano :D

Edit: risolto con un po' di prove. Se qualcuno vuole consigliarmi su come scrivere il codice in maniera pių pulita, metto qui la versione "finale":

percorso=input('Inserire percorso: ' )
percorso_list=percorso.split(', ')
#nord = 0, est = 1, sud = 2, ovest = 3
coordinate=[0,0]
direzione=0
posizioni_visitate=[]
for i in range(0,len(percorso_list)):
cambio_dir=percorso_list[i][0]
cammino=int(percorso_list[i][1:len(percorso_list[i])])
if cambio_dir == 'L':
direzione=(direzione-1)%4
else:
direzione=(direzione+1)%4
for j in range(0, cammino):
posizioni_visitate.append(str(coordinate[0]) + ',' + str(coordinate[1]))
if direzione == 0:
coordinate[1]+=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k] == str(coordinate[0]) + ',' + str(coordinate[1]):
break
else:
continue
break
if direzione == 1:
coordinate[0]+=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k] == str(coordinate[0]) + ',' + str(coordinate[1]):
break
else:
continue
break
if direzione == 2:
coordinate[1]-=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k] == str(coordinate[0]) + ',' + str(coordinate[1]):
break
else:
continue
break
if direzione == 3:
coordinate[0]-=1
for k in range(0,len(posizioni_visitate)):
if posizioni_visitate[k] == str(coordinate[0]) + ',' + str(coordinate[1]):
break
else:
continue
break
else:
continue
break
distanza=abs(coordinate[0])+abs(coordinate[1])
print('La distanza totale č: '+str(distanza))

Xfree
06-10-2017, 15:35
Qualcosa cosė senza complicare troppo.


import unittest

def shortest_path(percorso):
# nord = 0, est = 1, sud = 2, ovest = 3
coordinate = [0, 0]
direzione = 0
posizioni_visitate = set()
coordinates = ((0, 1),
(1, 0),
(0, -1),
(-1, 0)
)
for movimento in [x.strip() for x in percorso.split(',')]:
cambio_dir, cammino = movimento[0], int(movimento[1:])
if cambio_dir == 'L':
direzione = (direzione - 1) % 4
else:
direzione = (direzione + 1) % 4
for _ in range(cammino):
posizioni_visitate.add(str(coordinate[0]) + ',' + str(coordinate[1]))
coordinate[0] += coordinates[direzione][0]
coordinate[1] += coordinates[direzione][1]
if str(coordinate[0]) + ',' + str(coordinate[1]) in posizioni_visitate:
break
return abs(coordinate[0]) + abs(coordinate[1])


class TestSolution(unittest.TestCase):
def test_shortest_path_a(self):
paths = ('R2, L3', 5)
path, expected_length = paths
self.assertEqual(shortest_path(path), expected_length)

def test_shortest_path_b(self):
paths = ('R2, R2, R2', 2)
path, expected_length = paths
self.assertEqual(shortest_path(path), expected_length)

def test_shortest_path_c(self):
paths = ('R5, L5, R5, R3', 12)
path, expected_length = paths
self.assertEqual(shortest_path(path), expected_length)

def test_shortest_path_d(self):
paths = ('R8, R4, R4, R8', 4)
path, expected_length = paths
self.assertEqual(shortest_path(path), expected_length)


if __name__ == '__main__':
unittest.main()