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.

Chiarimenti test segreti HW4 (timeout)

Mich1803 (2620 points)
14 40 58
in HW4 by (2.6k points)
Ho appena consegnato l’hw4 di recupero, ma ho un tempo di esecuzione altissimo rispetto alla media. È possibile che nei test segreti io vada in timeout oppure è completamente da escludere?

3 Answers

L
Larenzz03 (5990 points)
3 14 65
by (6.0k points)
Non so se sia per i test segreti(ma ne dubito, non li avresti passati tutti altrimenti). Per il tempo di esecuzione avevo lo stesso problema per l’hw8. Il mio programma era molto lento quindi ho utilizzato @profile su spyder e identificato le parti del programma più lente per migliorarle. Non so se l’hai già fatto. prova a vedere in questo modo se ci sono parti del programma che puoi migliorare cosicché esegua più velocemente i test
Ionut Cicio (5960 points)
2 2 43
by (6.0k points)
edited by

Il suggerimento principale che ti posso dare per l'HW4 recupero è quello di "usare le struttre dati opportune". Per esempio, convertire una tabella da lista a dizionario ti potrebbe essere utilissimo!
Per esempio, consideriamo

def studenti_brillanti(dbsize):

Ti potrebbe servire un dizionario in cui la chiave è il stud_code e il valore sono il resto degli attributi dello studente (perché l'operazione di controllo degli attributi dello studente si fa spessissimo in quella funzione, è utile farla in O(1), piuttosto che cercare in una lista) con una dict comprehension.

In altri casi ti potrebbe essere utile vedere i dati come liste. Dipende tutto dall'operazione che devi fare, e in base a quella decidi di cambiare la struttura dei tuoi dati nel modo opportuno (questo HW oltretutto è l'occasione perfetta per usare list comprehension) 

Ti consiglierei anche di vedere qual'è il test che ti richiede più tempo e lavorare su quello wink. E, mi raccomando, se il codice diventa troppo grosso o intricato, prova a semplificarlo prima di procedere (conoscere SQL aiuta molto in questo HW)

Nota su SQL e il paradigma funzionale...

Visto che siamo in tema database, c'è da far notare come SQL si rapporti ai linguaggi di programmazione moderni, partendo da un esempio (totalmente scollegato dall'HW):

SELECT fornitore, importo_fattura
FROM fatture
WHERE importo_fattura > 10.000

Quello che è interessante è il fatto che si può mappare questo codice SQL in un qualunque linguaggio moderno... prendiamo l'esempio di JavaScript... il codice si potrebbe tradurre in questo modo: 

fatture
    . filter((fattura) => fattura.importo_fattura > 10.0)
    .map((fattura) => [fattura.fornitore, fattura.importo_fattura])

Questa caratteristica dei linguaggi moderni di implementare funzioni tipiche del paradigma funzionale (filter, map, sum, iter, collect, reduce etc..) è quella che permette di manipolare dati in maniera facile e veloce. Python ha anche altri strumenti in più rispetto a JavaScript, per dire: le list comprehension per iterare, le dict comprehension per raggruppare, gli "if" dentro alla list comprehension per filtrare, etc... sono tutti strumenti potentissimi per la manipolazione di dati che si rifanno in parte anche ad SQL.

L'esempio più interessante è quello del parametro "key=" per funzioni come sortminmax etc... perché si ispira direttamente ad SQL (come spiega il creatore di "key=" https://www.youtube.com/watch?v=OSGv2VnC0go al minuto 10:00). Di fatto, in SQL l'operazione di "ordinamento" con ORDER BY (specificando gli "attributi" su cui ordinare) è comunissima. Infatti, in Python si è deciso proprio di usare questa strategia per il "sorting": al parametro "key=" si specifica una funzione che genera una tupla con gli attributi, oppure il valore di uno specifico attributo, che poi Python userà per paragonare gli elementi della lista fra di loro. Questa caratteristica è interessante perché distingue Python da linguaggi come C++, in cui per l'ordinamento viene specificata una funzione che ritorna -1, 0 o 1 paragonando due elementi della lista.

Prima ho nominato JavaScript, e non a caso: nei tempi più recenti si tende a passare da DB (database) relazionali (che usano SQL, e hanno una struttura rigida) a DB NoSQL che sostanzialmente memorizzano file JSON (proprio come nel caso dell'HW4 recupero)... quindi quello che si fa quando si lavora su un sito è caricare i file JSON per interi, e si filtrano e manipolano i dati nel codice in base a quello che l'utente clicca sul sito (senza chiederli al DB già filtrati). Il vantaggio è che i dati vengono caricati una volta (con il metodo vecchio che si usa ancora con PHP, ogni volta che si cliccava qualcosa sulla pagina web, era necessario caricare i dati specifici che bisognava visualizzare). Chiaramente, esistono soluzioni ibride in base alla necessità (e a quanto si vuole spendere per il server nel back-end).

andrea.sterbini (208020 points)
756 1270 2377
by (208k points)

Non postate codice angry

Shangry_ (9930 points)
7 25 76
by (9.9k points)
se uno dei test segreti va in timeout, ti toglie dei punti, se nella valutazione dell'homework hai tutti e 30 i punti (dati se si superano tutti i test) vuol dire solo che è lento.

Non so come funzioni l'implementazione dei test segreti sull'homework di recupero, su quelli con la deadline, vengono implementati dopo che il codice non poteva più essere uploadato, in ogni caso puoi vedere se tutti i test sono passati, ti basta cliccare qui: https://q2a.di.uniroma1.it/homeworks/visualize?homework=10&code=2046078 e cliccare prima su 'results' in alto, poi 'correttezza' in basso.

in quella sezione della pagina dovrebbero esserci tutti i test, da lì puoi vedere quali ti passa e quali no.