Advertisement
tox46

es3

Nov 21st, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.41 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. '''
  3. Una regione e' stata suddivisa concettualmente in quadrati adiacenti.
  4. Ogni  quadrato della griglia risultante e' univocamente identificato da una
  5. coppia di interi positivi (x,y) ad indicare che il quadrato appartiene alla x-ma colonna
  6. e y-ma riga della griglia, CON IL QUADRATO (1,1) SITUATO IN BASSO A SINISTRA (ATTENZIONE!).
  7.  
  8. Disponiamo di robottini in grado di muoversi tra i quadrati della griglia ma solo in
  9. orizzontale (da sinistra verso destra) e verticale (dal basso verso l'alto).
  10. Uno spostamento del robottino viene indicato da un intero A (positivo o negativo).
  11. Se il robottino si trova nel quadratino di coordinate (x,y):
  12. -  l'intero +A positivo indica uno spostamento in verticale fino al quadrato (x,y+|A|)
  13. -  l'intero -A negativo indica uno spostamento in orizzontale della griglia fino al quadrato (x+|A|,y)
  14. Una sequenza di interi (positivi o negativi) indica dunque un percorso del robottino.
  15. Ad esempio se il robottino e' nel quadrato (1,1), la sequenza 5,-2,-2,2,-4 lo porta nel quadrato (9,8).
  16.  
  17. Ci vengono forniti un insieme I di quadrati della griglia indicati dalle loro coordinate (x,y)
  18. e due percorsi di due robottini, che partono entrambi dal quadrato (1,1) e terminano in uno stesso quadrato.
  19. Il primo percorso comincia con un numero positivo, il secondo con un numero negativo
  20. e il quadrato iniziale e quello finale sono gli unici quadrati che i due percorsi hanno in comune.
  21. Vogliamo sapere quanti dei quadrati dell'insieme I ricadono nella zona circoscritta dai due percorsi.
  22. Nota che un quadrato (x,y) e' nella zona circoscritta se i due robottini  
  23. attraversano la colonna x della griglia e i quadrati di quella colonna attraversati
  24. dai due robottini  sono rispettivamente (x,y1) ed (x,y2) con y1>y>y2).
  25. (quindi i quadrati di I che si trovano sui percorsi NON vanno contati)
  26.  
  27. Ad esempio per per l'insieme
  28.    I={ (11, 2), (8,5), (4,6), (7,1), (2,9), (3,4), (7,6), (6,6), (5,2)}
  29. e i due percorsi:
  30.    p1 =  5 -2 -2 2 -4
  31.    p2 = -3  2 -5 5
  32. Ovvero (indicando con '+' i movimenti con A positivo, con '-' quelli con A negativo,
  33.        con '*' i quadrati di I, con 'o' l'origine e con 'X' la destinazione)
  34.    y
  35.    ^
  36.  11|
  37.  10|
  38.   9| *
  39.   8|    +---X
  40.   7|    +   +
  41.   6|+--*-** +
  42.   5|+      *+
  43.   4|+ *     +
  44.   3|+  +-----
  45.   2|+  +*     *
  46.   1|o---  *
  47.    |_______________________>x
  48.              11111111112
  49.     12345678901234567890
  50.  
  51. la risposta e' 4 perche' gli unici quadrati che ricadono nella zona circoscritta sono
  52. {(3, 4), (6, 6), (7, 6), (8, 5)}
  53.  
  54. Scrivere una funzione es3(fmappa) che prende in input  il percorso del file di testo contenente
  55. i percorsi dei due robottini e l'insieme dei quadrati I e restituisce il numero di quadrati
  56. dell'insieme I che risultano circoscritti dai due percorsi.
  57.  
  58. I dati sono organizzati  nel file come segue:
  59. - una serie di righe vuote
  60. - il percorso del primo robottino ( ciascuno spostamento del percorso
  61.  separato dal successivo da spazi e il tutto in una o piu' righe consecutive)
  62. - una serie di righe vuote
  63. - il percorso del secondo  robottino ( ciascuno spostamento del percorso
  64.  separato dal successivo da spazi e il tutto in una o piu' righe consecutive)
  65. - una serie di righe vuote
  66. - una sequenza di coppie (x,y) che indicano i quadrati dell'insieme (le coppie separate
  67. da virgole e spazi ed in una o piu' righe consecutive)
  68. - una serie di righe vuote
  69.  
  70. Si veda ad esempio il file mp1.txt
  71.  
  72. NOTA: il timeout previsto per questo esercizio è di 1 secondo per ciascun test.
  73.  
  74. ATTENZIONE: quando caricate il file assicuratevi che sia nella codifica UTF8
  75. (ad esempio editatelo dentro Spyder)'''
  76.        
  77. import operator  
  78.  
  79. def es3(fmappa):
  80.     '''Implementare la funzione qui'''
  81.     var,enable, p1,p2,q,ins1,ins2=True,False,'','','',[],[]
  82.    
  83.      #Apertura del file e lettura dati
  84.     with open(fmappa, 'r') as file:
  85.         t=file.read()
  86.         t=t.split('\n')
  87.    
  88.     #Traduzione file da lista di stringhe in p1-p2-q    
  89.     for r in t:
  90.        
  91.         if r=='':
  92.             if var or enable==True:
  93.                 continue
  94.             else:
  95.                 enable=True
  96.                
  97.         elif r[0].isnumeric() or r[0]=='-':
  98.             var=False
  99.             if enable:
  100.                 p2+=r
  101.             else:
  102.                 p1+=r
  103.                
  104.         else:
  105.             q+=r.replace(' ','')
  106.            
  107.     #Traduzione di q in una lista di tuple (x,y)
  108.     r=[]        
  109.     for t in q[1:-1].split( '),(' ):
  110.         r.append(tuple(map(int, t.split(','))))
  111.     r.sort(key=operator.itemgetter(1))  
  112.    
  113.    
  114.    
  115.     ins0=set()
  116.     for n in r:
  117. #        if n[1] not in ins0:
  118.             ins0.add(n)
  119.     ins0.discard(1)
  120. #    l0=list(ins0)
  121.    
  122.     #creazione dei percorsi e update degli insiemi
  123.     x1,y1,n,enable=1,1,0,False
  124.     for i in p1:
  125.         if i==' ':
  126.             enable=False
  127.        
  128.         elif i=='-':
  129.             enable=True
  130.            
  131.         else:
  132.             if not enable:
  133.                 #numero positivo
  134. #                while y1 <= l0[n] <= y1+int(i):
  135. #                    if y < l0[n] < y+int(i):
  136. #                        ins1.add((x,l0[n]))
  137. #                   n+=1
  138.                 y1+=int(i)
  139.                 ins1.append((x1,y1))
  140.             else:
  141.                 #numero negativo
  142.                 x1+=int(i)
  143.            
  144.     x1,y1,n,enable=1,1,0,False
  145.     for i in p2:
  146.         if i==' ':
  147.             enable=False
  148.        
  149.         elif i=='-':
  150.             enable=True
  151.            
  152.         else:
  153.             if not enable:
  154.                 #numero positivo
  155. #                while y1 <= l0[n] <= y1+int(i):
  156. #                    if y1 < l0[n] < y1+int(i):
  157. #                        ins2.add((x1,l0[n]))
  158. #                    n+=1
  159.                 y1+=int(i)
  160.                 ins2.append((x1,y1))
  161.             else:
  162.                 #numero negativo
  163.                 x1+=int(i)
  164.            
  165.     c,n,n1=0,0,0
  166.     maxx=ins1[-1] if ins1[-1]<ins2[-1] else ins2[-1]
  167.     for p in ins0:
  168.         #se è nei bordi massimi del rettangolo associato
  169.         if p[1]!= 1 and p[0]<maxx[0] and p[1]<maxx[1]:
  170.             #aggiusta le coordinate delle y
  171.             while p[1]<ins1[n][1] and n<len(ins1):
  172.                 n+=1
  173.             while p[1]<ins2[n1][1] and n1<len(ins2):
  174.                 n1+=1
  175.             if ins1[n][[0] < p[0] < ins2[n1][0] or ins2[n1][0] < p[0] < ins1[n][0]:
  176.                 c=c+1
  177.    
  178.     return c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement