Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 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 2023-24 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.

Soluzioni più efficienti esercizio 3

v
val9 (9770 points)
6 30 53
in Es3 by (9.8k points)
closed by

Buongiorno, 

mi chiedevo se ci fossero dei metodi più efficienti per risolvere l'es3 senza dover scorrere tutto il testo, parola per parola, e senza dover utilizzare count() o find()  (che a mio avviso possono essere delle funzioni rischiose).

Grazie smiley

999 views
closed with the note: answered

2 Answers

Best answer
Xriuk (13590 points)
8 24 116
by (13.6k points)
selected by

Non puoi fare affidamento su count o find perchè rischi di conteggiare parole sbagliate (caso: "lucenavelanavelanaveelica" con lista ['ala','cena','elica','nave','luce','lana','vela'], la parola cena evidenziata sta a metà di due parole e non è valida).

L'unica soluzione (a mio avviso) è scorrere tutto il testo, ma per farlo c'è modo e modo, ad esempio potresti saltare alcune iterazioni in base alla lunghezza delle parole.

Poi dipende anche come fai il controllo sul testo con la lista delle parole.

v
val9 (9770 points)
6 30 53
by (9.8k points)
Io scorro il testo, confrontando parola per parola con la porzione di testo che prendo  fino alla lunghezza della parola. Il problema è che risulta fin troppo lento.
Xriuk (13590 points)
8 24 116
by (13.6k points)
E se controlli direttamente se la porzione di testo che prendi è nella lista? Così dovrebbe essere più veloce
v
val9 (9770 points)
6 30 53
by (9.8k points)
Teoricamente non impiegherei meno tempo a confrontare ogni parola della lista con la porzione di testo avente stessa lunghezza della parola?
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Quanto ci mette il tuo programma a finire tutti i test usando questo metodo?
v
val9 (9770 points)
6 30 53
by (9.8k points)
5532.71, però non posso accettarlo in quanto non riesco a passare l'ultimo test se provo a ridurre l'intricatezza spezzando il programma in più funzioni
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Strano che ci metta così tanto. Evidentemente l'hai usati nel modo sbagliato. In teoria usando quei metodi potresti arrivare a meno di 1s. Comunque prova a trovare un modo che usi le slice, e senza usare count che potrebbe sbagliare
v
val9 (9770 points)
6 30 53
by (9.8k points)
Io infatti ho usato solo lo slicing. Il problema è che se usassi count o find verrebbero contate anche parole che non dovrebbero essere contate, ad esempio in "lanavela" rischierei di ritrovarmi anche "nave"...
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ah e allora se hai fatto slicing devi solo concentrarti a migliorare quello e basta. Non so se esistono altri modi oltre allo slicing e a quello con count e find
a.capobianco1 (16770 points)
14 54 165
by (16.8k points)
Nella traccia c'è scritto che nessuna parola è prefisso di altre...
v
val9 (9770 points)
6 30 53
by (9.8k points)
Con lo slicing sono comunque costretta a scorrere il testo dall'inizio alla fine. Confrontando parola per parola ci impiega molto,  per cui non saprei proprio dove migliorare :(
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Io sono riuscito ad abbassare lo slicing fino a 2,8s, ho usato un controllo che verifica se le parole hanno tutte la stessa lunghezza
v
val9 (9770 points)
6 30 53
by (9.8k points)
Si, è vero, ma se utilizzassi find e count su "lucenave" per trovare "nave" non mi darebbe errore.... :S
v
val9 (9770 points)
6 30 53
by (9.8k points)
In teoria, anche controllando la lunghezza non dovresti ripetere ugualmente i confronti con tutte le parole che iniziano con una certa lettera? :|
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Dipende da come utilizzi lo slicing. Se fai in modo di non controllare mai due volte la stessa slice non c'è problema
v
val9 (9770 points)
6 30 53
by (9.8k points)
Cosa intendi per controllare due volte? Dopo aver confrontato in base alla lunghezza, e trovata la parola, io passo a cercare quella che si trova nella porzione successiva. :|
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Anche io faccio così, stesso identico modo
v
val9 (9770 points)
6 30 53
by (9.8k points)
allora non capisco proprio dove sia il problema :(
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Eh bisognerebbe vedere il tuo codice ma non posso ovviamente, magari hai fatto qualche operazione inutile da qualche parte, o cicli poco ottimizzati