[HOMEWORK] Homework 2 obbligatorio

andrea.sterbini (160900 points)
448 849 1643
asked Oct 27 in Avvisi by andrea.sterbini (160,900 points)
edited Nov 5 by andrea.sterbini

ATTENZIONE:

  • eventuali correzioni verranno inserite qui, tenete d'occhio questa pagina
    • come segnalato sotto da @Wahya, nel 4° esempio c'è un refuso (ma la graduatoria nel testo è corretta)
      • Alla fine 0 ha 0 sfide, 1 ha 1 sfida e 2 ha 2 sfide ( 1 ha 2 sfide e 2 ha 1 sfida), per cui
    • NON modificate il contenuto degli argomenti. Ho aggiunto un test per far fallire queste modifiche.
    • NOTATE che mi sono dimenticato di togliere il warp-factor 2 dai test che vi ho dato nello ZIP, e che doveva essere applicato SOLO alla VM. Quindi sulle vostre macchine che girano molto più veloci avete un timeout di 12s invece che 6s. Per "giocare alla pari" dovreste togliere il *2 all'inizio di test_01.py
  • NOTA: per eseguire i test SENZA i controlli e il timeout modificate test_01.py settando la variabile DEBUG=True
  • NOTA: ricordo a tutti che verranno applicati dei test segreti, quindi ogni soluzione che sfrutta particolari condizioni presenti nei test pubblicati potrebbe fallire.

Istruzioni

Per svolgere l'homework:

  • Installate le librerie necessarie (COMPRESO stopit)
  • Scaricate il file HW2-req.zip e scompattatelo in una directory
    • Lo zip contiene
      • l'esercizio da svolgere, descritto all'inizio del file program01.ita.py (in italiano) oppure program01.eng.py (in inglese)
        • l'esercizio consiste nel realizzare, se necessario definendo funzioni ausiliarie, la funzione descritta all'inizio del file, completandone il codice
      • altre librerie e file necessari a eseguire i test sulla vostra macchina
  • Posizionatevi nella directory creata unzippando l'archivio e rinominate il file program01.ita.py con il nome program01.py
  • Editate i file:
    • program01.py implementando le funzioni necessarie a risolvere l'esercizio
    • algorithm.txt  in cui descrivete l'algoritmo utilizzato (senza inserire codice o info che vi possano identificare)
  • ATTENZIONE: il programma NON DEVE eseguire nessun input() o print(), infatti riceve tutte le informazioni di cui ha bisogno tramite i parametri della funzione che dovete completare e torna il risultato con return.
  • ATTENZIONE: SONO VIETATE le variabili globali.
  • ATTENZIONE: SONO VIETATE tutte le altre librerie a parte quelle già importate nel testo.
  • ATTENZIONE: i vostri programmi NON DEVONO sfruttare eventuali periodicità o caratteristiche strutturali degli input, ma devono essere applicabili a qualsiasi input valido.
  • ATTENZIONE: NON LASCIATE ISTRUZIONI DI TEST NEL PROGRAMMA, A MENO CHE NON SIANO DOPO UNA RIGA
    • if __name__ == '__main__':
      • vostre istruzioni di test che in questo modo non vengono eseguite durante l'import del file
  • Per eseguire i test
    • aprite una finestra "Anaconda Prompt" e posizionatevi nella directory ottenuta scompattando lo zip
    • eseguite il comando
      • pytest test_01.py -v -rA
    • oppure (con una stampa dei tempi impiegati per eseguire ciascun test)
      • pytest test_01.py -v -rA --durations 0
    • oppure (CON stampa dei tempi spesi dal programma nelle 20 funzioni complessivamente più lente)
      • pytest test_01.py -v -rA --profile
    • Per far fermare i test al primo errore aggiungete l'opzione -x
    • Per chi usa Spyder 4: (Spyder 5 non è ancora supportato dai plugin)
      • è possibile eseguire i test direttamente da dentro Spyder installando il plugin spyder-unittest (ma senza timeout o parametri aggiuntivi)
      • è possibile ottenere i tempi spesi in ciascuna funzione direttamente da dentro Spyder installando il plugin spyder-line-profiler

NOTA: per aprire i file di testo in formato utf8 NON usate Notepad che non riconosce gli accapi Unix ('\n') ma usate Spyder o Notepad++

Scadenze

  • Prima scadenza per TUTTI: ore 23:59 del 6/11/21 (consegnate entrambi i file)
  • Il giorno seguente vi verranno assegnati 3 algoritmi anonimi da valutare entro le 23:59 del 8/11/21
  • Una volta ricevuti i suggerimenti dai compagni, dopo averli valutati tutti, potrete riconsegnare un programma migliore entro le 23:59 del 10/11/21

