Do you need any help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

Problemi HW6

D
Diego Voltolini (580 points)
8 9 11
asked Dec 1, 2019 in HW6 obbligatorio by Diego Voltolini (580 points)
Ciao a tutti,

Ho un paio di problemini con il programma, dal mio fisso eseguo il test01.py e ho tutti riscontri positivi in 6 secondi.

Appena invece ho caricato il file nella apposita schermata qui, ho ottenuto un risultato abbastanza deludente, non tanto per la complessita' ciclomatica ma proprio i test passati sono soltanto 10 e gli altri errati a causa Timeout.

Sono consapevole che la macchina di correzione e' un po' lenta ma volevo capire come riuscire ad ottimizzare ancora meglio il codice.

Il "rallentamento", secondo me e' dovuto alla funzione per trovare i quadrati, al momento ricerco all' interno della griglia che ho creato ,il lato, nelle varie posizioni. Qualcuno ha dei consigli per ottimizzare questo passaggio?
692 views

9 Answers

A
Alessiorevo (1730 points)
6 6 14
answered Dec 1, 2019 by Alessiorevo (1,730 points)
Il controllo dei quadrati devi farlo con una funzione sola e non con 2 dove una controlla i lati orizzontali e una quelli verticali, poi ti consiglio di trovare all'inizio il salto tra un punto verde e l'altro così da sapere già la posizione dei punti verdi....
Simone.A (3750 points)
13 16 26
commented Dec 1, 2019 by Simone.A (3,750 points)
Ma consigli di usare un While?
s
simone.lioy (1420 points)
23 30 39
commented Dec 1, 2019 by simone.lioy (1,420 points)
io invece ho analizzato ogni punto verde con due for annidati e controllando ogni possibile segmento, se è formato da due segmenti allora è un lato del quadrato e mi sposto di k posizioni avanti però ora sono arrivato al punto di confronto e sono bloccato
A
Alessiorevo (1730 points)
6 6 14
commented Dec 1, 2019 by Alessiorevo (1,730 points)
È meno performante rispetto a un for, rallenterebbe solo
s
simone.lioy (1420 points)
23 30 39
commented Dec 1, 2019 by simone.lioy (1,420 points)
eh lo so ma non ho altre soluzioni in mente e tra l'altro non mi esce nemmeno
AlessandraIzzo (6010 points)
6 6 30
commented Dec 2, 2019 by AlessandraIzzo (6,010 points)
Fonte della lentezza del while rispetto al for..?
a
a.pietroluongo (11250 points)
15 38 131
commented Dec 2, 2019 by a.pietroluongo (11,250 points)
edited Dec 2, 2019 by a.pietroluongo

Penso che il for è leggermente più veloce quando ad esempio hai una variabile a e utilizzi range(a) mentre nel while hai una condizione  c<a  ed  incrementi c di 1 ogni volta.

a
a.pietroluongo (11250 points)
15 38 131
answered Dec 1, 2019 by a.pietroluongo (11,250 points)
Forse stai controllando ogni pixel di ogni segmento, basta che controlli un pixel per ogni segmento
Antares (7770 points)
5 6 41
answered Dec 2, 2019 by Antares (7,770 points)
Se non l'hai già implementato uno dei sistemi migliori per velocizzare questo homework è di non controllare ogni pixel ma solo i pixel compresi nel range della lunghezza del lato del quadrato che si sta cercando. Ho sentito dire in chat da un ragazzo che è riuscito a passare alcuni test sostituendo i while con i cicli for, ma non ti posso confermare.
J
Jan Rogala (7260 points)
3 4 37
answered Dec 2, 2019 by Jan Rogala (7,260 points)
Intanto il solito consiglio di metterti da una parte con carta e penna e fare passo passo quello che fa il codice, dovrebbe aiutarti a vedere se ci sono certi passaggi che sono migliorabili o addirittura inutili. Un altro è come ha consigliato il collega di trovarti la distanza tra i vari pixel verdi e saltare a sto punto da un pixel verde a un'altro. Fatto cio non ci sarà piu bisogno che ti chiedi che il pixel sai verde perchè lo sai gia. Cosi facendo solo nel primo test ti risparmi 4/5 del tempo dato che farai un controllo ogni 5 pixel. Dato che sai la distanza da un pixel verde ad un altro sai anche di quanti pixel è corrisposto un lato, di conseguenza puoi metterla come fine di un for. Spero di esserti stato utile
Tommaso Sgroi (12990 points)
6 11 91
answered Dec 2, 2019 by Tommaso Sgroi (12,990 points)
Basta semplicemente guardare il primo bit successivo ai tuoi pixel verdi se è rosso o nero,  salta tra un pixel e un altro usando la larghezza tra 2 pixel verdi e usa le coordinate del pixel verde in alto a sx e in basso a dx per iterare su 2 for e trovare i quadrati.
Un'altra cosa, non so se te fai così o meno, ma non c'è alcun bisogno di rimodellare la griglia. È una perdita di tempo (giusto in caso lo facessi).
P
Paoletto (1010 points)
3 4 8
answered Dec 2, 2019 by Paoletto (1,010 points)
Ti conviene scorrere solo UNA volta l'immagine per intera,popolando una matrice vuota di volta in vta contente le coordinate dei verdi alla fine,e controllare per ognuna di esse la presenza di pixel rossi subito dopo,nel caso delle colonne,o subito giu nel caso delle righe.
D
DanieleZobel (600 points)
4 4 7
answered Dec 2, 2019 by DanieleZobel (600 points)
Cerca di controllare solo la griglia, di controllare il pixel successivo al pixel verde, e usare solo i for.

In questo modo dovresti minimizzare al massimo i tempi
a
andreaamici (1740 points)
9 12 21
answered Dec 2, 2019 by andreaamici (1,740 points)
il mio consiglio è in primis quello di non cercare dentro la griglia ma semplicemente capire quanto è grande questa griglia(in modo da evitare di andare out of range),il 'ritagliare la griglia porta via del tempo utile...inoltre ti suggerisco di scrivere i tutto in una funzione,in molti fanno una funzione per andare in orizzontale e un per andare in verticale..si puoò benissimo riuscire a scrivere tutto insieme..
Franciscus (4830 points)
5 6 16
answered Dec 2, 2019 by Franciscus (4,830 points)
Ti consiglio di controllare solo il bit immediatamente successivo al bit verde, controlli se è rosso o nero; forse questo ti risparmia un pò di tempo sui controlli che fai.