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

Do you need help?

Migliorare es 2 HW 4

a
alessio.palma (1480 points)
9 36 56
in Info sul corso e sugli esami by (1.5k points)
edited by
Il test 9 dell'es 2 dell'HW 4 mi va in timeout di pochi centesimi di secondo (il risultato è corretto). Qualche consiglio?

EDIT: è strano che questo ultimo test sia così lento, mi riferisco a quello dei primi 12 interi pari. Ho provato con i primi 11 interi pari e il tempo è di circa 7 volte piu veloce, non capisco come mai aggiungendo un numero si rallenti cosi tanto
752 views

1 Answer

_andrea_ (45670 points)
11 42 297
by (45.7k points)
Sarebbe utile sapere come lo fai prima di consigliarti
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
Prendo la stringa in input, ne faccio la lista di numeri(numeri come stringe) e poi la passo ad una funzione
ricorsiva che crea l'albero di gioco come chiesto dalla descrizione dell'esercizio. Se ogni coppia di numeri ha la
somma pari essa viene sostituita dalla media dei due elementi. La funzione ricorsiva si ferma quando
la lista in input ha un solo elemento oppure quando la somma di tutte le coppie è dispari.
Per verificare che la somma delle coppie sia dispari uso una piccola funzione ausiliaria. Nella funzione ausiliaria
la lista viene passata in input e viene creata una variabile booleana che inizialmente è None. La variabile diventa True
se tutte le coppie danno somma dispari, False se almeno una coppia da somma pari. Alla fine elimino i doppioni
dalla lista delle configurazioni finale trasformandola in insieme e poi di nuovo in lista, e la ordino come chiesto.
Per ordinarla prima considero la lunghezza degli elementi della lista splittati(poichè ho solo stringhe nella lista) e poi
passo la stringa splittata ad un'altra funzione ausiliaria che crea una lista di interi al posto delle stringhe, ed ordino
in modo crescente in base alle liste di interi. Alla fine ritorno la lista di stringhe ordinate
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Quindi lavori ricorsivamente su una lista di stringhe, quindi chiami sempre la funzione int su ogni numero giusto?
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
esattamente, chiamo int varie volte per sommare gli elementi della lista a due a due(che sono numeri camuffati da stringhe)
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Lavora su liste di numeri invece che su stringhe così non devi convertirli tante volte. Ottieni la lista splittata, trasformala in interi, lavora su quella e poi riconverti tutto in stringhe
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
va bene adesso provo, per ritrasformare tutto in stringhe cosa consigli? Join non funziona se la lista contiene interi
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Con list comprehension oppure map
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
aggiustato, tempi dimezzati, grazie grande!
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Addirittura dimezzati, non pensavo così tanto
a
alessio.palma (1480 points)
9 36 56
by (1.5k points)
anche io non credevo che chiamare int e str un po di volte pesasse molto. In effetti il "po" di volte in cui le chiamavo non erano cosi poche. Comunque per il settimo test da 0.20s a 0.11s, per l'ottavo da >3.0s a 1.8 s
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Buono a sapersi
R
RigelsHysaj (1550 points)
8 36 50
by (1.6k points)
se tu fai un ciclo for per provare tutti i numeri consecutivi  e poi un if dentro il for per vedere se i due numeri consecutivi hanno somma pari, a questo punto basta mettere un booleano dentro l'if per capire se la lista contiene almeno due numeri consecutivi di cui la somma è pari. Altrimenti se non entra nel if nessuna coppia ha somma pari. Cosi non devi chiamare un'altra funzione.