Dovrete consegnare entrambi i file:

  • program01.py
  • algorithm.txt (file di testo utf8, usate Spyder o Notepad++)

La pagina di consegna è https://q2a.di.uniroma1.it/homeworks/delivery?homework=2

Potete consegnare più volte, vale l'ultima.

12 Answers

D
Davide Vittucci (550 points)
2 4 6
answered Oct 27 by Davide Vittucci (550 points)
Se non consegnassi entro il 6/11 sarei escluso dalla riconsegna o posso fare un'unica consegna entro il 10?
andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
La prima che hai detto
P
Pietroos (4800 points)
3 6 8
answered Oct 27 by Pietroos (4,800 points)
Va consegnato obbligatoriamente il file .txt?
anaran (4910 points)
2 4 26
commented Oct 27 by anaran (4,910 points)
reshown Oct 27 by anaran
Si è obbligatorio; con dentro spiegato l'algoritmo da te implementato, a parole.
andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
Certamente.             .
A
Alessio (600 points)
1 2 5
answered Oct 27 by Alessio (600 points)

Ma nel file algorithm.txt dobbiamo descrivere l'algoritmo a parole spiegando i passaggi effettuati? 

 

andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
Esatto                   .
f
fraa.dap (790 points)
2 3 6
answered Oct 27 by fraa.dap (790 points)
Posso utilizzare il pacchetto Itertools di Python all'interno del programma?
andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
Leggi meglio le istruzioni
Wahya (4790 points)
1 2 12
answered Oct 27 by Wahya (4,790 points)

Nel quarto esempio della consegna c'è un refuso :
" La sfida 0, 1 è vinta da 1 per 4 punti a 0.
        La sfida 0, 2 è vinta da 2 per 3 punti a 1.
        La sfida 1, 2 è vinta da 1 per 3 punti a 1.
        Alla fine 0 ha 0 sfide, 1 ha 1 sfida e 2 ha 2 sfide
( 1 ha 2 sfide e 2 ha 1 sfida), per cui
        la classifica finale sarà [1, 2, 0]."

La classifica finale è giusta, lo scrivo per evitare che qualcuno impazzisca con i ragionamenti per capire cosa non vada nell'esempio.

andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
Grazie per la segnalazione, lo riporto sopra
T
TommasoBruni (700 points)
5 11 15
answered Oct 27 by TommasoBruni (700 points)
Buonasera professore,

le descrizione dell'algoritmo deve essere fatta sia in italiano che in inglese, oppure va bene solo in italiano?

Grazie.
andrea.sterbini (160900 points)
448 849 1643
commented Oct 27 by andrea.sterbini (160,900 points)
Se consegni qui meglio in italiano
_
__Michele__25 (340 points)
0 0 2
answered Oct 28 by __Michele__25 (340 points)
Buonasera professore,

è possibile utilizzare la funzione zip dato che non fa parte di nessuna libreria esterna?

Grazie
andrea.sterbini (160900 points)
448 849 1643
commented Oct 28 by andrea.sterbini (160,900 points)
certo                      .
a
a.pomella (380 points)
0 0 3
answered Nov 4 by a.pomella (380 points)
Buona sera Professore.

Scusatemi ma sto impazzendo. Sul mio PC il test01.py da Anaconda Prompt completa tutti i 16 test con successo. Invece vedo che il risultato dei test effettuati sul file che ho inviato sono falliti su 3 test. Dato che ho visto che i file di dati, almeno dal nome, sembrano essere esattamente quelli scaricati con l'esercizio, potrei sapere come capire meglio anche dal log visibile nella pagina dei risultati cosa può essere fallito? Mi indica infatti una riga in particolare dove ho usato la funzione abs() ma a parte il fatto che non ho importato alcuna libreria, la stessa istruzione viene passata anche dagli altri 13 test, quindi non capisco cosa c'è che non va.

Possibile che il problema sia causato dal fatto che sto utilizzando un PC Windows 10?

Grazie
andrea.sterbini (160900 points)
448 849 1643
commented Nov 4 by andrea.sterbini (160,900 points)
ma che la VM è 2 volte più lenta non l'avete ancora capito?
S
S3b4stian82 (2060 points)
3 6 24
commented Nov 4 by S3b4stian82 (2,060 points)
Prof, non so su cosa giri la VM, ma le assicuro che viaggia più spedita del mio Ryzen 5 5600X
a
a.pomella (380 points)
0 0 3
commented Nov 5 by a.pomella (380 points)

Sì sì, è ben chiaro. Infatti ho modificato anche test01.py impostando il timeout sia a 1 sia a 24 ma in ogni caso mi passa tutto.

Era solo per capire come interpretare il seguente mesaggio in modo tale che posso cercare di correggere qualche errore che mi sfugge; mi sembra infatti che accada qualcosa nella parte in cui eseguo un if di un abs(ord(a)-ord(b)) ma non riesco a capire cosa sbaglio, dato che in 13 test su 16 questa istruzione passa e soprattutto dato che lo stesso test sulla mia macchina va; a questo punto credo sia un problema di environment di esecuzione suppongo. Comunque se fosse possibile o se qualcuno può aiutarmi riporto qui sotto (spero di non infrangere alcuna regola di comportamento) il testo della failure se fosse già capitato a qualcuno:

test_01.py=134= 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test_01.py=33= in do_test
    result = program.ex(matches2, k)
program01.py=109= in ex
    confronto = confronta_pulite(strA, strB, k)
program01.py=193= in confronta_pulite
    if abs(ord(a) - ord(b)) <= k=
/home/andrea/miniconda3/lib/python3.8/site-packages/pytest_timeout.py=444= in write_title
    width = py.io.get_terminal_width()
/home/andrea/miniconda3/lib/python3.8/site-packages/py/_vendored_packages/apipkg/__init__.py=152= in __makeattr
    result = importobj(modpath, attrname)
/home/andrea/miniconda3/lib/python3.8/site-packages/py/_vendored_packages/apipkg/__init__.py=72= in importobj
    module = __import__(modpath, None, None, ['__doc__'])
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

args = ('py._io.terminalwriter', None, None, ['__doc__']), kargs = {}
name = 'py._io.terminalwriter', rest = [None, None, ['__doc__']]

    def _check_import(*args, **kargs)=
        name, *rest = args
        if name in forbidden or (not forbidden and name not in allowed)=
            print(f"Importing {name} (globals, locals, {rest[-2=]}) (not allowed)")
>           raise ForbiddenError(f"The import of '{name}' is forbidden")
E           testlib.ForbiddenError= The import of 'py._io.terminalwriter' is forbidden

testlib.py=44= ForbiddenError
andrea.sterbini (160900 points)
448 849 1643
commented Nov 5 by andrea.sterbini (160,900 points)
E' un timeout  ...... ma pytest vuole stampare il messaggio in rosso e importa terminalwriter
a
a.pomella (380 points)
0 0 3
commented Nov 5 by a.pomella (380 points)
Perfetto, grazie mille. Mi concentro sui tempi di esecuzione allora. Grazie mille
e
ec22 (340 points)
0 0 2
answered Nov 5 by ec22 (340 points)
reshown Nov 5 by ec22
Ieri pomeriggio, facendo delle prove e cercando di abbassare il tempo di esecuzione ho caricato un codice variando qualcosina. Come risultato però ho avuto un aumento di circa due secondi sull'efficienza. A quel punto ho tolto le modifiche ed ho ricaricato lo stesso codice che c'era in precedenza e nonostante ciò, il codice risulta nuovamente 2 secondi più lento (sono sicuro di aver ricaricato lo stesso codice).
Exyss (15330 points)
0 0 59
commented Nov 5 by Exyss (15,330 points)
Da quanto sembra la vm è un po' sotto stress perché stanno tutti consegnando questi ultimi giorni, quindi è normale ottenere 1-2 secondi in più
anaran (4910 points)
2 4 26
commented Nov 5 by anaran (4,910 points)
edited Nov 5 by anaran
Anche a me è successo, ho perso il bonus su efficienza
a
a.pomella (380 points)
0 0 3
answered Nov 8 by a.pomella (380 points)
Scusate,

ma nel peer-assesment, i suggerimenti li riceveremo dalle 00.00 del 09/11 dopo che avremo risposto a tutti gli esercizi assegnati oppure è possibile visualizzarli prima? In quest'ultimo caso posso chiedervi dove si vedono?

Grazie
E
EricaF (560 points)
1 2 4
commented Nov 8 by EricaF (560 points)
Li puoi trovare, se sono stati fatti, in Course –> Results —> Feedback.
a
a.pomella (380 points)
0 0 3
commented Nov 8 by a.pomella (380 points)
E' in queste occasioni che mi rendo conto di essere veramente cieco.....grazie mille